Springboot原理(上)

Springboot原理

一、从RedisTemplate的自动装配说起

在这里插入图片描述

上面的图中展示的是在Springboot应用启动后,自动加载和装配RedisTemplate对象的过程,过程中主要包含的角色有:

  1. 使用服务类的开发者: 使用者配置application.properties,指定相关参数(这里仅仅以url为例)

  2. 创建和装配服务类一方: 这里主要涉及两个类 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自动装配的理解。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页