SpringBoot的自动装配 起源于 spring Framework的手动装配。
spring模式注解装配:
定义:一种用于声明在应用中扮演“组件”角色的注解
举例:Component Service Configuration Controller等注解
装配:<context:component-scan> spring2.5 或者 ComponentScan注解 spring3.1
![daca8d05ae35b97905ab14eb77c07002.png](https://img-blog.csdnimg.cn/img_convert/daca8d05ae35b97905ab14eb77c07002.png)
![9091c34ec30e79ff72d61bcefee585b3.png](https://img-blog.csdnimg.cn/img_convert/9091c34ec30e79ff72d61bcefee585b3.png)
![2e050d3ddf9e205f972e19f738e19d59.png](https://img-blog.csdnimg.cn/img_convert/2e050d3ddf9e205f972e19f738e19d59.png)
![048fdc0a6c55ac71259d76429cfd24b5.png](https://img-blog.csdnimg.cn/img_convert/048fdc0a6c55ac71259d76429cfd24b5.png)
![78554226adfadb331b441faee0096858.png](https://img-blog.csdnimg.cn/img_convert/78554226adfadb331b441faee0096858.png)
什么是派生性?下来创建一个空的springboot工程: 然后添加包和代码:
![0a52f4a392303fc803232b314fd8ee54.png](https://img-blog.csdnimg.cn/img_convert/0a52f4a392303fc803232b314fd8ee54.png)
![d531de261675c78bbca47476f2fa69ae.png](https://img-blog.csdnimg.cn/img_convert/d531de261675c78bbca47476f2fa69ae.png)
![c44e5c8d7fa436d1bb359424245a7467.png](https://img-blog.csdnimg.cn/img_convert/c44e5c8d7fa436d1bb359424245a7467.png)
现在FirstLevelRepository是一个注解,肯定要用到某个类上面去,所以继续建包建类
创建repository包然后建立MyFirstLevelRepository类,给类上添加FirstLevelRepository注解,然后这个MyFirstLevelRepository类就会成为一个Bean
![714365ce3a298860ca1f75503cfedf6b.png](https://img-blog.csdnimg.cn/img_convert/714365ce3a298860ca1f75503cfedf6b.png)
如何说明MyFirstLevelRepository类成为了一个bean呢?
再添加一个包,添加一个启动类:
![9e2929fa6c78e7a213a8fecdc1a5d4e5.png](https://img-blog.csdnimg.cn/img_convert/9e2929fa6c78e7a213a8fecdc1a5d4e5.png)
上图中少了一句输出的代码,否则控制台看不到
![a3183e333416fc3e9abed50b69ce26aa.png](https://img-blog.csdnimg.cn/img_convert/a3183e333416fc3e9abed50b69ce26aa.png)
运行看结果:可以看到这个bean存在。
![97f46e2382f89885c48272ff99b98857.png](https://img-blog.csdnimg.cn/img_convert/97f46e2382f89885c48272ff99b98857.png)
修改注解:
![d0fad92e9492968ec5c3c415adda1f70.png](https://img-blog.csdnimg.cn/img_convert/d0fad92e9492968ec5c3c415adda1f70.png)
再次运行代码:会发现这个类也是存在的。
![41e519352fdf15d5ab47f2fd605f5ec4.png](https://img-blog.csdnimg.cn/img_convert/41e519352fdf15d5ab47f2fd605f5ec4.png)
![65ba8c519b22af7887ea504ce546b1c5.png](https://img-blog.csdnimg.cn/img_convert/65ba8c519b22af7887ea504ce546b1c5.png)
Spring @Enable 模块装配
Spring Framework 3.1 开始支持”@Enable 模块驱动“。所谓“模块”是指具备相同领域的功能组件集合, 组合所形成一个独立的单元。比如 Web MVC 模块、AspectJ代理模块、Caching(缓存)模块、JMX(Java 管 理扩展)模块、Async(异步处理)模块等。
@Enable 注解模块举例
![3b2442e17335b4cc960471b18689c6f9.png](https://img-blog.csdnimg.cn/img_convert/3b2442e17335b4cc960471b18689c6f9.png)
![48a31af31b5a7ffa93fb9c89b5f293d4.png](https://img-blog.csdnimg.cn/img_convert/48a31af31b5a7ffa93fb9c89b5f293d4.png)
![e45a010b897a5520c386defc6aeb8ac9.png](https://img-blog.csdnimg.cn/img_convert/e45a010b897a5520c386defc6aeb8ac9.png)
![6d7a26b76a848aa2d6398b99e4882634.png](https://img-blog.csdnimg.cn/img_convert/6d7a26b76a848aa2d6398b99e4882634.png)
![f32931d303391314b8dbd6749139a682.png](https://img-blog.csdnimg.cn/img_convert/f32931d303391314b8dbd6749139a682.png)
![7aebe2d1791eaf6d7548c99dfd2bd780.png](https://img-blog.csdnimg.cn/img_convert/7aebe2d1791eaf6d7548c99dfd2bd780.png)
![9e842b808532655e36ffd15cddc1c126.png](https://img-blog.csdnimg.cn/img_convert/9e842b808532655e36ffd15cddc1c126.png)
看一下这个实现类:SpringFactoriesLoader
![510a73381addeffdacea20259e84a17d.png](https://img-blog.csdnimg.cn/img_convert/510a73381addeffdacea20259e84a17d.png)
看一下这个类的注释:
![6400847b9fd5c62582069361cd1950ed.png](https://img-blog.csdnimg.cn/img_convert/6400847b9fd5c62582069361cd1950ed.png)
意思是:
*框架内用于内部使用的通用工厂加载机制。
{@code SpringFactoriesLoader} {@linkplain #loadFactories加载}和实例化
*来自{@value #FACTORIES_RESOURCE_LOCATION}文件的给定类型的工厂
*可能存在于类路径中的多个JAR文件中。{@code spring.factories}
*文件必须是{@link Properties}格式,其中的键是完全限定的
*接口或抽象类的名称,其值是用逗号分隔的列表
实现类名。
主要实现方法是:
![2e2f84790d2ec9dc45c0f7bd6569d5cf.png](https://img-blog.csdnimg.cn/img_convert/2e2f84790d2ec9dc45c0f7bd6569d5cf.png)
注释的意思是:
* *
加载并实例化给定类型的工厂实现
* {@value #FACTORIES_RESOURCE_LOCATION},使用给定的类装入器。
*
返回的工厂是通过{@link AnnotationAwareOrderComparator}排序的。
*
如果需要自定义实例化策略,使用{@link #loadFactoryNames}
*取得所有已登记的工厂名称。
* @param factoryType接口或表示工厂的抽象类
* @param类加载器用于加载的类加载器(可以是{@code null}来使用默认值)
* @抛出IllegalArgumentException如果任何工厂实现类不能
*加载或在实例化任何工厂时发生错误
* @see # loadFactoryNames
* /