Springboot自定义stater(上)-自动装配原理
一、从RedisTemplate的自动装配说起
上面的图中展示的是在Springboot应用启动后,自动加载和装配RedisTemplate对象的过程,过程中主要包含的角色有:
使用服务类的开发者: 使用者配置application.properties,指定相关参数(这里仅仅以url为例)
创建和装配服务类一方: 这里主要涉及两个类 RedisAutoConfiguration 和 RedisProperties。
*RedisProperties类会加载application.properties中的一些相关参数到类的属性上,根据@ConfigurationProperties(prefix=“spring.redis”)为依据确定加载以spring.redis为前缀的配置信息。
*RedisAutoConfiguration 使用RedisProperties类的属性信息,创建RedisTemplate并装配到Spring工厂(这里不展开讲解)。
仅凭这一张图来理解Springboot的原理是不够的,为了更好的理解Springboot的实现原理,下面我们将从Springboot启动类注解 @SpringBootApplication的前生今世说起。
二、说一说@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 {
...
}
从上面的Springboot源码看,@SpringBootApplication注解的功能是由以下三个注解构成:
@SpringBootConfiguration注解 :这个注解其实是@Configuration注解的功能。
@ComponentScan注解:功能是扫描同级以及子包中所有类上的@Service@Repository的创建实例对象的注解,并将创建好的实例对象装配到 Spring工厂中。
@EnableAutoConfiguration注解:功能是加载和装配所有 XxxAutoConfiguration 类创建的实例到Spring工厂。
三、Springboot注解扫描装配bean原理
在Spring框架的纯JavaBean配置开发中,主要涉及到了@Configuration、@ComponentScan注解的使用,下面我们上代码:
全局核心配置类:
@Configuration
@ComponentScan(basePackages = "com.xiaodo.*")
@EnableTransactionManagement
public class RootConfig {
@Bean
public DataSource dataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName("oracle.jdbc.OracleDriver");
druidDataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
druidDataSource.setUsername("hr");
druidDataSource.setPassword("hr");
return druidDataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setTypeAliasesPackage("com.xiaodo.bean");
PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
Resource[] resources = patternResolver.getResources("classpath*:com/xiaodo/mapper/*Mapper.xml");
sqlSessionFactoryBean.setMapperLocations(resources);
return sqlSessionFactoryBean.getObject();
}
@Bean
public MapperScannerConfigurer crtMapperScanner() {
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.xiaodo.dao");
msc.setSqlSessionFactoryBeanName("sqlSessionFactory");
return msc;
}
@Bean
@Autowired
public PlatformTransactionManager dataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager dataSourceTransactionManager=new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}
测试工厂获取bean:
@ContextConfiguration(classes = {RootConfig.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringContextTest {
@Autowired
private UserService userService;
@Test
public void testLogin() {
userService.login("admin", "123456");
}
}
上面的案例中通过@Configuration注解声明了一个配置类,配置类主要用于将一些对象创建好装配到 Spring工厂中管理, 同时在RootConfig类上使用@ComponentScan(basePackages = “com.xiaodo.*”)注解,来扫描和创建service、controller等其他实例对象。
也就是说一个使用了这两个注解的类,可以帮助我们管理应用中的所有涉及到的实例对象,将其装配到 Spring工厂中。这也是为什么Springboot的启动类也使用了这两个注解的原因。
注:案例中涉及到的其他注解本文暂且不做介绍,我们会单独拿出一篇文章讲解 Spring的纯JavaBean开发
四、Springboot自动装配第三方服务类原理
SpringBoot应用在启动过程中,会通过@EnableAutoConfiguration注解进行 bean的自动装配,具体流程如下:
- SpringBoot项目在启动时,通过@EnableAutoConfiguration注解的功能,会调用SpringFactoriesLoader.loadFactoryNames加载依赖下的META-INF/spring.factories配置文件
- 加载META-INF/spring.factories配置文件中的XxxAutoConfiguration自动配置类
- 将XxxAutoConfiguration配置类创建的实例对象装配到spring工厂中
- 开发人员可以直接通过@Autowired进行自动注入使用
本文先说到这,下一篇我们将通过自定义实现一个第三方的stater加深对Springboot自动装配的理解。