成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

springboot(二)——springboot自動配置解析

張率功 / 3576人閱讀

摘要:前言用過的肯定很熟悉,它其中有個重要的特性,就是自動配置平時習(xí)慣的一些設(shè)置的配置作為默認配置。提倡無配置文件的理念,使用生成的應(yīng)用完全不會生成任何配置代碼與配置文件。

前言

用過springboot的肯定很熟悉,它其中有個重要的特性,就是自動配置(平時習(xí)慣的一些設(shè)置的配置作為默認配置)。springboot提倡無XML配置文件的理念,使用springboot生成的應(yīng)用完全不會生成任何配置代碼與XML配置文件。下面先看一個springboot集成mybatis的例子。
第一步: 引入pom文件

        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            2.0.1
        
        
            mysql
            mysql-connector-java
            5.1.47
        

第二步: 因為我使用的xml配置文件去使用mybatis,在application.properties文件加入如下配置:

#指定mapper文件位置
mybatis.mapper-locations=classpath:mapper/*.xml

#數(shù)據(jù)源信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/zplxjj?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

第三步: 加入實體類、dao、mapper文件

第四步:啟動類上面加入注解

@SpringBootApplication
@MapperScan("com.stone.zplxjj.dao")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

第五步:至此,配置完成,只需要寫個單側(cè),springboot已經(jīng)完美集成mybatis

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
    @Autowired
    UserMapper userMapper;

    @Test
    public void testMybatis() {
        System.out.println(userMapper.selectByPrimaryKey(1L));
    }
}
@EnableAutoConfiguration

通過上面的例子,我們發(fā)現(xiàn)集成mybatis特別簡單,那些繁瑣的類的注入都沒有寫,只需要加入數(shù)據(jù)庫的一些配置即可,那這其中@EnableAutoConfiguration功不可沒。@EnableAutoConfiguration 注解已經(jīng)在@SpringBootApplication里面了

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class[] exclude() default {};

    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class[] scanBasePackageClasses() default {};
}

我們看到@EnableAutoConfiguration結(jié)構(gòu)如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class[] exclude() default {};

    String[] excludeName() default {};
}

這其中起作用的一個重要注解@Import,這個Spring提供的一個注解,可以導(dǎo)入配置類或者Bean到當(dāng)前類中,我們進入到AutoConfigurationImportSelector類中查看,方法太長,截取核心的兩個方法:

    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        } else {
            AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
            AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
            return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
        }
    }

    protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        } else {
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
            List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
            configurations = this.removeDuplicates(configurations);
            Set exclusions = this.getExclusions(annotationMetadata, attributes);
            this.checkExcludedClasses(configurations, exclusions);
            configurations.removeAll(exclusions);
            configurations = this.filter(configurations, autoConfigurationMetadata);
            this.fireAutoConfigurationImportEvents(configurations, exclusions);
            return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
        }
    }

通過項目啟動后,打上注解,可以看到MybatisAutoConfiguration引入了進來

而MybatisAutoConfiguration能引入進來,其實是在mybatis-spring-boot-autoconfigure-2.0.1.jar包里面的spring.factories指定的,通過調(diào)用SpringFactoriesLoader.loadFactoryNames()來掃描加載含有META-INF/spring.factories文件的jar包,從而標識哪些自動配置的類

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
@Conditional

@Conditional 的作用,可以根據(jù)條件去加載特定的bean,原理這邊不做探討,springboot基于此實現(xiàn)了幾個注解,比較方便的實現(xiàn)條件加載類
@ConditionalOnBean:Spring容器中是否存在對應(yīng)的實例
@ConditionalOnMissingBean:Spring容器中是否缺少對應(yīng)的實例
通過查看MybatisAutoConfiguration中的SqlSessionFactory的寫法

    @Bean
    @ConditionalOnMissingBean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(dataSource);
        factory.setVfs(SpringBootVFS.class);
        if (StringUtils.hasText(this.properties.getConfigLocation())) {
            factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
        }

        this.applyConfiguration(factory);
        if (this.properties.getConfigurationProperties() != null) {
            factory.setConfigurationProperties(this.properties.getConfigurationProperties());
        }

        if (!ObjectUtils.isEmpty(this.interceptors)) {
            factory.setPlugins(this.interceptors);
        }

        if (this.databaseIdProvider != null) {
            factory.setDatabaseIdProvider(this.databaseIdProvider);
        }

        if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
            factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
        }

        if (this.properties.getTypeAliasesSuperType() != null) {
            factory.setTypeAliasesSuperType(this.properties.getTypeAliasesSuperType());
        }

        if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
            factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
        }

        if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
            factory.setMapperLocations(this.properties.resolveMapperLocations());
        }

        return factory.getObject();
    }
結(jié)語

通過上面分析mybatis如何集成springboot,知道了springboot入口在哪里以及如何實現(xiàn)的自動配置,這里只是簡單的做了介紹,其中的一些源碼和細節(jié)就沒有分析了,我相信,入口知道了,接下來就好摳細節(jié)了。

本人也開通了微信公眾號:stonezplxjj和個人博客:http://www.zplxjj.com,更多文章歡迎關(guān)注公眾號:

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74253.html

相關(guān)文章

  • SpringBoot關(guān)于JSON交互問題

    摘要:關(guān)于交互問題一交互的優(yōu)勢本來就是里的內(nèi)容客戶端可以很容易對數(shù)據(jù)解析數(shù)據(jù)格式簡單易于讀寫帶寬占用小不錯的可讀性可表示各類復(fù)雜性的數(shù)據(jù)。注解相當(dāng)于合在一起的作用。從上面返回結(jié)果可以發(fā)現(xiàn)兩個問題,第一許多為的字段也輸出。 SpringBoot關(guān)于JSON交互問題 一、Json交互的優(yōu)勢 1.JSON本來就是javascript里的內(nèi)容,客戶端可以很容易對JSON數(shù)據(jù)解析. 2.數(shù)據(jù)格式簡單...

    Dogee 評論0 收藏0
  • SpringBoot就是這么簡單

    摘要:熱加載代表的是我們不需要重啟服務(wù)器,就能夠類檢測得到,重新生成類的字節(jié)碼文件無論是熱部署或者是熱加載都是基于類加載器來完成的。驗證階段字節(jié)碼文件不會對造成危害準備階段是會賦初始值,并不是程序中的值。 一、SpringBoot入門 今天在慕課網(wǎng)中看見了Spring Boot這么一個教程,這個Spring Boot作為JavaWeb的學(xué)習(xí)者肯定至少會聽過,但我是不知道他是什么玩意。 只是大...

    whinc 評論0 收藏0
  • springboot學(xué)習(xí)()——springmvc配置使用

    摘要:中添加攔截器配置如下攔截所有請求,也就是,只攔截開頭的請求。在中并沒有提供配置文件的方式來配置攔截器,因此需要使用的代碼式配置,配置如下這個屬性通常并不需要手動配置,高版本的會自動檢測第四點講下靜態(tài)資源映射。 以下內(nèi)容,如有問題,煩請指出,謝謝 上一篇講解了springboot的helloworld部分,這一篇開始講解如何使用springboot進行實際的應(yīng)用開發(fā),基本上尋著sprin...

    hiyayiji 評論0 收藏0
  • 基于SpringBoot的后臺管理系統(tǒng)(啟動類解析,開源的世界真好)(一)

    摘要:目前只是一個后臺模塊,希望自己技能增強到一定時,可以把的融合進來。目錄第一站,分析了啟動類??匆姏],這個也是配置類,它聲明了視圖解析器地域解析器以及靜態(tài)資源的位置,想起來沒,就是前置,后置。程序啟動類我們點擊源碼看看。 Guns基于SpringBoot,致力于做更簡潔的后臺管理系統(tǒng),完美整合springmvc + shiro + 分頁插件PageHelper + 通用Mapper + ...

    SwordFly 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<