首頁 > 軟體

SpringBoot底層註解超詳細介紹

2022-10-02 14:00:36

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底層註解內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com