Spring的两种基础配置
1.Spring概述
Spring发展主要有三个阶段:
① xml阶段(Spring 1.x时代):此时使用Spring开发满眼都是xml配置的Bean,这样在随着项目的扩大时,就需要把不同的xml配置文件分放到不同的配置文件中去。这样导致了在开发过程中,需要频繁地在开发的类和配置文件中切换。
② 注解配置(Spring 2.x时代):随着JDK1.5带来的注解支持,Spring提供了声明Bean的注解(如@Component、@Service),大大减少了配置量。此时在Spring圈子就存在着一种争论:注解配置和xml配置究竟哪个更好?我们最终的选择是应用的基本配置(如数据库配置)用xml,业务配置用注解。
③ Java配置(Spring 3.x时代至今):Spring提供了Java配置的能力,使用Java配置可以让你更理解你配置的Bean。我们目前刚好处于这个时代,Spring 4.x和Spring Boot都推荐使用Java配置。
下面我们就针对注解配置和Java配置,通过具体实验来熟悉其区别和联系。
2.新建项目
① 首先我们打开任意支持开发Maven项目的编译器(我选用的是界面简洁、提示丰富的IDEA),然后点击"File -> New -> Project",如下:
② 点击"Maven -> Next"后,在上面选择你的所需要建立的项目的存储位置,并且输入你的项目名(如:SpringStudy),然后点击"Finish"即可完成项目的创建。
3.配置pom.xml
在点击"Finish"后,会出现"pom.xml"的界面,我们在其中录入以下内容:
代码如下:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
4.注解配置(依赖注入)
接着我们在"src/main/java"里面建立一个包"com.study.spring.ch1.Dependencyconfig"。然后在这个包里面建立4个类,结构如下图所示:
下面分别实现这4个类:
首先是类FunctionService,其内容如下:
package com.study.spring.ch1.Dependencyconfig;
import org.springframework.stereotype.Service;
@Service //声明当前类是一个由Spring管理的Bean
public class FunctionService { //编写功能类Bean
public String sayHello(String word){
return "Hellow " + word + "!";
}
}
然后是类UseFunctionService,其内容如下:
package com.study.spring.ch1.Dependencyconfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service //声明当前类是一个由Spring管理的Bean
public class UseFunctionService { //测试功能类Bean
@Autowired //通过@Autowired注解,将FunctionService实体注入当前类中
FunctionService functionService;
public String SayHello(String word){
return functionService.sayHello(word);
}
}
再接着是配置类DependencyConfig,内容如下:
package com.study.spring.ch1.Dependencyconfig;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration //声明当前类是一个配置类
@ComponentScan("com.study.spring.ch1.Dependencyconfig") //使用@ComponentScan注解自动扫描包名下所有使用@Service、@Component、@Repository和@Controller的类
public class DependencyConfig { //配置类
}
最后是测试主类Main,内容如下:
package com.study.spring.ch1.Dependencyconfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main { //测试主类
public static void main(String[] args){
//使用AnnotationConfigApplicationContext作为spring的容器(需要接受一个配置类作为参数)
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DependencyConfig.class);
//获得已经配置好了的Bean
UseFunctionService useFunctionService = context.getBean(UseFunctionService.class);
System.out.println(useFunctionService.SayHello("the dependency config bean"));
context.close();
}
}
最后我们在Main中运行,得到的效果如下:
5.Java配置
同样地,这里我们在"src/main/java/com/study/spring/ch1"下再新建一个包"Javaconfig"。然后再在这个包里面建立4个类,结构如下图所示:
这4个类的内容如下:
首先是类FunctionService,其内容如下:
package com.study.spring.ch1.Javaconfig;
public class FunctionService { //定义一个未使用@Service声明的Bean
public String sayHello(String word){
return "Hellow " + word + "!";
}
}
然后是类UseFunctionService,其内容如下:
package com.study.spring.ch1.Javaconfig;
public class UseFunctionService { //定义一个未使用@Service声明的Bean
FunctionService functionService; //定义一个未使用@Autowired注解注入的Bean
public void setFunctionService(FunctionService functionService){
this.functionService = functionService;
}
public String SayHello(String word){
return functionService.sayHello(word);
}
}
接着是配置类JavaConfig,其内容如下:
package com.study.spring.ch1.Javaconfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration //使用@Configuration注解表明当前类是一个配置类,此处没有进行包扫描是因为所有的Bean都在此类中定义了
public class JavaConfig {
@Bean //使用@Bean注解声明当前方法返回值是一个Bean,Bean的名称是方法名,下同
public FunctionService functionService(){
return new FunctionService();
}
@Bean
public UseFunctionService useFunctionService(){
UseFunctionService useFunctionService = new UseFunctionService();
useFunctionService.setFunctionService(functionService());
return useFunctionService;
}
}
最后是测试主类Main,内容如下:
package com.study.spring.ch1.Javaconfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main { //测试主类
public static void main(String[] args){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
UseFunctionService useFunctionService = context.getBean(UseFunctionService.class);
System.out.println(useFunctionService.SayHello("the java config bean"));
context.close();
}
}
最后我们在Main中运行,得到的效果如下:
6.总结
上面的两种配置方式:
依赖注入侧重于在各个基础类中,通过@Service、@Component、@Repository和@Controller来将其注册为Bean,而忽略了在配置类中进行大量的配置;
而Java配置则侧重于在最终的配置类中单独配置,从而减轻了在各个类中的配置。
转载:https://blog.csdn.net/the_ZED/article/details/105307052