SpringBoot底層註解超詳細介紹
1. @Configuration
—— 放在類前註釋 用於表示配置類,配置類也是一個組件
@Configuration(proxyBeanMethods = true) // 配置類 == 配置文件 public class MyConfig { }
通過 proxyBeanMethods 很好的解決瞭組件依賴的問題 ——
- 隻是註冊組件,組件間無依賴(false)
- 有組件依賴(true)
測試組件依賴及測試類本身是組件
// 配置類本身也是一個組件 MyConfig bean = run.getBean(MyConfig.class); System.out.println(bean); run.getBean("user01", User.class); run.getBean("tom", Pet.class); System.out.println("用戶的寵物是不是容器中的寵物" + (user01.getPet() == tom01));
2. @bean
—— 放在方法前表示給容器中註冊組件 (單實例)
註:目前我對容器、組件的理解有限, 後期如果有更深入的理解,會更新此處
@Bean // 給容器中添加組件,方法名作為組件id, 返回類型是組件類型 , 返回的值是組件在容器中的實例 public User user01(){ User zangsan = new User("zangsan", 18); zangsan.setPet(tomcatPet()); return zangsan; }
測試是否註冊成功
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); // 查看容器裡的組件 String[] names = run.getBeanDefinitionNames(); for(String s: names){ System.out.println(s); }
3. @Import
—— 放在配置類前,用於導入組件
@Import({User.class, DBHelper.class}) // 給容器中自動創建出這兩個類型的組件 @Configuration // 配置類 == 配置文件 public class MyConfig { }
測試導入組件是否成功
DBHelper bean1 = run.getBean(DBHelper.class);
4. @Conditional條件裝配
—— 用於註冊組件需要特定條件的情況
例如: 用戶需要寵物,若無寵物tom組件,不能註冊用戶組件
@ConditionalOnBean(name = "tom") // 表示有 tom 組件才能註冊 user01 組件 @Bean // 給容器中添加組件,方法名作為組件id, 返回類型是組件類型 , 返回的值是組件在容器中的實例 public User user01(){ User zangsan = new User("zangsan", 18); zangsan.setPet(tomcatPet()); return zangsan; }
測試
System.out.println("容器中是否含有寵物組件" + run.containsBean("tom")); System.out.println("容器中是否含有用戶組件" + run.containsBean("user01"));
5. 配置綁定
綁定核心配置文件 (application.properities)
方法一:
@Component // 將組件加到容器中 @ConfigurationProperties(prefix = "mycar") // 配置屬性名
方法二:
// 功能一:開啟Car的屬性配置 // 功能二:把指定的組件導入容器中 @EnableConfigurationProperties(Car.class)
測試類:
@Autowired Car car; @RequestMapping("/car") public Car car(){ System.out.println(car); return car; }
SpringBoot自動配置原理(源碼分析)
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration // 當前是一個配置類 @EnableAutoConfiguration @ComponentScan( // 指定掃描那些Spring註解 excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} )
@EnableAutoConfiguration
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage //——@Import({AutoConfigurationPackages.Registrar.class}) @Import({AutoConfigurationImportSelector.class})
核心註解1:
@AutoConfigurationPackage 利用Registrar給容器中批量註冊組件
—— 將指定包下的組件批量導入 (MainAppliaction 包下)
核心註解2
@Import({AutoConfigurationImportSelector.class})
—— 利用 getAutoConfigurationEntry() 方法給容器中批量導入組件
配置類位置
總結: SpringBoot 所有自動配置全部加載, 按照條件裝配 —— 導入相關場景才能生效
- springboot 加載所有自動配置類, 按條件生效 —— 生效的配置類為容器中裝配組件(默認綁定配置文件中的值)
- 用戶有自己配置的組件, 以用戶的為先
- 定制化配置 —— 自己替換底層組件 / 修改底層組件配置文件中的值
到此這篇關於SpringBoot底層註解超詳細介紹的文章就介紹到這瞭,更多相關SpringBoot底層註解內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 詳解如何實現SpringBoot的底層註解
- Spring中@order註解用法實戰教程
- SpringBoot深入探究@Conditional條件裝配的使用
- Spring @Import註解的使用
- Java元註解Retention代碼示例介紹