詳解如何實現SpringBoot的底層註解
一、@Configuration註解
1、基本使用
自定義配置類
/** * 1、@Configuration 告訴SpringBoot這是一個配置類,相當於一個xml配置文件 * * 2、配置類裡面使用 @Bean 標註在方法上 來給容器註冊組件,默認是單實例的 * * 3、配置類本身也是一個組件 */ @Configuration(proxyBeanMethods = true) public class MyConfig { @Bean public User user01(){ return new User("zhangsan",23); } @Bean public Pet pet01(){ return new Pet("cat"); } }
主程序類
/** * 主程序類 * @SpringBootApplication:這是一個SpringBoot應用 */ @SpringBootApplication public class MainApplication { public static void main(String[] args) { //返回IOC容器 ConfigurableApplicationContext context = SpringApplication.run(MainApplication.class, args); //從容器中獲取bean User user = context.getBean(User.class); System.out.println(user); Pet pet = context.getBean("pet01", Pet.class); System.out.println(pet); MyConfig myConfig = context.getBean(MyConfig.class); System.out.println(myConfig); /*如果配置@Configuration(proxyBeanMethods = true),代理對象調用方法從容器中拿組件,SpringBoot總會檢查容器中是否有這個組件 * 保持組件的單實例*/ User user1 = myConfig.user01(); User user2 = myConfig.user01(); System.out.println(user1 == user2); } }
打印結果:
2、Full模式與Lite模式
Full
模式是指proxyBeanMethods = true
,開啟代理bean的方法。此時調用配置類中每一個給而容器註冊組件方法,都會從容器中找組件,保持單例模式。
/*如果配置@Configuration(proxyBeanMethods = true),代理對象調用方法從容器中拿組件,SpringBoot總會檢查容器中是否有這個組件 * 保持組件的單實例*/ User user1 = myConfig.user01(); User user2 = myConfig.user01(); System.out.println(user1 == user2); //true
Lite
模式是指proxyBeanMethods = false
,關閉代理bean的方法。容器中不會保存代理對象,每一次調用配置類裡面的方法,·都會產生一個新的對象。這可以解決組件依賴的問題。
User
組件裡面有Pet
組件
public class User { private String name; private Integer age; private Pet pet; public Pet getPet() { return pet; } }
自定義的配置類中proxyBeanMethods
設置為false
@Configuration(proxyBeanMethods = false) public class MyConfig { @Bean public User user01(){ User user = new User("zhangsan", 23); //User組件依賴瞭Pet組件 user.setPet(pet01()); return user; } @Bean public Pet pet01(){ return new Pet("cat"); } }
主程序類
@SpringBootApplication public class MainApplication { public static void main(String[] args) { User user01 = context.getBean("user01", User.class); Pet pet01 = context.getBean("pet01", Pet.class); System.out.println(user01.getPet() == pet01); //true } }
打印結果:
- 配置類組件之間無依賴關系用
Lite
模式加速容器啟動過程,減少判斷 - 配置類組件之間有依賴關系,方法會被調用得到之前單實例組件,這時要用
Full
模式
二、@Import註解導入組件
@Import
註解可以給容器中自動創建出指定類型的組件,默認組件的名字就是全類名
@Import(DBHelper.class) @Configuration(proxyBeanMethods = false) public class MyConfig { }
在容器中或者這個導入的組件
三、@Conditional註解條件裝配
滿足Conditional
指定的條件的方法,則進行組件註入
也可以標註在類上,當容器中存在指定的組件的時候,配置類中的方法才會生效
四、@ImportResource註解導入Spring配置文件
外部配置文件
導入外部配置文件
獲取導入的外部組件
五、@ConfigurationProperties註解配置綁定
JavaBean與配置文件中屬性進行綁定
需要使用@ConfigurationProperties
和 @Component
兩個註解,@Component
註解將組件註冊到容器中,因為隻有在容器中的組件,才能使用SpringBoot提供的一些強大的註解功能
訪問請求獲取綁定的JavaBean
還可以在配置類中使用@EnableConfigurationProperties
開啟組件屬性配置功能,並把這個組件自動註冊到容器中,這樣就不需要再使用 @Component
註解
@EnableConfigurationProperties(Pet.class) public class MyConfig { }
//@Component @ConfigurationProperties(prefix = "mydog") public class Pet { }
依然可以訪問請求獲取綁定的JavaBean
到此這篇關於詳解如何實現SpringBoot的底層註解的文章就介紹到這瞭,更多相關SpringBoot底層註解內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringBoot底層註解超詳細介紹
- SpringBoot深入探究@Conditional條件裝配的使用
- Spring超詳細講解註解開發
- Springboot自動配置與@Configuration配置類詳解
- SpringBoot使用@EnableAutoConfiguration實現自動配置詳解