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方法或者屬性上。
