IOC控制反转:使用set注入后从程序控制转为给用户控制,本质上不用程序员去管理对象的创建,系统的耦合性大大降低。
其是一种通过描述(XML或者注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IOC容器,其实现方法就是依赖注入(Dependency Injection,DI)
Bean标签中:
id即最后getBean获取对象使用的标识
class对应的创建对象的类
property是该类中的成员变量,一定要有set,根据set对成员变量进行赋值创建对象。
--ref引用Spring容器中创建好的对象
--value:具体的值,基本数据类型
IOC创建对象
默认情况下,在Spring容器启动时候创建对象,但是如果bean中存放大量数据,初始化发生在创建对象的时候,数据会过早的驻留在内存中
如果在Spring配置文件中bean配置中有懒加载(lazy-init=“true”),那么bean在调用getBean方法时创建对象。
- 默认使用无参构造创建对象
- 使用有参构造创建对象,无需set(根据下标、类型、名字)
--根据参数下标,index
--根据参数类型,type。不推荐使用,不可类型重复,引用类型一定要使用全限定类型,基本类型可以直接使用
--根据参数名字,name
DI依赖注入
- 构造器注入
- Set注入
--依赖:bean对象的创建依赖于容器
--注入:bean对象中的所有属性由容器来注入
- 拓展方式:c命名空间和p命名空间注入
c命名空间和p命名空间注入
不能直接使用,要引入约束:
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
p命名空间:set注入
c命名空间:构造器注入
Bean scope属性
默认单例模式,共享一个对象,scope=“singleton”
原型模式,每次从容器中get时都会创建新对象 scope=“prototype”
Bean的自动装配
Spring会在上下文中自动寻找,并自动给bean装配属性
三种装配方式:
- xml显示配置
- 在Java中显示配合
- 隐式的自动装配bean(重点)
--xml文件
--autowire:”byName”:需要保证所有的bean唯一,并且bean需要和自动注入的属性的set方法一致。
实际上name对应的是实体类恶set方法名
所以,当id的cat和Person类中setCat2不一致时,无法自动注入。需要将id改成cat2,与set方法保持一致
--autowire:”byType”:需要保证bean的class唯一,并且bean需要和自动注入的属性的类型一致。