1、spring通过BeanFactory灵活配置、管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理;

2、BeanFactory有个ApplicationContext子接口,该接口比BeanFactory增强了更多的功能,该接口的实例有时被称为Spring的上下文,在通常的J2EE应用中,都应该考虑ApplicationContext接口,只有在J2EE应用非常关注内存的情况下,才考虑使用BeanFactory

3、Spring以bean方式管理组件,J2EE的全部组件都被当做bean来管理,Spring中的组件可以是Java对象或者Java组件;

4、在Spring整个应用中,各层的对象都处在Spring的管理下,这些对象以Bean的方式存在,Spring负责创建bean,并且管理其生命周期,bean在Spring容器中运行,无需感受Spring容器的存在,一样可以运行,接受Spring的依赖注入,包括bean的属性注入,合作者注入,依赖关系注入等

注:Spring上下文(ApplicationContext)是产生bean的工厂,bean是工厂产生的实例,产生bean的实例时,需要知道bean的实现类,bean实例的使用者(即调用程序)面向的是接口,无需关心bean实例的实现类,Spring工厂(ApplicationContext)负责维护bean实例的实例化,使用者无需关心实例化。


BeanFactory接口:

BeanFactroy是一个Spring容器,用于创建,配置,管理bean,bean之间的依赖关系也有BeanFactory负责维护;

BeanFactory对bean的实例化过程,无须bean的调用者关心,调用者只需要通过getBean()方法获得指定bean的引用;

创建BeanFactory的实例时,必须提供bean的详细配置信息,bean的详细信息通过XML文件描述,创建BeanFactory实例时,需要提供XML文件作为参数


Bean生命周期:

下图描述了 Bean 的生命周期。它是由 IoC 容器控制。IoC 容器定义 Bean 操作的规则,即 Bean 的定义(BeanDefinition)。Bean 的定义包含了 BeanFactory 在创建 Bean 实例时需要的所有信息。BeanFactory 首先通过构造函数创建一个 Bean 实例,之后它会执行 Bean 实例的一系列之前初始化动作,初始化结束 Bean 将进入准备就绪(ready)状态,这时应用程序就可以获取这些 Bean 实例了。最后,当你销毁单例(Singleton)Bean 时,它会调用相应的销毁方法,结束 Bean 实例的生命周期。

原理图:

详细步骤:

1、实例化(当程序加载applicationContext.xml文件),把bean(前提是scope=singleton)实例化到内存。

2、调用该Bean的setXxx()方法,设置属性。

3、如果实现了bean名字关注接口(BeanNameAware),则可以通过setBeanName获取id号。

4、如果实现了bean工厂关注接口(BeanFactoryAware),则可以获取BeanFactory。

5、如果实现了ApplicationContextAware接口,则可以获得ApplicationContext。

6、如果bean和一个后置处理器关联,则会自动去调用postProcessBeforeInitialization()方法。

7、如果实现InitializingBean接口,则会调用afterPropertiesSet方法。

8、如果配置<bean init-method=”init” /> 则可以在bean自定义初始化方法。

9、如果bean和一个后置处理器关联,则会自动去调用postProcessAfterInitialization()方法。

10、使用bean。

11、容器关闭。

12、可以通过实现DisposableBean接口来调用destory()方法。

13、可以在<bean destory-method=”fun1”/> 调用自定义的销毁方法。


Spring配置文件:

<?xml version="1.0" encoding="utf-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation=" 
            http://www.springframework.org/schema/beans  
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
            http://www.springframework.org/schema/aop  
            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
            http://www.springframework.org/schema/tx  
            http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 
    <!-- 在容器文件中配置bean(service/dao/domain/action/数据源) --> 
    <bean id="personService" init-method="init" destroy-method="myDestory" class="com.pc.beanlife.PersonService"> 
        <!-- 这里注入属性,前提是有setName才能成功 --> 
        <property name="name" value="zs" /> 
    </bean> 
    <!-- 配置后置处理器(类似filter) --> 
    <bean id="myBeanPostProcesseor" class="com.pc.beanlife.MyBeanPostProcesseor" /> 
</beans> 

Bean类文件:

public class PersonService implements BeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean,DisposableBean{ 
    private String name; 
       
    public PersonService() { 
        System.out.println("无参构造方法被调用"); 
    } 
       
    public PersonService(String name) { 
        System.out.println("有参构造方法被调用"); 
    } 
       
    public void printOk(){ 
        System.out.println(name + " is Ok"); 
    } 
   
    public String getName() { 
        return name; 
    } 
   
    public void setName(String name) { 
        System.out.println("调用set方法设置属性"); 
        this.name = name; 
    } 
   
    // 该方法可以给name表示正被实例化的Bean的id 
    @Override 
    public void setBeanName(String name) { 
        // TODO Auto-generated method stub 
        System.out.println("setBeanName 被调用,值是" + name); 
    } 
   
    // 该方法可以传递beanFactory 
    @Override 
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException { 
        // TODO Auto-generated method stub 
        System.out.println("setBeanFactory " + beanFactory); 
           
    } 
   
    // 该方法可以设置上下文 
    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) 
            throws BeansException { 
        // TODO Auto-generated method stub 
        System.out.println("setApplicationContext " + applicationContext); 
    } 
   
    // 该方法可以在InitializingBean使用 
    @Override 
    public void afterPropertiesSet() throws Exception { 
        // TODO Auto-generated method stub 
        System.out.println("afterPropertiesSet"); 
    } 
       
    // 自定义的初始化方法 
    public void init() { 
        System.out.println("调用自定义的初始化方法"); 
    } 
   
    // 可以在这关闭数据连接,socket,文件流,释放资源等等。。。 
    @Override 
    public void destroy() throws Exception { 
        // TODO Auto-generated method stub 
        System.out.println("调用destroy()"); 
    } 
       
    // 自定义我们的销毁方法 
    public void myDestory() { 
        System.out.println("调用自定义的销毁方法"); 
    } 

后置处理器文件:

public class MyBeanPostProcesseor implements BeanPostProcessor { 
    // 后置处理之后的过滤 
    @Override 
    public Object postProcessBeforeInitialization(Object bean, String beanName) 
            throws BeansException { 
        // TODO Auto-generated method stub 
        System.out.println("postProcessBeforeInitialization方法被调用"); 
        return bean; 
    } 
   
    // 后置处理之前的过滤 
    @Override 
    public Object postProcessAfterInitialization(Object bean, String beanName) 
            throws BeansException { 
        // TODO Auto-generated method stub 
        System.out.println("postProcessAfterInitialization方法被调用"); 
        return bean; 
    } 

测试类:

public class Test { 
    public static void main(String[] args) { 
        // TODO Auto-generated method stub 
        // 通过ApplicationContext加载Bean 
        System.out.println("------------在ApplicationContext中Bean的生命周期------------"); 
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/pc/beanlife/beans.xml"); 
        // 获取Bean 
        PersonService personService = (PersonService) applicationContext.getBean("personService"); 
        personService.printOk(); 
           
        // 通过BeanFactory加载Bean 
        System.out.println("------------在BeanFactory中Bean的生命周期------------"); 
        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("com/pc/beanlife/beans.xml")); 
        PersonService personService2 = (PersonService) beanFactory.getBean("personService"); 
        personService2.printOk(); 
    } 

日志文件:

------------在ApplicationContext中Bean的生命周期------------ 
无参构造方法被调用 
调用set方法设置属性 
setBeanName 被调用,值是personService 
setBeanFactory org.springframework.beans.factory.support.DefaultListableBeanFactory@1f8b81e3: defining beans [personService,myBeanPostProcesseor]; root of factory hierarchy 
setApplicationContext org.springframework.context.support.ClassPathXmlApplicationContext@771c8a71: display name [org.springframework.context.support.ClassPathXmlApplicationContext@771c8a71]; startup date [Sat Feb 20 11:34:05 CST 2016]; root of context hierarchy 
postProcessBeforeInitialization方法被调用 
afterPropertiesSet 
调用自定义的初始化方法 
postProcessAfterInitialization方法被调用 
zs is Ok 
------------在BeanFactory中Bean的生命周期------------ 
无参构造方法被调用 
调用set方法设置属性 
setBeanName 被调用,值是personService 
setBeanFactory org.springframework.beans.factory.xml.XmlBeanFactory@6c4fc156: defining beans [personService,myBeanPostProcesseor]; root of factory hierarchy 
afterPropertiesSet 
调用自定义的初始化方法 

Spring之BeanFactory及Bean生命周期的更多相关文章

  1. beanFactory 设计模式 Bean 生命周期的胡言乱语,哈哈

    写在前面的话 适用读者:有一定经验的,本文不适合初学者,因为可能不能理解我在说什么 文章思路:不会一开始就像别的博客文章那样,Bean 的生命周期,源码解读(给你贴一大堆的源码).个人觉得应该由问题驱 ...

  2. Spring源码系列 — Bean生命周期

    前言 上篇文章中介绍了Spring容器的扩展点,这个是在Bean的创建过程之前执行的逻辑.承接扩展点之后,就是Spring容器的另一个核心:Bean的生命周期过程.这个生命周期过程大致经历了一下的几个 ...

  3. beanFactory 设计模式 Bean 生命周期

    写在前面的话 适用读者:有一定经验的,本文不适合初学者,因为可能不能理解我在说什么 文章思路:不会一开始就像别的博客文章那样,Bean 的生命周期,源码解读(给你贴一大堆的源码).个人觉得应该由问题驱 ...

  4. 好记性不如烂笔头85-spring3学习(6)-BeanFactory 于bean生命周期

    假设BeanFactory为了产生.管理Bean, 一个Bean从成立到毁灭.它会经过几个阶段运行. 据我所知,一般bean包括在生命周期:设定,初始化,使用阶段,四个核心阶段销毁. 1.@Bean的 ...

  5. Spring源码 21 Bean生命周期

    参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...

  6. Spring源码之Bean生命周期

    https://www.jianshu.com/p/1dec08d290c1 https://www.cnblogs.com/zrtqsk/p/3735273.html 总结 将class文件加载成B ...

  7. 【不懂】spring bean生命周期

    完整的生命周期(牢记): 1.spring容器准备 2.实例化bean 3.注入依赖关系 4.初始化bean 5.使用bean 6.销毁bean Bean的完整生命週期可以認為是從容器建立初始化Bea ...

  8. Bean生命周期及BeanFactory

    1.spring通过BeanFactory灵活配置.管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理: 2.BeanFactory有个ApplicationCon ...

  9. Spring Bean 生命周期2

    在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Sin ...

随机推荐

  1. Android自定义控件之自定义属性

    前言: 上篇介绍了自定义控件的基本要求以及绘制的基本原理,本篇文章主要介绍如何给自定义控件自定义一些属性.本篇文章将继续以上篇文章自定义圆形百分比为例进行讲解.有关原理知识请参考Android自定义控 ...

  2. 多线程条件通行工具——CyclicBarrier

    CyclicBarrier的作用是,线程进入等待后,需要达到一定数量的等待线程后,再一次性开放通行. CyclicBarrier(int, Runnable)构造方法,参数1为通行所需的线程数量,参数 ...

  3. 前端MVC学习总结(二)——AngularJS验证、过滤器、指令

    一.验证 angularJS中提供了许多的验证指令,可以轻松的实现验证,只需要在表单元素上添加相应的ng属性,常见的如下所示: <input Type="text" ng-m ...

  4. React.js深入学习详细解析

    今天,继续深入学习react.js. 目录: 一.JSX介绍 二.React组件生命周期详解 三.属性.状态的含义和用法 四.React中事件的用法 五.组件的协同使用 六.React中的双向绑定   ...

  5. 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 特殊问题和实战经验(五)

    RAC 特殊问题和实战经验(五) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...

  6. Vertica节点宕机处理一例

    Vertica节点宕机处理一例: 查询数据库版本和各节点状态 常规方式启动宕机节点失败 进一步查看宕机节点的详细日志 定位问题并解决 1. 查询数据库版本和各节点状态 dbadmin=> sel ...

  7. 虚拟IP(VIP)

    高可用性HA(High Availability)指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性.HA系统是目前企业防止核心计算机系统因故 ...

  8. MAC终端命令行下用sublime、vscode、atom打开文件或目录

    要知道,有时候一些小技巧,能极大的加大我们的工作效率. 在MAC下开发,用的最多的还是终端,我的终端环境是iterm2+ohmyzsh:步入正题前先给大家介绍几个小技巧: 第一个: 打开findle, ...

  9. wampserver服务器无法启动(图标颜色不对)

    1.服务器一直无法启动,图标颜色一直显示黄色,并且不可用. 2.解决办法: (1) C:\wamp\bin\apache\apache2.4.9\bin ->httpd.exe  找到该文件 ( ...

  10. php的面向对象

    今天PO一段php的面向对象相关知识吧.面向对象的相关概念和理论知识是很抽象的,要结合现实中的事物来理解,这样有助于类比记忆.还有就是要多接触吧,量变引质变这个应该还是一个硬道理吧,有时候量够了的话, ...