最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
上篇文章我们讲了spring boot中自动配置的深刻含义和内部结构,这篇文章我们讲一下怎么写出一个自己的自动配置。为了方便和通用起见,这篇文章将会实现一个mysql数据源的自动配置。
我们需要添加mysql和jpa的数据源:
我们知道 Auto-Configuration实际上就是一种配置好的@Configuration,所以我们需要创建一个MySQL 的@Configuration, 如下:
下一步就是将这个配置类注册到resources下面的/META-INF/spring.factories作为org.springframework.boot.autoconfigure.EnableAutoConfiguration的一个实现:
如果我们希望自定义的@Configuration拥有最高的优先级,我们可以添加@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) 如下所示:
注意, 自动配置的bean只有在该bean没有在应用程序中配置的时候才会自动被配置。如果应用程序中已经配置了该bean,则自动配置的bean会被覆盖。
我们的mysqlConfig只有在DataSource这个类存在的时候才会被自动配置。则可以使用@ConditionalOnClass。 如果某个类不存在的时候生效则可以使用@ConditionalOnMissingClass。
如果我们需要的不是类而是bean的实例,则可以使用@ConditionalOnBean 和 @ConditionalOnMissingBean。
在本例中,我们希望当dataSource的bean存在的时候实例化一个LocalContainerEntityManagerFactoryBean:
同样的,我们可以定义一个transactionManager, 只有当JpaTransactionManager不存在的时候才创建:
如果我们想在Spring配置文件中的某个属性存在的情况下实例化bean,则可以使用@ConditionalOnProperty。 首先我们需要加载这个Spring的配置文件:
我们希望属性文件里usemysql=local的时候创建一个DataSource, 则可以这样写:
当我们需要根据resource文件是否存在来实例化bean的时候,可以使用@ConditionalOnResource 。
我们需要在mysql.properties添加相应的配置:
除了使用@Condition** 之外,我们还可以继承SpringBootCondition来实现自定义的condition。 如下所示:
接下来我们可以测试了:
这里我们因为没有自定义dataSource所以会自动使用自动配置里面的mysql数据源。
如果我们不想使用刚刚创建的自动配置该怎么做呢?在@SpringBootApplication中exclude MySQLAutoconfiguration.class即可:
本文的例子可以参考
更多教程请参考