2. SPI应用之spring boot自动装配

一、spring boot自动装配是什么意思

spring boot是在spring框架之上的框架,目的就是简化配置,无xml配置,只需要添加一个@SpringBootApplication注解,即可实现一个项目的启动,内部包含了tomcat容器、spring webmvc等所有依赖bean的注入,这些都是靠自动装配来完成的。

先来看下@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 {

这里面有2个很重要的注解:

@EnableAutoConfiguration

开启spring boot的自动装配,本质上就是通过@Import注解选择注入bean【这是重点】

@ComponentScan

等同于xml中的配置context:componentScan
定义扫描的类,默认情况下为所在类所定义扫描的包名,包括本级包及子包。
这也是为什么当将spring boot启动类放置在src/main/java下,启动会报错的原因,
当放置在空包下时,默认会扫描所有的包。

二、装配核心:@EnableAutoConfiguration

这个注解有两大特殊之处:

2-1 可以根据条件决定是否需要注入对应的bean

比如:当应用不需要连接redis时,我们就不会引入redis的maven依赖,此时就不会去加载RedisAutoConfiguration类,就不会引发NoClassDefException的异常啦。而当我们需要连接redis时,则只需要在yml中配置redis参数就可以使用了。是不是很方便…
这个强大的功能主要是使用了ImportSelector可以选择注入的特性 和 @Conditional注解的条件注入特性

① ImportSelector

来看下ImportSelector的接口定义:
在这里插入图片描述

请求参数就是注解的元数据信息,可以从中获取到使用了注解的类,已经设置的属性值。
返回参数就是需要注入的bean。
EnableAutoConfiguration类就是实现了ImportSelector接口,实现了选择注入bean的功能。那这些 bean从哪里来呢,其实就是SPI,在下面《自定义扩展》我们会讲到…

② @Conditional

EnableAutoConfiguration注入的条件支持使用注解配置和文件配置两种方式

①注解定义

@Conditional注解可以配置在一定条件时,才会去加载bean。
常见的conditional注解有:
@ConditionalOnBean :当给定的class类型或者Bean的名字存在时,才加载bean
@ConditionalOnClass:当给定的class类型中存在时,才加载bean
@ConditionalOnExpression : 当给定springEL表达式的值返回true时,才加载bean
等等… 其他可以到spring-boot的jar包中去查看

举例:
在这里插入图片描述

②文件定义
@EnableAutuConfiguration相关的类也支持在META-INF/spring-autoconfigure-metadata.properties文件中定义条件
在这里插入图片描述

2-2 支持自定义扩展

当我们自己的类也想和spring boot结合使用时,可以将自定义的Configuration类交由EnableAutoConfiguration来管理。具体怎么植入的,就是SPI…
只需要定义好Configuration类,然后将插件定义放入到META-INF下的spring.factories文件中,就可以被spring boot扫描到。

举例:
比如dubbo也想通过spring boot方便快捷的集成,那dubbo就提供了一个Configuration类,来完成dubbo的初始化:
在这里插入图片描述

具体可以查看github上dubbo源代码:
https://github.com/apache/dubbo-spring-boot-project/blob/master/dubbo-spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories

三、总结

使用一张代码调用图,来完整的看下EnableAutoConfiguration类的代码
[外链图片转存失败(img-VZKVf3Q4-1565538410948)(./images/1565538321342.png)]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot使用“习惯优于配置”的理念让我们的项目快速运行起来,我们可以不用或者只需要很少的配置就能创建一个独立运行、准生产级别的基于Spring框架的项目。我们不禁要问,这么一个优秀的框架,是不是在企业开发中就已经足够了,如果是,那么为什么像BAT这些大公司还要研发自己的交易框架,当然这里面除了核心技术之外,还有两个比较重要的原因:第一:像SpringSpring Boot这些开源框架固然很优秀,但却不满足这些大公司对框架的功能要求,如spring scheduler就没有分布式调度能力,阿里研发了自己的tbschedule,以及后来的schedulerx;第二:开源框架可以解决具体的领域问题,比如持久化框架Mybatis,RPC框架Dubbo,但是面对业务流程的开发却不是它的强项,以此就诞生了SSM,以及后来的Spring MVC。放眼整个java开源世界,不管是功能问题还是业务流程开发问题都有对应框架和组件能满足我们的需求,只要我们的视野足够开阔,能有效的去整合开源组件,足以应付日常的开发。当然我们很难写出像SpringSpring Boot、Mybatis这些优秀的框架,但是我们可以在这个基础之上,进行整合,甚至二次开发,形成公司自己的功能组件或者交易开发框架。不客气的说,开源框架的底层少不了spring的身影,那么可以肯定在Spring Boot推出以后,开源框架势必会以Spring Boot作为底层平台进行二次改造,这是趋势,也是必然。本课程顺应潮流,以Spring Boot作为基础平台,充分发挥其特性,抽象业务流程,整合开源组件,降低开发难度,打造出一个功能强大的交易开发框架,简洁,优雅,好用。本课程有如下技术特色:第一:充分使用Spring Boot自动装配、条件注解,以及各种使用技巧;第二:使用注解@Transaction抽象业务流程,简化交易的定义和执行方式,比SpringMVC更符合业务流程的开发(当然SpringMVC很强大,无贬低之意)第三:为使交易具备RPC能力,使用泛化方式集成Dubbo,其好处是服务端不再需要提供接口给客户端使用,简单、高效;第四:使用nacos作为服务注册中心,也支持zookeeper;第五:为使交易具备Http能力,在Spring MVC的基础上提供HandlerMapping、HandlerAdapter。。。。一切尽在代码中

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值