Spring配置方式
第一阶段:xml配置
在spring 1.x时代,使用spring开发满眼都是xml配置的bean,随着项目的扩大,
我们需要把xml配置文件分放到不同的配置文件中,那时候需要频繁地在开发的类和配置文件间切换。
第二阶段:注解配置
在spring 2.x时代,随着JDK1.5带来的注解支持,spring提供了声明bean的注解,
大大减少了配置量。这时spring圈子存在一种争论:注解配置和xml配置究竟哪个更好?我们最终的选择是应用
的基本配置用xml,业务配置用户注解。
第三阶段:Java配置
从spring 3.x到现在,spring提供了Java配置的能力,使用Java配置更好的理解
配置的bean。spring 4.x和spring boot都推荐使用Java配置。
Java配置
Java配置通过@Configuration和@Bean来实现。
- @Configuration声明当前类是一个配置类,相当于一个spring配置的xml文件
- @Bean注解在方法上,声明当前方法的返回值为一个Bean。
示例
1. 编写一个功能类的Bean
public class FunctionService{
public String sayHello(String word){
return "hello "+ word + " !";
}
}
此处没有使用@Service声明为Bean
2. 使用功能类的Bean
// 1
public class UseFunctionService{
@Autowired // 2
FunctionService functionService;
public void setFunctionService(FunctionService functionService){
this.functionService = functinService;
}
public String SayHello(String word){
return functionService.sayHello(word);
}
}
代码解释
- 此处没有使用@Service声明Bean
- 自动注入Bean
3. 配置类
@Configuration // 1
public class JavaConfig{
@Bean // 2
public FunctionService functionService(){
return new FunctionService();
}
@Bean
public UseFunctionService useFunctionService(){
UserFunctionService useFunctionService = new UseFunctionService();
useFunctionService.setFunctionService(functionService()); // 3 为UseFunctionService注入functionService
return useFunctionService;
}
}
代码解释
- 使用@Configuration注解表示当前类是一个配置类,这意味着这个类里可能有0个或者多个@Bean注解,此处没有使用包扫描,是因为所有的Bean都在此勒种定义。
- 使用@Bean注解声明当前方法FunctionService的返回值是一个Bean,Bean的名称是方法名。
- 注入functionService的Bean时候直接调用functionService()方法。另外一种注入的方式,直接将functionService作为参数给useFunctionService(),这也是spring容器提供的极好的功能。在spring容器中只要存在某个bean,就可以在另外的bean的声明方法的参数注入。
@Bean
public UseFunctionService useFunctioinService(FunctionService functionService){
UserFunctionService useFunctionService = new UseFunctionService();
useFunctionService.setFunctionService(functionService);
return useFunctionService;
}
4. 运行
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("java config"));
context.close();
}
}
无论是xml配置、注解配置还是Java配置,都被称作元数据,所谓元数据即描述数据的数据。元数据本身不具备任何可执行的能力,
只能通过外界的代码来对这些元数据行进行解析后再进行一些有意义的操作。Spring容器解析这些配置元数据进行Bean初始化、配
置和管理依赖。
声明Bean的注解有:
- @Component,没有明确的角色
- @Service 在业务逻辑层使用
- @Repository 在数据访问层(dao层)使用
- @Controller 在展现层使用
注入Bean的注解,一般情况下通用:
- @Autowired, Spring提供的注解
- @Inject, JSR-330提供的注解
- @Resource, JSR-250提供的主机
以上三个注解都可注解在set方法或者属性上。