SpringBoot使用@EnableAutoConfiguration實現自動配置詳解

@EnableAutoConfiguration註解

其實SpringBoot自動配置的原理主要是用的這個@EnableAutoConfiguration註解,其原理為以下三點:

(1)在@EnableAutoConfiguration註解內部使用@Import(AutoConfigurationImportSelector.class)來加載配置類;

(2)配置文件位置:META-INF/spring.factories,該配置文件中定義瞭大量的配置類,當SpringBoot項目啟動時,會自動加載這些配置類,初始化Bean;

(3)並不是所有的Bean都會被初始化,在配置類文件中使用Condition來加載滿足條件的Bean。

一個簡單的案例

上面的原理看上去還是不太好理解的,這個需要查看源碼結合理解,接下來我就就一個簡單的例子來解釋一下。

一個簡單的需求:讓SpringBoot自動幫我們創建一個User和Role的Bean對象。

第一步,自定義配置類

package cs.yangtze.springboot_enable_other.config;
import cs.yangtze.springboot_enable_other.entity.Role;
import cs.yangtze.springboot_enable_other.entity.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class UserConfig {
    @Bean
    @ConditionalOnProperty(name = "lxr",havingValue = "20")
    public User user(){
        return new User();
    }
    @Bean
    public Role role(){
        return new Role();
    }
}

第二步,ImportSelector實現類來加載自定義的配置類,這就對應原理的(1)

package cs.yangtze.springboot_enable_other.config;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportSelect implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
{"cs.yangtze.springboot_enable_other.config.UserConfig"};
    }
}

原理(2)中配置文件位置是這樣的,但我們自己自定義的配置文件位置不一樣,當SpringBoot項目啟動時,會自動加載配置類,初始化Bean

@Import(MyImportSelect.class)
@SpringBootApplication
public class SpringbootEnableApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args);
        Role role =context.getBean(Role.class);
        System.out.println(role);
        User user = context.getBean(User.class);
        System.out.println(user);
    }
}

這時候我們來看一下控制臺打印結果:

我們會發現,Role的Bean對象正常打印瞭,但是User的並沒有,這是為什麼?

這時候就對應原理(3),並不是所有的Bean都會被初始化,因為我在自定義的UserConfig配置類中,在User上加上瞭@ConditionalOnProperty(name = “lxr”,havingValue = “20”)條件註解,隻有當我的配置文件application.properties中有這個鍵值對時才能夠創建User對象。

最終也是得到正確結果

總結

SpringBoot自動配置的原理就是以上三點,我舉的例子應該能夠很好地幫助你理解,如果有什麼不對的地方還請大傢批評指正,這也是我看瞭幾遍視頻後的理解。

到此這篇關於SpringBoot使用@EnableAutoConfiguration實現自動配置詳解的文章就介紹到這瞭,更多相關SpringBoot @EnableAutoConfiguration內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: