网上有很多对SpringBoot自动配置实现的源码解读,有兴趣的可以查阅一下。这里只是以应用为主,不纠结其实现的原理。原理是为进阶和面试用的,但是我面试也从来不问原理,因为我不需要你去自己实现一套这个东西。会使用,并知道有哪些优缺点即可。
先说一下这个应用的一个场景:
我们在开发Spring项目的时候,特别是一个大项目,比如游戏开发,电商开发,都喜欢把一些可能会被多个项目引用的功能单独放到一个Maven模块之中。比如数据操作层Dao层。如果是开发微服务,会有很多服务会使用到相同的Dao的操作。这个时候最好的方式就是把Dao单独做为一个项目,打包成Jar,让其它的项目引用 ,这样可以提升开发效率。
比如把Dao单独做为一个模块,在引用的时候,会涉及到几个问题:
- 包路径不同。业务项目可能和Dao项目的包路径不一样,在项目启动的时候,不能扫描Dao层里面一些@Service标记的组件类。
- 初化始问题。对于Dao来说,不可避免的需要初始化一些连接或配置。
为了解决这些问题,可以使用SpringBoot提供的自动配置功能。在SpringBoot启动的时候,注解@SpringBootApplication中有一个引入的注解@EnableAutoConfiguration,它会自动查找所有Jar中/META-INF/spring.factories配置中的自动化加载的配置。这样需要完成的初始化工作和组件注册,就可以放在Dao项目中完成了。
创建Dao层项目my-game-dao
这里以spring-data-mongodb为例。创建Dao层项目,为了方便操作Dao,提供一个对外的操作类,比如UserAccount的对外操作类是UserAccountDao,它被@Service注解标记,它的路径为com.mygame.dao
。
添加自动配置类
添加配置类:
@Configuration
@ComponentScan("com.mygame.dao")
@EnableMongoRepositories(basePackages= {"com.mygame.db.repository"})
public class GameDaoAutoConfiguration {
private Logger logger = LoggerFactory.getLogger(GameDaoAutoConfiguration.class);
@Autowired(required = false)
private IGameDaoExecutorFactory gameDaoExecutorFactory;
@Autowired
private PlayerDao playerDao;
@PostConstruct
public void init() {
logger.info("开始初始化Dao服务");
}
@Bean
@ConditionalOnMissingBean
public IGameDaoExecutorFactory gameDaoExecutorFactory() {
return new DefaultGameDaoEventExecutorFactory();
}
@Bean
@ConditionalOnMissingBean
public AsyncPlayerDao asyncPlayerDao() {
return new AsyncPlayerDao(gameDaoExecutorFactory.getEventExecutorGroup(), playerDao);
}
}
其中@ComponentScan("com.mygame.dao")
注解就是表示在项目启动时,描述此包路径下的Bean类,并注入到Spring中管理。
@EnableMongoRepositories(basePackages= {"com.mygame.db.repository"})
这个注解是为了提供Mongodb的reposity所在的路径。
创建spring.factories文件
在src/main/resources目录下创建此文件,记住,必须在src/main/resources目录下创建,否则,打包的时候,会打包不到Jar文件中。然后在此文件中添加自动配置:
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.mygame.GameDaoAutoConfiguration
如果有多个自动配置的类需要添加,以逗号分隔即可。
在业务项目中使用my-game-dao项目时,直接添加maven的依赖就可以了。这样的另一个好处就是和Dao相关的工作都在dao模块完成了,不会影响到其它模块。
![](https://img.haomeiwen.com/i3793531/3cb8f9aa13153cd9.jpg)
网友评论