• 基础篇——Spring之Bean的生命周期


    ---恢复内容开始---

         Spring中关于Bean的生命周期,我总结的大致过程如下:

        1、用户调用BeanFactory接口的getBean()方法请求一个Bean时,如果容器注册了InstantiationAwareBeanPostProcessor接口则调用postProcessorBeforeInstantiation()方法,这个过程在实例化Bean之前进行。

        2、调用该请求Bean的构造函数进行实例化。

        3、如果容器注册了InstantiationAwareBeanPostProcessor接口则调用postProcessorAfterInstantiation()方法,这个过程在实例化Bean之后进行。

        4、如果配置信息里有<property>调用InstantiationAwareBeanPostProcessor接口下的PostPropertyValues()方法。

        5、调用该请求Bean的set方法设置属性值。

        6、如果该Bean实现了BeanNameAware接口则调用setBeanName()方法,设置bean名称。

        7、如果该Bean实现了BeanFactoryAware接口则调用setBeanFactory()方法,设置BeanFactory容器。 

        8、如果容器注册了BeanPostProcessor后处理器接口则调用 Object postProcessorBeforeInitialization(Object bean,String beanName)方法,其中bean为当前正在处理的bean,beanName为当前Bean的配置名,返回对象为处理后的bean。

        9、如果该 bean实现了InitializingBean接口则调用afterPropertiesSet()方法。

        10、如果在<bean init-method="myInit">中定义了init-method属性则执行该方法。

        11、如果容器注册了BeanPostProcessor后处理器接口则调用Object postProcessorAfterInitialization(Object bean,String beanName)。

        12、如果指定作用域<bean scope="prototype">则将bean返回给调用者,调用者负责该bean的后续管理,如果指定作用域<bean scope="singleton">则将bean放入IOC缓冲池,并将bean返回给调用者,由Spring容器继续管理该bean。

        Spring中Bean生命周期的实例:

    1、新建一个maven项目,pom.xml:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.smart</groupId>
      <artifactId>chapter3</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>war</packaging>
      
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.3.3.RELEASE</version>
        </parent>
        
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <useSystemClassLoader>false</useSystemClassLoader>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>

    2、结构如下红色标记内容:

     3、Car.java类:

    package com.smart.beanfactory;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.BeanFactoryAware;
    import org.springframework.beans.factory.BeanNameAware;
    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.beans.factory.InitializingBean;
    
    public class Car implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {
    
        private String brand;
        
        private String color;
        
        private int maxSpeed;
        
        private BeanFactory beanFactory;
        
        private String beanName;
        
        public Car() {
            // TODO Auto-generated constructor stub
            System.out.println("调用Car()构造函数....");
        }
        
        public void setBrand(String brand) {
            
            System.out.println("调用setBrand()方法设置属性....");
            
            this.brand = brand;
        }
        
        public void introduce() {
            
            System.out.println("brand:"+brand+",color:"+color+",maxSpeed:"+maxSpeed);
        }
        
        public int getMaxSpeed() {
            return maxSpeed;
        }
    
        public void setMaxSpeed(int maxSpeed) {
            
            System.out.println("调用setMaxSpeed()方法设置属性....");
            
            this.maxSpeed = maxSpeed;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            
            System.out.println("调用setColor()方法设置属性....");
            
            this.color = color;
        }
    
        @Override
        public void destroy() throws Exception {
            // TODO Auto-generated method stub
            System.out.println("调用DisposableBean下的destroy()方法....");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            // TODO Auto-generated method stub
            System.out.println("调用InitializingBean下的afterPropertiesSet()方法....");
        }
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            // TODO Auto-generated method stub
            System.out.println("调用BeanFactoryAware下的setBeanFactory()方法....");
            
            this.beanFactory = beanFactory;
        }
    
        @Override
        public void setBeanName(String beanName) {
            // TODO Auto-generated method stub
            System.out.println("调用BeanNameAware下的setBeanName()方法....");
            
            this.beanName = beanName;
        }
        
        public void myInit() {
            
            System.out.println("调用<bean init-method='myInit'>方法,将maxSpeed设置为240....");
            
            this.maxSpeed = 240;
        }
        
        public void myDestroy() {
            
            System.out.println("调用<bean destroy-method='myDestroy'>....");
        }
    
    }

     4、MyInstantiationAwareBeanPostProcessor.java类:

    package com.smart.beanfactory;
    
    import java.beans.PropertyDescriptor;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.PropertyValues;
    import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
    
    public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            // TODO Auto-generated method stub
            if(beanName.equals("car")) {
                
                Car car = (Car)bean;
                
                if(car.getMaxSpeed() >= 200) {
                    
                    System.out.println("调用InstantiationAwareBeanPostProcessorAdapter中的postProcessAfterInitialization()方法...");
                    
                    car.setMaxSpeed(200);
                }
            }
            
            return bean;
        }
    
        @Override
        public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
            // TODO Auto-generated method stub
            if(beanName.equals("car")) {
                
                System.out.println("在实例化Bean之后调用postProcessorAfterInstantiation()方法....");
            }
            
            return true;
        }
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            // TODO Auto-generated method stub
            if(beanName.equals("car")) {
                
                Car car= (Car)bean;
                
                if(car.getColor() == null) {
                    
                    System.out.println("调用InstantiationAwareBeanPostProcessorAdapter中的postProcessorInitialization()方法....");
                    
                    car.setColor("黑色");
                }
            }
            
            return bean;
        }
    
        @Override
        public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
            // TODO Auto-generated method stub
            if(beanName.equals("car")) {
                
                System.out.println("实例化bean之前调用postProcessorBeforeInstantiation()方法...");
            }
            
            return null;
        }
    
        @Override
        public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean,
                String beanName) throws BeansException {
            // TODO Auto-generated method stub
            if(beanName.equals("car")) {
                
                System.out.println("如果配置信息里设置了属性则调用postPropertyValues()方法....");
            }
            
            return pvs;
        }
    
        
    }

    5、BeanLifeCycle.java类:

    package com.smart.beanfactory;
    
    import org.springframework.beans.factory.support.DefaultListableBeanFactory;
    import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.Resource;
    
    public class BeanLifeCycle {
    
        private static void lifeCycleBeanFactory() {
            
            Resource res = new ClassPathResource("bean.xml");
            
            DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
            
            XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
            
            reader.loadBeanDefinitions(res);
            
            beanFactory.addBeanPostProcessor(new MyInstantiationAwareBeanPostProcessor());
            
            Car car1 = (Car) beanFactory.getBean("car");
            
            car1.introduce();
            
            car1.setColor("红色");
            
            Car car2 = (Car) beanFactory.getBean("car");
            
            System.out.println("car1==car2:"+(car1==car2));
            
            beanFactory.destroySingletons();
            
        }
        
        public static void main(String[] args) {
            
            lifeCycleBeanFactory();
        }
    }

    6、bean.xml:

    <?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"
        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-4.0.xsd
           http://www.springframework.org/schema/context 
           http://www.springframework.org/schema/context/spring-context-4.0.xsd
           http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
           
           
        <bean id="car" class="com.smart.beanfactory.Car" init-method="myInit" destroy-method="myDestroy">
            <property name="brand" value="红旗CA72"/>
            <property name="maxSpeed" value="200"/>
        </bean>
    </beans>

    7、运行结果:

  • 相关阅读:
    织梦DEDEcms首页调用文档整篇内容
    dedecms专题列表页不显示标题的解决办法
    怎么让织梦文章按照权重排序
    Codeforces274B
    HDU5693
    HDU2476
    POJ3613
    「LibreOJ NOIP Round #1」旅游路线
    Educational Codeforces Round 48
    组合博弈学习笔记
  • 原文地址:https://www.cnblogs.com/zzb-yp/p/9953860.html
Copyright © 2020-2023  润新知