多数情况下,Spring Boot都是自动去评估路径和探测配置的信息,然后快速获取简单应用。但是,有时候,我们想提供配置类,但是要求不需要Spring Boot去自动发现这个配置是否包含,也就是说,我们想自己判断这个配置的有用性。
这样的话,我们将修改注释而不是spring.factories的路径。
4.4.1代码实现
1.首先,我们需要注释掉count-starter/src/main/resource/spring.factories文件下的配置。
#org.springframework.boot.autoconfigure.EnableAutoConfiguration =\ |
2.接着,我们需要创建注释。我们将会创建一份新的文件,名称是EnableDbCounting.jaa在路径src/main/java/org/owen/bookpubstarter/dbcount下面。
@Target(ElementType.TYPE) |
3.我们将创建好的标签@EnableDbCounting注释加入到BookPubApplication类中,并且移除掉dbCountRunner(…)方法。
@SpringBootApplication |
4.启动项目。
4.4.2代码说明
执行程序,你将会看到所有打印的总数信息都是0,尽管StartupRunner打印了Number of books:1。具体信息如下:
o.t.b.dbcount.DbCountRunner : AuthorRepository has 0 entries o.t.b.dbcount.DbCountRunner : BookRepository has 0 entries o.t.b.dbcount.DbCountRunner : PublisherRepository has 0 entries o.t.b.dbcount.DbCountRunner : ReviewerRepository has 0 entries org.test.bookpub.StartupRunner : Welcome to the Book Catalog System! org.test.bookpub.StartupRunner : Number of books: 1 |
这是因为Spring Boot是随机执行CommandLineRunner,当我们改为了配置@EnableDbCounting注释时,它会有BookPubApplication类之前获取进程。因为数据的初始化是在StartupRunner.run(…)的方法中,但是程序的启动是先去调用DbCountRunner.run(…)的方法,所以打印的信息是0.
如果我们想要按照顺序来执行,我们可以加入@Order的注释。让我们在StartupRunner类上面加入@Order(Ordered.LOWEST_PRECEDENCE-15).因为加入了LOWESR_PRECENDENCE会确保StartupRunner会被执行之后才执行DbCountRunner.加入之后启动我们的程序,这个时候看到的就不是0的信息了。
在spring.factories文件中没有了包含的配置信息,Spring Boot并不知道DbCountAutoConfiguration类需要包含在应用的上下文中。在默认的情况下,Spring Boot在启动时,只会去扫描org.owen.bookpub.*下的配置信息。然而,org.owen.bookpub和org.owen.bokpubstarter.dbcount的包路径是不一样的,所以后者是不被扫描的。但是我们新创建了注释,@EnableDbCounting注释中引入了@Import(DbCountAutoConfiguration.class),这样的话就会让Spring Boot去包含DbCountAutoConfiguration作为应用的一部分。
通过使用注释,spring.factories和确切的bean注释,我人可以灵活地自定义配置Spring Boot的starters在我们的项目中。