IoC的概念
这种将创建对象的权利,之前是我们在程序中主动去创建对象,现在由spring容器创建对象,我们需要时从spring容器中被动获取。称为控制反转。
在spring项目中,将对象理解为Bean,也可以叫bean对象
IOC的流程图
-
BeanDefinition
-
Spring后置处理器
1.BeanFactoryPostProcessor
可以在spring的bean创建之前,修改bean的定义属性
2.BeanPostProcessor
从而实现AOP面向切面编程 -
BeanFactory单列池
Bean的生命周期
bean标签的属性说明
属性 | 说明 |
---|---|
id | 容器中的唯一标识 |
class | 指定类全名,指定的是实现类,不是接口 |
name | 还可以有多个名字、逗号、空格、分号隔开 |
scoped | singleton:默认值,表示这个是单列对象,整个容器中只会创建一个对像prototype:多例对象,每次获取一个新的对象 |
init-method | 创建对象时执行的初始化方法 |
创建容器的方式
配置文件创建容器: ClassPathXmlApplicationContext(“Spring配置文件名字”)
Bean的创建
- 定义接口与实现类
- 创建 Spring 配置文件
在 src/main/resources/目录现创建一个 xml 文件,文件名可以随意,但 Spring 建议的名称为 applicationContext.xml。
spring 配置中需要加入约束文件才能正常使用,约束文件是 xsd 扩展名。
- 使用Bean
注入
- set 注入
创建 java.util.Date 并设置初始的日期时间:
引用类型的注入
- 构造注入
引用类型属性自动注入
对于引用类型属性的注入,也可不在配置文件中显示的注入。可以通过为标签
设置 autowire 属性值,为引用类型属性进行隐式自动注入(默认是不自动注入引用类型属 性)。根据自动注入判断标准的不同,可以分为两种:
byName:根据名称自动注入
byType: 根据类型自动注入
- byName 方式自动注入
当配置文件中被调用者 bean 的 id 值与代码中调用者 bean 类的属性名相同时,可使用byName 方式,让容器自动将被调用者 bean 注入给调用者 bean。容器是通过调用者的 bean类的属性名与配置文件的被调用者 bean 的 id 进行比较而实现自动注入的。
- byType 方式自动注入
使用 byType 方式自动注入,要求:配置文件中被调用者 bean 的 class 属性指定的类,要与代码中调用者 bean 类的某引用类型属性类型同源。即要么相同,要么有 is-a 关系(子类,或是实现类)。但这样的同源的被调用 bean 只能有一个。多于一个,容器就不知该匹配
哪一个了。
基于注解的注入
注解
对于 DI 使用注解,将不再需要在 Spring 配置文件中声明 bean 实例。Spring 中使用注解,需要在原有 Spring 运行环境基础上再做一些改变。
需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解。
定义 Bean 的注解@Component
需要在类上使用注解@Component,该注解的 value 属性用于指定该 bean 的 id 值。
另外,Spring 还提供了 3 个创建对象的注解:
➢ @Repository 用于对 DAO 实现类进行注解
➢ @Service 用于对 Service 实现类进行注解
➢ @Controller 用于对 Controller 实现类进行注解
@Component 不指定 value 属性,bean 的 id 是类名的首字母小写。
注入
简单类型属性注入@Value
byType 自动注入@Autowired
需要在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier 的 value 属性用
于指定要匹配的 Bean 的 id 值。
ByName自动注入@Resource
@Resource 注解若不带任何参数,采用默认按名称的方式注入,按名称不能注入 bean, 则会按照类型进行 Bean 的匹配注入。