美文网首页Spring Cloud
SpringBoot 自动配置实现

SpringBoot 自动配置实现

作者: 王广帅 | 来源:发表于2020-01-06 21:04 被阅读0次

网上有很多对SpringBoot自动配置实现的源码解读,有兴趣的可以查阅一下。这里只是以应用为主,不纠结其实现的原理。原理是为进阶和面试用的,但是我面试也从来不问原理,因为我不需要你去自己实现一套这个东西。会使用,并知道有哪些优缺点即可。
先说一下这个应用的一个场景:
我们在开发Spring项目的时候,特别是一个大项目,比如游戏开发,电商开发,都喜欢把一些可能会被多个项目引用的功能单独放到一个Maven模块之中。比如数据操作层Dao层。如果是开发微服务,会有很多服务会使用到相同的Dao的操作。这个时候最好的方式就是把Dao单独做为一个项目,打包成Jar,让其它的项目引用 ,这样可以提升开发效率。
比如把Dao单独做为一个模块,在引用的时候,会涉及到几个问题:

  1. 包路径不同。业务项目可能和Dao项目的包路径不一样,在项目启动的时候,不能扫描Dao层里面一些@Service标记的组件类。
  2. 初化始问题。对于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模块完成了,不会影响到其它模块。

关注公众号,获取更多干货

相关文章

网友评论

    本文标题:SpringBoot 自动配置实现

    本文链接:https://www.haomeiwen.com/subject/ltclactx.html