zoukankan      html  css  js  c++  java
  • 五、bean的生命周期

    一、如果是ApplicationContext加载xml,则加载的时候就bean的生命周期就开始了,如果是BeanFactory加载xml,则getbean的时候bean的生命周期才开始。

      Bean的生命周期大致如下(前提是beanscope=”singleton”,如果scope不为这个,则没这么复杂)

    1. 实例化
    2. 设置属性
    3. 调用setBeanName方法(如果bean实现了BeanNameAware接口)
    4. 调用setBeanFactory方法(如果bean实现了BeanFactoryAware接口)
    5. 调用setApplicationContext方法(如果bean实现了ApplicationContextAware接口)
    6. 调用postProcessBeforeInitialization方法(如果项目配置了后置处理器)
    7. 调用afterPropertiesSet方法(如果bean实现了InitializingBean接口)
    8. 调用定制的初始化方法(如果定制了初始化方法)
    9. 调用postProcessAfterInitialization方法(如果项目配置了后置处理器)
    10. Bean可以使用了
    11. 容器关闭
    12. 调用destory方法(如果bean实现了DisposableBean接口)
    13. 调用定制的销毁方法(如果定制了销毁方法)

    二、

    1. 实例化

      容器寻找bean的定义信息并实例化,调用构造函数(默认调用无参构造函数,如果没有无参构造函数且没给bean配置factory-method会报错)

    2. 设置属性

        调用属性的set方法注入属性

       3.设置属性

        如果你的bean实现了BeanNameAware接口,则bean在执行完前面的内容的时候就会执行setBeanName()函数,你可以在这个函数里操作beanid,如输出id

    @Override
        public void setBeanName(String arg0) {
            // TODO Auto-generated method stub
            System.out.println("person类正在被配备id-->"+arg0);
        }

      4.调用setBeanFactory方法(如果bean实现了BeanFactoryAware接口)

    @Override
        public void setBeanFactory(BeanFactory arg0) throws BeansException {
            // TODO Auto-generated method stub
            System.out.println("正在给Person类配备BeanFactory "+arg0);
        }

      5.setApplicationContext方法(如果bean实现了ApplicationContextAware接口)

    @Override
        public void setApplicationContext(ApplicationContext arg0)
                throws BeansException {
            // TODO Auto-generated method stub
            System.out.println(arg0);
        }

      6.调用postProcessBeforeInitialization方法(如果项目配置了后置处理器)

      项目中有一个类实现了BeanPostProcessor接口,并在xml中配置了的bean称为后置处理器,类似于过滤器filter

    package com.myz.bean;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    
    public class MyBeanPostProcessor implements BeanPostProcessor {
    
        @Override
        public Object postProcessAfterInitialization(Object arg0, String arg1)
                throws BeansException {
            // TODO Auto-generated method stub
            System.out.println("postProcessAfterInitialization正在执行");
            return arg0;
        }
    
        @Override
        public Object postProcessBeforeInitialization(Object arg0, String arg1)
                throws BeansException {
            // TODO Auto-generated method stub
            System.out.println("postProcessBeforeInitialization正在执行");
            return arg0;
        }
    
    }
    <bean id="myBeanPostProcessor" class="com.myz.bean.MyBeanPostProcessor">

      7.调用afterPropertiesSet方法(如果bean实现了InitializingBean接口)

      如果bean实现了InitializingBean接口,则可以在函数afterPropertiesSet中进行设置完属性的操作

    @Override
        public void afterPropertiesSet() throws Exception {
            // TODO Auto-generated method stub
            System.out.println("已经设置完所有属性");
        }

      8.调用定制的初始化方法(如果定制了初始化方法)

    public void init(){
            System.out.println("执行我自己的init方法");
        }
    <bean id="person" init-method="init" class="com.myz.bean.Person">
            <property name="name" value="小明"/>
        </bean>

      9.执行后置处理器的后过程函数(如果有后置处理器)

     @Override
        public Object postProcessAfterInitialization(Object arg0, String arg1)
                throws BeansException {
            // TODO Auto-generated method stub
            System.out.println("postProcessAfterInitialization正在执行");
            return arg0;
        }

      10.Bean可以使用了

      11.使用完成后关闭容器

      12.调用destory方法(如果bean实现了DisposableBean接口)

       在容器关闭后,调用destroy方法(如果bean实现了DisposableBean接口),但是由于容器关闭的时候(一般指项目关闭了),我们一般看不到函数里面的内容执行了。

    @Override
        public void destroy() throws Exception {
            // TODO Auto-generated method stub
            
        }

      13.调用定制的销毁方法(如果定制了销毁方法)

    @Override
        public void destroy() throws Exception {
            // TODO Auto-generated method stub
            
        }
    <bean id="person" destroy-method="myDestroy" class="com.myz.bean.Person">

    三、在一般的项目中,bean没有那么复杂的生命周期,一般为1->2->6->9->10->11

      而且定制初始化方法和定制销毁方法可以采用注解的方式,具体操作为:

      ①添加注解

      

    @PostConstruct
        public void init(){
            System.out.println("执行我自己的init方法");
        }
    @PreDestroy
        public void myDestroy(){
            
        }

    ②启用注解,告诉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:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation=
        "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context  
        http://www.springframework.org/schema/context/spring-context-3.1.xsd
        ">
    
       <!--或者使用 <context:annotation-config /> 扫描--> <context:component-scan base-package="com.myapp.core.jsr330"/> <bean id="person" class="com.myz.bean.Person"> <property name="name" value="小明"/> </bean> </beans>
  • 相关阅读:
    JavaScript设计模式_11_中介者模式
    JavaScript设计模式_10_职责链模式
    JavaScript设计模式_09_享元模式
    JavaScript设计模式_08_模板方法模式
    JavaScript设计模式_07_组合模式
    JavaScript设计模式_06_命令模式
    JavaScript设计模式_05_发布订阅模式
    PyTorch Notes | PyTorch 编程实践笔记
    Linux Notes | Linux常用命令行笔记
    CAS邮箱的Express配置
  • 原文地址:https://www.cnblogs.com/myz666/p/8194697.html
Copyright © 2011-2022 走看看