一 什么是IOC
IOC即Inversion of Control,控制反转,是面向对象编程中的一种设计原则,可以用来降低机代码之间的耦合度。Spring IOC是将类的依赖关系和生成交给了Spring容器去管理,至于我们自己的app则可以不需要去关系这些对象的产生了。
二 IOC与DI的关系
实现IOC有多种方式,比如DI(Dependency Injection 依赖注入)和DL(Dependency Lookup 依赖查找);因此,DI是实现IOC的一种方式。
三 Spring配置类关系的三种方法,也即Spring编程风格
schemal-based-------xml
annotation-based-----annotation
java-based----java Configuration
四 Spring依赖注入的两种方法
- Constructor-based Dependency Injection:基于构造函数注入
- Setter-based Dependency Injection:基于setter方法注入
五 自动装配
IOC的注入有两个地方需要提供依赖关系,一是类的定义中,二是在spring的配置中需要去描述。自动装配则把第二个取消了,即我们仅仅需要在类中提供依赖,继而把对象交给容器管理即可完成注入。
autowire属性有如下六个取值,他们的说明如下:
1)No:即不启用自动装配。Autowire默认的值。默认情况下,需要通过"ref"来装配bean。
2)byName:按名称装配。可以根据属性的名称在容器中查询与该属性名称相同的bean,如果没有找到,则属性值为null。假设Boss类中有一个名为car的属性,如果容器中刚好有一个名为car的Bean,Spring就会自动将其装配给Boss的car属性。
3)byType:按类型装配。可以根据属性类型,在容器中寻找该类型匹配的bean,如有多个,则会抛出异常,如果没有找到,则属性值为null。假设Boss类中有一个Car类型的属性,如果容器中刚好有一个Car类型的Bean,Spring就会自动将其装配给Boss的这个属性。
4)constructor:与byType方式相似,不同之处在与它应用于构造器参数,如果在容器中没有找到与构造器参数类型一致的bean,那么将抛出异常。(根据构造函数参数的数据类型,进行byType模式的自动装配。)
5)autodetect:通过bean类的自省机制(introspection)来决定是使用constructor还是byType的方式进行自动装配。如果Bean有空构造器那么将采用“byType”自动装配方式,否则使用“constructor”自动装配方式。
6)default:由上级标签<beans>的default-autowire属性确定。
六 springbean的作用域
七 Singleton 当中引用了一个Prototype的bean
Singleton 当中引用了一个Prototype的bean的时候,Prototype bean使用autoware引入的话,在初始的时候生成一个实例,后面不会再生成其他实例。若要发挥Prototype特性,可以使用lookup注解引入。
八 懒加载与非懒加载
懒加载:对象使用的时候才去创建,节省资源,但是不利于提前发现错误。
非懒加载:容器启动的时候立刻创建对象。消耗资源。利于提前发现错误。
当scope=“prototype” (多例)时,默认以懒加载的方式产生对象。
当scope=“singleton” (单例)时,默认以非懒加载的方式产生对象。