组件自动装配
组件:带有@Component的注解的
自动:spring在启动的时候 加载spring.factory文件时,自动加载
装配:将需要使用组件,自动装配好放到spring容器中
一:Starter的作用
1:管理jar包
2:starter完成bean的配置,解决怎么装配到spring中
3:怎么拿到外部xml的配置,即外部化配置
二:手写Start
- 1:snf-redis.jar 写好后,这个是具体的业务逻辑
- 2:snf-redis-spring-boot-start.jar 这个是管理snf-redis.jar,在pom中加入nsf-redis.jar包
- 3: snf-redis-spring-boot-autoconfig 在pom文件中加入snf-redis-spring-boot-start.jar包
- 4:完成组件的自动装配-将snf-redis中的类装到spring容器中
4.4.1:在snf-redis-spring-boot-autoconfig 创建META-INF- spring.factories文件, 建一个RedisAutoConfig类 类上有@Configuration这个是一个配置类里面用javaconfig的方式new 一个实例
4.4.2:META-INF- spring.factories文件 加入RedisAutoConfig 这个就可以了
3:自定义条件注解
类似@ConditionOnClass
spring中有implements Condition 接口,这个需要实现Condition接口的matches方法,在里面加载条件类,这样Class.forName()方式加载。
3.1:类加载顺序
- @AutoConfigureAfter,在某些类加载后加载
- @AutoConfigureBefore 在某些类加载之前加载
- @AutoConfigureOrder 绝对顺序配置优先级(值越小优先级越高)
4:外部化配置
写个装配类 ,这类是用来接要接的字段
@ConfigurationProperties(prefix="com.mysql.password")
@EnableConfigurationProperties(接受字段的类)在用的类上加此注解
在使用的地方 @Autowired 注入就可以用了,通过get 方式获取到 外部化配置的值
在配置文件中可以联想出来 在pom.xml中 加入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
spring的命名规范
spring-boot-start-xxx-x.y.z.jar
spring-boot-xxx-autoconfig-x.y.z.jar
第三方
xxx-spring-boot-start-x.y.z.jar
xxx-spring-boot-autoconfig-x.y.z.jar
注:看下源码 是如何解决外部化配置的
1:模板模式
public Abstract windqListernerHander<T>
两个主要方法:1:parse()抽象的方法子类实现 2:hadlerBizz()业务继承 xml和json来实现
解析xml和json格式的信息
AbstractXmlWindqListernerHander extends windqListernerHander
Class dtoClass = (Class)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 获取对象T
AbstractJsonWindqListernerHander extends windqListernerHander