博客
关于我
spring的生命周期
阅读量:192 次
发布时间:2019-02-28

本文共 5763 字,大约阅读时间需要 19 分钟。

一 生命周期步骤
bean被载入到容器中时,他的生命周期就开始了:
1、容器寻找bean的定义信息并实例化。
2、使用依赖注入,spring按bean定义信息配置bean的所有属性。
3、若bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递bean的ID。
4、若bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。
5、若BeanPostProcessor(bean后置处理器)和bean关联,则它们的postProcessBeforeInitialization()方法被调用。 
6、如果你实现InitializingBean 接口,则会调用 afterPropertiesSet()方法。
7、若bean指定了ini-method方法,它将被调用。
8、最后,若有BeanPostProcessor和bean关联,则它们的postProcessAfterInitialization()方法被调用。
9、使用我们的bean。
11、容器关闭。
12、可以通过实现DisposableBean接口来调用方法destory() 。
13、可以在<bean destory-method=”fun1”/> 调用定制的销毁方法。
我们实际开发中往往没有用的这么的过程。
二 生命周期图
1 针对ApplicationContext
2 针对BeanFactory
通过BeanFactory来获取bean对象,bean的生命周期和Applicationcontext是不一样的,bean是工厂中创建的生命周期会简单一些。
三 代码示例
1 PersonService
package com.hsp.beanlife;import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;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;import org.springframework.beans.factory.config.BeanPostProcessor;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;public class PersonService implements BeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean,DisposableBean {        private String name;        private Integer age;        public Integer getAge() {                return age;        }        public void setAge(Integer age) {                this.age = age;        }        public String getName() {                return name;        }                public PersonService(String abc){                System.out.println("PersonService 函数");        }                public PersonService(){                System.out.println("PersonService 函数");        }        public void setName(String name) {                System.out.println("setName(String name) 函数");                this.name = name;        }                public void sayHi(){                System.out.println("hi "+ name);        }        //该方法可以给arg0表示正在被实例化得bean id        public void setBeanName(String arg0) {                // TODO Auto-generated method stub                System.out.println("setBeanName 被调用 值"+arg0);                        }        //该方法可以传递beanFactroy        public void setBeanFactory(BeanFactory arg0) throws BeansException {                // TODO Auto-generated method stub                System.out.println("setBeanFactory "+arg0);        }        //该方法传递ApplicationContext        public void setApplicationContext(ApplicationContext arg0)                        throws BeansException {                // TODO Auto-generated method stub                System.out.println("setApplicationContext"+arg0);                        }        public void init(){                System.out.println("我自己的init方法");        }                //             public void afterPropertiesSet() throws Exception {                // TODO Auto-generated method stub                System.out.println("afterPropertiesSet()");        }        //定制我们的销毁方法        @PreDestroy        public  void mydestory(){                System.out.println("释放各种资源");        }        @Override        public void destroy() throws Exception {                // TODO Auto-generated method stub                System.out.println("关闭各种资源");        }}
2 MyBeanPostProcessor
package com.hsp.beanlife;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPostProcessor implements BeanPostProcessor {    public Object postProcessAfterInitialization(Object arg0, String arg1)            throws BeansException {        // TODO Auto-generated method stub        System.out.println("postProcessAfterInitialization 函数被调用");                return arg0;    }    public Object postProcessBeforeInitialization(Object arg0, String arg1)            throws BeansException {        // TODO Auto-generated method stub        System.out.println("postProcessBeforeInitialization 函数被调用");        System.out.println(arg0+" 被创建的时间是"+new java.util.Date());        return arg0;    }}
3 beans.xml
xiaoming
4 App1
package com.hsp.beanlife;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.xml.XmlBeanFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.core.io.ClassPathResource;public class App1 {    /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        ApplicationContext ac=new ClassPathXmlApplicationContext("com/hsp/beanlife/beans.xml");                PersonService ps1 = (PersonService) ac.getBean("personService");        ps1.sayHi();            }}
四 运行结果
PersonService 函数
setName(String name) 函数
setBeanName 被调用 值personService
setBeanFactory org.springframework.beans.factory.support.DefaultListableBeanFactory@c573aba: defining beans [personService,myBeanPostProcessor]; root of factory hierarchy
setApplicationContextorg.springframework.context.support.ClassPathXmlApplicationContext@532cc66f: display name [org.springframework.context.support.ClassPathXmlApplicationContext@532cc66f]; startup date [Fri Oct 27 22:28:31 CST 2017]; root of context hierarchy
postProcessBeforeInitialization 函数被调用
com.hsp.beanlife.PersonService@39c9eaf8 被创建的时间是Fri Oct 27 22:28:32 CST 2017
afterPropertiesSet()
我自己的init方法
postProcessAfterInitialization 函数被调用
hi xiaoming
你可能感兴趣的文章
mysql Timestamp时间隔了8小时
查看>>
Mysql tinyint(1)与tinyint(4)的区别
查看>>
mysql union orderby 无效
查看>>
mysql v$session_Oracle 进程查看v$session
查看>>
mysql where中如何判断不为空
查看>>
MySQL Workbench 使用手册:从入门到精通
查看>>
mysql workbench6.3.5_MySQL Workbench
查看>>
MySQL Workbench安装教程以及菜单汉化
查看>>
MySQL Xtrabackup 安装、备份、恢复
查看>>
mysql [Err] 1436 - Thread stack overrun: 129464 bytes used of a 286720 byte stack, and 160000 bytes
查看>>
MySQL _ MySQL常用操作
查看>>
MySQL – 导出数据成csv
查看>>
MySQL —— 在CentOS9下安装MySQL
查看>>
MySQL —— 视图
查看>>
mysql 不区分大小写
查看>>
mysql 两列互转
查看>>
MySQL 中开启二进制日志(Binlog)
查看>>
MySQL 中文问题
查看>>
MySQL 中日志的面试题总结
查看>>
mysql 中的all,5分钟了解MySQL5.7中union all用法的黑科技
查看>>