上一篇文章我们讲了Spring框架至SpringBoot框架的演进过程,今天我们来讲下SpringBoot框架自动装配的流程。
创新互联建站是一家专业从事网站设计制作、网站设计的网络公司。作为专业网站制作公司,创新互联建站依托的技术实力、以及多年的网站运营经验,为您提供专业的成都网站建设、营销型网站建设及网站设计开发服务!学习任何一个技术,我们都需要了解这个技术背后产生的原理,了解了原理之后,这个技术你使用起来才会游刃有余。
假如我们SpringBoot要集成Redis,我们应该怎么做呢?来,我们继续往下看。
1.SpringBoot集成Redis 1.1引入依赖org.springframework.boot spring-boot-starter-data-redis
1.2写配置文件1.3通过@Autowired从IOC容器中取出Bean对象spring.redis.host=192.168.8.74
spring.redis.password=123456
spring.reids.database=0
@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@ComponentScanComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@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元起,快前往官网查看详情吧