目录
1. 什么是控制反转 IOC
IoC 是指在程序开发中,实例的创建不再由调用者管理,而是由 Spring 容器创建。Spring 容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了 Spring 容器中,控制权发生了反转,这就是 Spring 的 IoC 思想。
2. IoC的两种容器
2.1 BeanFactory
BeanFactory 是基础类型的 IoC 容器,它由 org.springframework.beans.facytory.BeanFactory 接口定义,并提供了完整的 IoC 服务支持。简单来说,BeanFactory 就是一个管理 Bean 的工厂,它主要负责初始化各种 Bean,并调用它们的生命周期方法。
2.2 ApplicationContext
ApplicationContext 是 BeanFactory 的子接口,也被称为应用上下文。该接口的全路径为org.springframework.context.ApplicationContext,它不仅提供了 BeanFactory 的所有功能,还添加了对 i18n(国际化)、资源访问、事件传播等方面的良好支持。
ApplicationContext 接口有两个常用的实现类:
1)ClassPathXmlApplicationContext
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);
2)FileSystemXmlApplicationContext
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation)
3. Spring Bean的生命周期
4. 装配Bean
装配Bean主要有以下三种方式:
- 基于XML装配Bean
- 自动装配Bean
- 基于Annotation装配Bean
4.1 DI依赖注入的实现方式
DI依赖注入的实现方式主要有以下方式:
- 构造方法注入
- 属性setter注入
4.2 使用p标签、c标签装配Bean
4.2.1 p标签
p:<属性名>=“xxx”引入常量值
p:<属性名>-ref=“xxx”引用其他bean对象
4.2.2 c标签
c:<属性名>=“xxx”引入常量值
c:<属性名>-ref=“xxx”引用其他bean对象
4.3 特殊字符注入
如果配置文件中的注入值包括下面这些特殊字符,需要使用转义
序列表示这些字符,或者使用<![CDATA[ ]]>特殊标签
4.4 装配集合
4.5 使用表达式注入-#{表达式}
4.6 自动装配
要使用自动装配,就需要配置 元素的 autowire 属性。
4.7 Annotation常用注解
- @Component
可以使用此注解描述 Spring 中的 Bean,但它是一个泛化的概念,仅仅表示一个组件(Bean),并且可以作用在任何层次。使用时只需将该注解标注在相应类上即可。 - @Repository
用于将数据访问层(DAO层)的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 - @Service
通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 - @Controller
通常作用在控制层(如 Struts2 的 Action),用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 - @Autowired
用于对 Bean 的属性变量、属性的 Set 方法及构造函数进行标注,配合对应的注解处理器完成 Bean 的自动配置工作。默认按照 Bean 的类型进行装配。 - @Qualifier
与 @Autowired 注解配合使用,会将默认的按 Bean 类型装配修改为按 Bean 的实例名称装配,Bean 的实例名称由 @Qualifier 注解的参数指定。 - @Resource
从javax.annotation导入,默认情况下没有,可在http://www.java2s.com/Code/Jar/j/Downloadjavaxannotation30jar.htm下载
其作用与 Autowired 一样。其区别在于 @Autowired 默认按照 Bean 类型装配,而 @Resource 默认按照 Bean 实例名称进行装配。@Resource 中有两个重要属性:name 和 type。
Spring 将 name 属性解析为 Bean 实例名称,type 属性解析为 Bean 实例类型。如果指定 name 属性,则按实例名称进行装配;如果指定 type 属性,则按 Bean 类型进行装配。如果都不指定,则先按 Bean 实例名称装配,如果不能匹配,则再按照 Bean 类型进行装配;如果都无法匹配,则抛出 NoSuchBeanDefinitionException 异常。
以上内容的代码案例,可见视频【轻松搞定Spring全家桶—初识篇】
推荐视频 — Spring 全家桶