SpringBoot的自动装配 起源于 spring Framework的手动装配。

spring模式注解装配:



定义:一种用于声明在应用中扮演“组件”角色的注解
举例:Component    Service    Configuration  Controller等注解
装配:<context:component-scan> spring2.5 或者 ComponentScan注解 spring3.1





springboot 设置对象状态参数默认为1_实例化


springboot 设置对象状态参数默认为1_实例化_02


springboot 设置对象状态参数默认为1_实例化_03


springboot 设置对象状态参数默认为1_spring_04


springboot 设置对象状态参数默认为1_spring_05


什么是派生性?下来创建一个空的springboot工程: 然后添加包和代码:


springboot 设置对象状态参数默认为1_实例化_06


springboot 设置对象状态参数默认为1_spring_07


springboot 设置对象状态参数默认为1_实例化_08


现在FirstLevelRepository是一个注解,肯定要用到某个类上面去,所以继续建包建类

创建repository包然后建立MyFirstLevelRepository类,给类上添加FirstLevelRepository注解,然后这个MyFirstLevelRepository类就会成为一个Bean


springboot 设置对象状态参数默认为1_spring_09


如何说明MyFirstLevelRepository类成为了一个bean呢?

再添加一个包,添加一个启动类:


springboot 设置对象状态参数默认为1_spring_10


上图中少了一句输出的代码,否则控制台看不到


springboot 设置对象状态参数默认为1_实例化_11


运行看结果:可以看到这个bean存在。


springboot 设置对象状态参数默认为1_实例化_12


修改注解:


springboot 设置对象状态参数默认为1_spring_13


再次运行代码:会发现这个类也是存在的。


springboot 设置对象状态参数默认为1_实例化_14


springboot 设置对象状态参数默认为1_spring_15



Spring @Enable 模块装配

Spring Framework 3.1 开始支持”@Enable 模块驱动“。所谓“模块”是指具备相同领域的功能组件集合, 组合所形成一个独立的单元。比如 Web MVC 模块、AspectJ代理模块、Caching(缓存)模块、JMX(Java 管 理扩展)模块、Async(异步处理)模块等。

@Enable 注解模块举例


springboot 设置对象状态参数默认为1_实例化_16


springboot 设置对象状态参数默认为1_实例化_17


springboot 设置对象状态参数默认为1_spring_18


springboot 设置对象状态参数默认为1_实例化_19


springboot 设置对象状态参数默认为1_spring_20


springboot 设置对象状态参数默认为1_实例化_21




springboot 设置对象状态参数默认为1_spring_22


看一下这个实现类:SpringFactoriesLoader


springboot 设置对象状态参数默认为1_实例化_23


看一下这个类的注释:


springboot 设置对象状态参数默认为1_spring_24


意思是:


*框架内用于内部使用的通用工厂加载机制。
{@code SpringFactoriesLoader} {@linkplain #loadFactories加载}和实例化

*来自{@value #FACTORIES_RESOURCE_LOCATION}文件的给定类型的工厂

*可能存在于类路径中的多个JAR文件中。{@code spring.factories}

*文件必须是{@link Properties}格式,其中的键是完全限定的

*接口或抽象类的名称,其值是用逗号分隔的列表

实现类名。


主要实现方法是:


springboot 设置对象状态参数默认为1_实例化_25


注释的意思是:


* *

加载并实例化给定类型的工厂实现

* {@value #FACTORIES_RESOURCE_LOCATION},使用给定的类装入器。

*

返回的工厂是通过{@link AnnotationAwareOrderComparator}排序的。

*

如果需要自定义实例化策略,使用{@link #loadFactoryNames}

*取得所有已登记的工厂名称。

* @param factoryType接口或表示工厂的抽象类

* @param类加载器用于加载的类加载器(可以是{@code null}来使用默认值)

* @抛出IllegalArgumentException如果任何工厂实现类不能

*加载或在实例化任何工厂时发生错误

* @see # loadFactoryNames

* /