Spring Boot底層註解——@Configuration
在bean
包中預備兩個Java Bean物件:
-
Pet
package com.tom.boot.bean; /** * Created on 2021/2/15. * * @author Tom Goh */ public class Pet { String name; public Pet() { } public Pet(String name) { this.name = name; } public String getName() { return
-
User
package com.tom.boot.bean; /** * Created on 2021/2/15. * * @author Tom Goh */ public class User { String name; String age; public User() { } public User(String name, String age) { this
在原生的Spring中可以使用配置檔案中的
<bean>
條目將其例項化至容器中,此處不表。在Spring Boot中可以使用專門的配置類來實現Bean的例項化,與使用註解的Spring IOC注入類似。
建立
config
包,並在其中建立MyConfig
這一物件,在類名稱上方使用註解@Configuration
宣告其為配置類,在類中使用方法例項化Bean物件並在方法上方使用@Bean
註解實現注入:@Configuration public class MyConfig { @Bean("UserBean") public User user01(){ return new User("Tom","21"); } @Bean public Pet pet01(){ return new Pet("tomcat"); } }
@Configuration
@Configuration
在一個類的上方則表示該類為一個配置類,相當於一個Spring配置檔案,本身也是一個元件。
在@Configuration
配置中,有一個重要屬性proxyBeanMethods
,指的是該配置類代理Bean的方法,有true與false兩個取值。
-
當
proxyBeanMethods=true
時,使用的是代理配置的Full模式,當該屬性預設時也預設為該值。在Full模式下,任何一個在該配置類中注入的Bean物件均為單例項模式:
MyConfig bean=run.getBean(MyConfig.class); User user3=bean.user01(); User user4=bean.user01(); System.out.println("FULL:"+(user3==user4)); System.out.println(bean);
輸出結果為:
可以看到,作為配置類的
MyConfig
是一個被Spring中的CGLIB增強的代理物件,在proxyBeanMethods=true
時,無論呼叫多少此該配置類中的注入方法均會獲得第一次呼叫時注入的物件。也就是說,
proxyBeanMethods=true
時,Spring Boot總會檢查使用註冊方法生成的物件在容器中是否已經存在,存在即返回容器中的物件,不存在則建立。 -
當
proxyBeanMethods=false
時,使用的是Lite模式,MyConfig
物件未經CGLIB增強,沒有成為一一個代理物件,上述程式碼的輸出結果如下:可以看到,呼叫多次注入方法,注入的Java Bean不在是單例項模式,而是每次呼叫方法時生成一個不同的Bean物件。
當容器中元件沒有相互依賴關係時,建議使用Lite模式,以便加速Spring Boot啟動;
當容器中元件存在依賴時,使用Full模式更好處理依賴關係。
@Bean
在配置類中的注入方法上方新增@Bean
註解,以在容器中註冊元件。
@Bean("UserBean")
public User user01(){
return new User("Tom","21");
}
在配置類中使用@Bean註冊元件,預設為單例項。
向容器中新增元件,預設方法名作為元件的名稱,倘若在@Bean註解後增加("…")則修改名稱為註釋後的名稱。