二、SpringBoot自动装配及SPI的理解-创新互联

上一篇文章我们讲了Spring框架至SpringBoot框架的演进过程,今天我们来讲下SpringBoot框架自动装配的流程。

创新互联建站是一家专业从事网站设计制作、网站设计的网络公司。作为专业网站制作公司,创新互联建站依托的技术实力、以及多年的网站运营经验,为您提供专业的成都网站建设、营销型网站建设及网站设计开发服务!

  学习任何一个技术,我们都需要了解这个技术背后产生的原理,了解了原理之后,这个技术你使用起来才会游刃有余。

假如我们SpringBoot要集成Redis,我们应该怎么做呢?来,我们继续往下看。

1.SpringBoot集成Redis 1.1引入依赖
org.springframework.bootspring-boot-starter-data-redis
1.2写配置文件

spring.redis.host=192.168.8.74

spring.redis.password=123456

spring.reids.database=0

1.3通过@Autowired从IOC容器中取出Bean对象
@RestController
@RequestMapping("/redis")
public class RedisController{
    @Autowired
    private RedisTemplate redisTemplate;
    
    @GetMapping("/save")
    public String save(@RequestParam String key,@RequestParam String value){
        redisTemplate.opsForValue().set(key,value);
        return "添加成功";
    }
}

通过上面的案例,我们应该能够看出来,RedisTemplate这个类的Bean对象,既没有通过XML的方式去注入,也没有通过注解的方式注入到IOC容器中,但是我们仍可以通过@Autowired注解自动从容器里面拿到相应的Bean对象,再去进行属性注入。

  那这是怎么做到的呢?接下来我们分析一下自动装配的原理,了解了自动装配的原理以后,自然而然就懂了RedisTemplate的Bean对象是如何而来的。

2.自动装配原理

1.当SpringBoot集成Redis的时候,我们只做了一步操作引入了包,那为什么能从IOC容器中拿到RedisTemplate的Bean对象呢?

  2.我们既没有手动添加配置,也没有手动添加注解,那肯定是自动注入到IOC容器中的。

  3.其实所谓的自动只是跟手动对比的,框架已经帮我们做好了,我们只是没有感知而已。

  4.那框架帮我们做了什么呢?框架是如何把RedisTemplate对象加入到IOC容器中的呢?

5.猜测一下,肯定是基于Spring框架去做的。那RedisTemplate上面要不然就是有@Component注解,要不然就是有@Configuration中的@Bean注解。

  6.只有这样,当我们的Spring容器启动的时候,通过@Import注解才会导入这些类,然后再注入。

  7.如果真的是这样,那还是会存在一个问题,Spring容器启动时候是如何找到这些带注解类的呢?之前用@ComponentScan还要指定路径呢。

  8.因为我们的Springboot会引入各种各样的jar包,要扫描的路径也是千奇百怪,所以当我们要扫描带这些注解的类的时候,路径肯定是由jar自己告诉Springboot的,而不是Springboot去写死扫描路径的(约定大于配置)。

  9.这个逻辑就是所谓的SPI机制。

  10.流程推到结束。

2.1SpringBootApplication注解是入口
@Target(ElementType.TYPE)//注解的适用范围,其中Type用于描述类、接口(包括包注解类型)或enum声明
@Retention(RetentionPolicy.RUNTIME)//注解的生命周期,保留到class文件中(三个生命周期)
@Documented//表明这个应该被javadoc记录
@Inherited//子类可以继承该注解
@SpringBootConfiguration//继承了Configuration,表示当前是注解类
@EnableAutoConfiguration//开启springboot的注解功能,springboot的四大神器之一,其借助@import的帮助
@ComponentScan(excludeFilters = { //扫描路径设置
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
........
}

其中有三个非常重要的注解,分别是:

  @SpringBootConfiguration:继承了Configuration,表示当前是注解类;

@EnableAutoConfiguration//开启springboot的注解功能,springboot的四大神器之一,其借            助@import的帮助;

@ComponentScan(excludeFilters = { //扫描路径设置@ComponentScan

2.2@ComponentScan

  ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义;并将bean定义加载到IOC容器中。

  我们可以通过basePackage等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。

  注:所以SpringBoot的启动类最好是放在root package下,因为默认不指定basepackages。

2.3@EnableAutoConfiguration

此注解顾名思义是可以自动配置,所以应该是SpringBoot中最为重要的注解。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
......
}

其中最重要的两个注解:

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)

当然其中还有一个比较重要的类就是:

  1.AutoConfigurationImportSelector.class

2.3.1AutoConfigurationPackage
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
......
}

通过@Import(AutoConfigurationPackages.Registrar.class)

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章标题:二、SpringBoot自动装配及SPI的理解-创新互联
分享URL:http://scyanting.com/article/djgesd.html