Spring容器是Spring框架的核心。在Spring中BeanFactory是IoC容器的实际代表者。
提供了两种不同类型的容器:
一、Spring BeanFactory 容器
最简单容器,给依赖注入(DI)提供了支持。
在Spring中,有大量对BeanFactory接口的实现。最常被使用的是XmlBeanFactory类。这个容器从xml文件中读取配置元数据。
二、Spring ApplicationContext 容器
该容器添加了更多的企业特定的功能。包括BeanFactory容器的所有功能。
Application Context 是 BeanFactory 的子接口,也被称为Spring上下文。
最常被使用的ApplicationContext接口实现:
三、Spring Bean 定义
bean是一个被实例化,组装,并通过Spring IoC容器所管理的对象。这些bean是由容器提供的配置元数据创建的。
1.定义Bean的属性
2.Bean与Spring容器的关系
①读取配置信息(XML、Java类@Configuration、注解@@Autowired)—> Spring容器(Bean定义注册表)
②根据Bean注册表实例化Bean(Bean1、Bean2…)
③将Bean实例 —> Spirng容器(Bean缓存池)
④应用程序使用Bean —> Spring容器(Bean缓存池)
3.Spring配置元数据
有三个重要的方法把配置的元数据提供给spring容器:
四、Spring Bean 作用域
在Spring中定义一个bean时,必须声明该bean的作用域。
Spring框架支持以下五个作用域:
五、Spring Bean 生命周期
Bean的生命周期可以表达为:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁
1.初始化/销毁回调
当一个bean被实例化时,可能需要执行一些初始化使它转为可用状态。同样,当bena不再需要,并且从容器中移除时,可能需要做一些清除工作。
为了定义安装和卸载一个bean,只要声明带有init-method/destroy-method参数的,属性中指定一个方法。
初始化回调:实现InitializingBean 接口指定一个单一的方法afterPropertiesSet()
销毁回调:实现DisposableBean 接口指定一个单一的方法destroy()
2.非Web应用程序环境
如果在非Web应用程序环境中使用 Spring 的 IoC 容器,那么需要在JVM中注册关闭hook。
建议不要使用 InitializingBean 或者 DisposableBean 的回调方法,因为XML配置在命名方法上提供了极大的灵活性。
需要注册一个在AbstractApplicationContext类中声明的关闭hook的registerShutdownHook()方法,AbstractApplicationContext aac= new ClassPathXmlApplicationContext(“Beans.xml”),aac.registerShutdownHook()
3.默认的初始化和销毁方法
如果有太多具有相同名称的初始化或销毁方法的Bean,使用 default-init-method 和 default-destroy-method 属性配置在 beans 上面。
六、Spring Bean 后置处理器
Bean后置处理器是在调用初始化方法前后对Bean进行额外处理。由BeanPostProcessor 接口定义回调方法。
也可以配置多个BeanPostProcessor 接口,通过设置BeanPostProcessor 实现的Ordered 接口提供的order属性来控制执行顺序。
ApplicationContext 会自动检测由BeanPostProcessor 接口的实现定义的bean。
实现BeanPostProcessor 接口重写postProcessBeforeInitialization 和postProcessAfterInitialization 方法,将实现类以bean配置在beans配置文件中,Bean后置处理器在Bean初始化前后执行。
七、Spring Bean 定义继承
bean定义可以包含很多配置信息,子bean的定义继承父定义的配置数据,可以根据需要重写、添加其他值。bean的属性 parent 指定父bean。
1.Bean 定义模板
创建 Bean 定义模板,不需要指定 class 属性,需要指定 abstract 属性为 true。
Spring 框架的核心功能之一,通过依赖注入的方式来管理Bean之间的依赖关系。
两种依赖注入类型:
一、基于构造函数的依赖注入
Constructor-based dependency injection
当容器调用带有一组参数的类构造函数时,基于构造函数的 DI 就完成了,其中每个参数代表一个对其他类的依赖。
创建当前Bean的配置文件xml,多个参数有不同方法实现依赖注入。使用
①构造函数参数与配置文件xml顺序保持一致
②使用简单类型匹配
③最好的传递构造函数参数的方式,使用index属性
④对象引用使用ref属性,传递值使用value属性
二、基于设置函数的依赖注入
Setter-based dependency injection
通过在调用无参数的构造函数或无参数的静态工厂方法实例化 bean 之后容器调用 beans 的 setter 方法来实现的。
创建当前Bean的配置文件xml,使用
三、Spring 注入内部 Beans
inner beans是在其他bean的范围内定义的bean。在
四、Spring 注入集合
传递多个值,Java Collection类型List、Set、Map、Properties
两种情况:
Spring 提供了四种集合配置元素:
一、自动装配模式
使用
二、自动装配的局限性
AOP:面向切面编程,与OOP互为补充,面向切面编程将程序运行过程分解成各个切面。
一、AOP实现
可分为两类:
静态AOP实现性能较好(需要添加@AspectJ支持库),动态性能略差
二、AOP基本概念