Spring 概述
它最核心的理念是Ioc(控制反转) 和 AOP(面向切面),其中Ioc是Spring的基础,而AOP则是其重要的功能,最为典型的当属数据库事务的使用。
在Spring中,它会认为一切Java类都是资源,而资源都是Bean,容纳这些Bean的是Spring所提供的Ioc容器,所以Spring是一种基于Bean的编程。
Spring所提供的策略:
- 对于POJO的潜力开发,提供轻量级和低侵入的编程,可以通过配置(XML、注解等)来扩展POJO的功能,通过以来注入的理念去扩展功能,建议通过接口编程,强调OOD的开发理念,降低依赖系统耦合度,提高系统可持续性和可扩展性。
- 提供切面编程,尤其是把企业的核心应用—数据库应用,通过切面消除了以前复杂的
try…catch…finally…代码结构,使得开发人员能够把精力更加集中于业务开发而不是技术本身,也避免了try…catch…finally…语句的滥用。 - 为了整合各个框架和技术的应用,Spring提供了模版类,通过模版可以整合各个框架技术,比如Hibernate开发的 HibernateTemplate、支持MyBatis开发的 SqlSessionTemplate、支持Redis开发的RedisTemplate等,这样可以把各种企业用到的技术框架整合到Spring中,提供统一模版,从而使得各种技术用起来更简单。
Spring Ioc
控制反转:是一种通过描述(在Java中可以是XML、或者注解)并通过第三方去产生或获取特定对象的方式。而在Spring中实现控制反转的是Ioc容器,其实现方法是依赖注入。就是说对象的产生依靠Ioc容器,而不是开发者主动行为。
主动创建的模式,责任归于开发者,而在被动的模式下,责任归于Ioc容器。基于这样的被动形式,我们就说对象被控制反转了。
优点:降低对象之间的耦合。
Spring Ioc容器的设计
它主要基于BeanFactory和ApplicationContext两个接口,其中ApplicationContext是BeanFactory的子接口之一,换句话说BeanFactory是Spring Ioc容器所定义的最底层接口,而ApplicationContext是其高级接口之一,并且对BeanFactory功能做了许多用于的扩展,所以在大部分的工作场景下,都会使用ApplicationContext作为Spring Ioc的容器。
Spring Ioc容器的初始化和依赖注入
Bean的初始化和依赖注入在Spring Ioc容器中是两大步骤,它是在初始化之后,才会进行以来注入。
Bean的初始化分3步:
- Resource定位,这步是Spring Ioc容器根据开发者的配置,进行资源定位,在Spring的开发中,通过XML或者注解都是十分常见的方式,定位的内容是开发者所提供的。
- BeanDefinition的载入,这个过程就是Spring根据开发者的配置获取对应的POJO,用以生成对应的实例的过程。
- BeanDefinition的注册,这个步骤就相当于把之前通过BeanDefinition载入的POJO往Spring Ioc容器注册,这样就可以使得开发和测试人员都可以通过描述从中得到Spring Ioc容器的Bean了。
依赖注入:
完成初始化后,Bean就在Spring Ioc容器中得到了初始化,但是没有完成依赖注入,也就是没有注入其配置的资源给Bean,也就是没有注入其配置的资源给Bean,那么它还不能完全使用。对于依赖注入,Spring Bean还有一个配置项—lazy-init,含义就是是否初始化Spring Bean。默认false,Spring Ioc默认会自动初始化Bean。如果是true,那么只有当我们使用Spring Ioc容器的getBean方法获取它时,它才会进行初始化,完成依赖注入。
Spring Bean 的生命周期
Spring Ioc容器的本质目的就是为了管理Bean。对于Bean而言,在容器中存在其生命周期,它的初始化和销毁也需要一个过程。生命周期主要目的是为了了解Spring Ioc容器的初始化和销毁Bean的过程。
步骤:
- 如果Bean实现了接口BeanNameAware的setBeanName方法,那么它就会调用这个方法。
- 如果Bean实现了接口BeanFactoryAware的setBeanFactory方法,那么它就会调用这个方法。
- 如果Bean实现了接口ApplicationContextAware的setApplicationContext方法,且Spring Ioc容器也必须是一个ApplicationContext接口的实现类,那么才会调用这个方法,否则是不调用的。
- 如果Bean实现了接口BeanPostProcessor的postProcessBeforeInitialization方法,那么它就会调用这个方法。
- 如果Bean实现了接口BeanFactoryPostProcessor的afterPropertiesSet方法,那么它就会调用这个方法。
- 如果Bean自定义了初始化方法,它就会调用已定义的初始化方法。
- 如果Bean实现了接口BeanPostProcessor的postProcessAfterInitialization方法,完成了这些调用,这个时候Bean就完成了初始化,那么Bean就生存在Spring Ioc的容器中了,使用者就可以获取Bean的服务。
- 当服务器正常关闭,或者遇到其他关闭Spring Ioc容器的事件,它就会调用对应的方法完成Bean的销毁,步骤如下:
(1)如果Bean实现了接口DisposableBean的destroy方法,那么就会调用它。
(2)如果定义了自定义销毁方法,那么就会调用它。
备注:
(1)上述生命周期接口,大部分是针对单Bean而言的;BeanPostProcessor接口是针对所有Bean而言的;接口DisposableBean则是针对Spring Ioc容器本身。
(2)当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean。换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象
(3)BeanPostProcessor接口作用:
如果我们想在Spring容器中完成bean实例化、配置以及其他初始化方法前后要添加一些自己逻辑处理。我们需要定义一个或多个BeanPostProcessor接口实现类,然后注册到Spring IoC容器中。