经过测试对于具体的一个Bean,执行的流程应该是:

1.实例化:

  常见的有构造(有参、无参)实例化、静态工厂(方法是静态,通过类名.方法返回获取)、实例工厂(专门有个类负责生产对象,需要在bean中配置类和方法名~非静态)

2.注入

  注入有3种(set注入、构造注入、接口注入),如果有注入,则实例化注入对象,注入对象优先完成以下步骤,再注入,再完成bean类的以下步骤。没有注入直接完成下面步骤。

3.传id至方法

  如果当前bean类有实现BeanNameAware接口,并重写setBeanName()方法,先执行此方法。

4.传BeanFactory工厂至方法

  如果当前bean类实现BeanFactroyAware接口,并重写setBeanFactroy()方法,再执行此方法。

5.传ApplicationContext容器至方法

  如果当前bean类实现AapplicationContextAware接口,并重写setApplicationContext()方法,再执行此方法。

6.BeanPostProcessor处理器进行前后预处理

  另外如果存在bean类实现BeanPostProcessor接口,并重写postProcessBeforeInitialization和postProcessAfterInitialization方法。程序会先执行Before(同左)方法再执行init()方法,最后执行After(同左)方法。注意:每个对象实例化过程都会调用此方法。可以用传递的对象对对象内容进行更改。好东西啊。

7.使用代理管理事物(目标方法前打开事物,目标方法后关闭事物)

  在postProcessAfterInitialization方法的返回中使用代理返回。代码如下:

@Override
public Object postProcessAfterInitialization(final Object bean, String beanName)
throws BeansException {
System.out.println("后"+beanName);
return Proxy.newProxyInstance(MyBeanProcessor.class.getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() { @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("-----开启事物-------");
//执行模板方法
Object obj = method.invoke(bean, args);
System.out.println("--------提交事物--------");
return obj;
}
});
}

8.destroy()方法

  此方法可以在bean中进行声明,也可以通过bean类实现DisposableBean接口,重写destroy方法(),执行销毁bean。

小结:程序运行结果:

实现代码:

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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/aop http://www.springframework.org/schema/aop/spring-aop-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/util http://www.springframework.org/schema/util/spring-util-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 此类实现BeanPostProcessor接口 -->
<bean class="com.xx.service.MyBeanProcessor"/> <!-- service -->
<bean id="userService" class="com.xx.service.UserServiceImpl" init-method="init" destroy-method="destroy" scope="singleton">
<property name="userDao" ref="userDao"/>
</bean> <!-- dao -->
<bean id="userDao" class="com.xx.dao.UserDaoImpl"/>
</beans>

service层接口:

package com.xx.service;

public interface UserService {
public void run();
}

Service层实现类:

package com.xx.service;

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.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import com.xx.dao.UserDao;
/**
* userService层实现类
* @author phoebe
*
*/
public class UserServiceImpl implements UserService,BeanNameAware,BeanFactoryAware,ApplicationContextAware,DisposableBean{ private UserDao userDao;
public void setUserDao(UserDao userDao) {
System.out.println("注入dao");
this.userDao = userDao;
}
public UserServiceImpl() {
System.out.println("实例化Service");
}
//目标方法
public void run(){
System.out.println("userService is running");
}
//测试方法
public void testBeanFactoryAware(){
System.out.println("证明bean对象被传送过来了");
} //初始方法
public void init(){
System.out.println("this is init method");
}
//销毁方法
public void destroy(){
System.out.println("this is destroy method");
} @Override
public void setBeanName(String name) {
System.out.println("BeanNameAware:"+name);
} @Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("BeanFactoryAware:"+beanFactory.containsBean("userService"));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
System.out.println("ApplicationContextAware:"+applicationContext.containsBean("userService"));;
}
}

Dao层接口:

package com.xx.dao;

public interface UserDao {

	//测试方法
public void testDao();
}

Dao层实现类:

package com.xx.dao;

public class UserDaoImpl implements UserDao{

	public UserDaoImpl() {
System.out.println("实例化Dao");
}
@Override
public void testDao()
{
System.out.println("Dao is running");
}
}

处理器进行前后预处理

package com.xx.service;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; /**
* 处理器进行前后预处理
* @author phoebe
*
*/
public class MyBeanProcessor implements BeanPostProcessor { @Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("init前:"+beanName);
return bean;
} @Override
public Object postProcessAfterInitialization(final Object bean, String beanName)
throws BeansException {
System.out.println("init后"+beanName);
return Proxy.newProxyInstance(MyBeanProcessor.class.getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() { @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("-----目标方法前:开启事物-------");
//执行模板方法
Object obj = method.invoke(bean, args);
System.out.println("--------目标方法后:提交事物--------");
return obj;
}
});
} }

测试:

package com.xx.test;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.xx.service.UserService;
/**
* spring生命周期测试
* @author phoebe
*
*/
public class UserServiceTest { private ApplicationContext context = null; @Before
public void before(){
String beanPath="classpath:applicationContext.xml";
context = new ClassPathXmlApplicationContext(beanPath);
}
@Test
public void TestApp() throws Exception { UserService userService = context.getBean("userService",UserService.class);
userService.run();
context.getClass().getMethod("close").invoke(context); } }

spring中Bean对象的生命周期的更多相关文章

  1. Spring IOC -bean对象的生命周期详解

    生命周期执行的过程如下:1) spring对bean进行实例化,默认bean是单例2) spring对bean进行依赖注入3) 如果bean实现了BeanNameAware接口,spring将bean ...

  2. Spring中Bean实例的生命周期及其行为

  3. Spring 了解Bean的一生(生命周期)

    转载 https://blog.csdn.net/w_linux/article/details/80086950 该篇博客就来了解IoC容器下Bean的一生吧,也可以理解为bean的生命周期. ## ...

  4. Hibernate中Java对象的生命周期

    一个对象的出生源于我们的一个new操作,当我们使用new语句创建一个对象,这个对象的生命周期就开始了,当我们不在有任何引用变量引用它,这个对象就的生命就此结束,它占用的内存就可以被JVM的垃圾回收器回 ...

  5. Spring 基础知识(二)Spring的bean初始化与生命周期,以及注入

    Spring bean 初始化: 参考博文: https://www.cnblogs.com/luyanliang/p/5567164.html 1. 加载xml 文件. 扫描注解 ,形成bean定义 ...

  6. 【Spring】Bean的LifeCycle(生命周期)

    菜瓜:水稻,上次说Bean的LifeCycle,还没讲完 水稻:啥?说人话? 菜瓜:spring,bean,生命周期 水稻:哦哦,下次直接说人话.说正事,先从BeanFactory.Applicati ...

  7. hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

    三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象 ...

  8. hibernate中持久化对象的生命周期(转载)

    三态的基本概念 1, 临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象: 2 ...

  9. Storm中重要对象的生命周期

    Spout方法调用顺势 declareOutputFields()(调用一次) open() (调用一次) activate() (调用一次) nextTuple() (循环调用 ) deactiva ...

随机推荐

  1. 阻止a标签的默认事件及延伸

    先贴一段代码 <html lang="en"> <head> <meta charset="UTF-8"> <meta ...

  2. Go并发模式:管道与取消

    关键字:Go语言,管道,取消机制,并发,sync.WaitGroup,包引用,通道,defer,select GO并发模式:管道与取消 简介 Go的并发能力可以使构建一个流数据管道变得非常容易,并且可 ...

  3. 【JavaScript的基本语法】

    [JavaScript的基本语法 ] 1.javascript输出 JavaScript语句向浏览器发出的命令.语句的作用是告诉浏览器该做什么. <script>      documen ...

  4. CTSC2017 && APIO2017 && THUSC2017 游记

    一去北京就是近20天,还是回来写写游记吧. 5.6 坐飞机到天津转动车到北京. 5.7 在天坛公园逛了一圈就去报到了. 下午试机,好像没发生什么. 5.8 CTSC一试 T1签到,开个桶打个标记就好了 ...

  5. BZOJ:4659&&BZOJ:2694: Lcm

    Description 给出A,B,考虑所有满足l<=a<=A,l<=b<=B,且不存在n>1使得n^2同时整除a和b的有序数 对(a,b),求其lcm(a,b)之和.答 ...

  6. webstorm中sftp远程调试配制

    sftp:secure file transfer protocol 文件安全传输协议 wb编辑代码,快速同步到远程 1.Tools -> Deployment -> Configurat ...

  7. c#委托事件入门--第二讲:事件入门

    上文 c#委托事件入门--第一讲:委托入门 中和大家介绍了委托,学习委托必不可少的就要说下事件.以下思明仍然从事件是什么.为什么用事件.怎么实现事件和总结介绍一下事件 1.事件是什么:. 1.1 NE ...

  8. IDEA安装vue开发插件

    前言: 开发免不了要用到开发工具,什么sublime,webstorm,idea的,现在我就说下idea开发神器下安装vue插件进行vue项目的开发吧. idea下载地址:http://www.jet ...

  9. 修改DeDe标签Pagelist分页样式,自定义分页样式

    我们在用dede仿站的时候,调用文章列表页的分页时,我们会用到: {dede:pagelist listitem="info,index,end,pre,next,pageno" ...

  10. DEDECMS开启邮箱验证通知的解决方法

    [摘要]织梦CMS是开源内容管理系统,是国内开源CMS的领先品牌,目前程序安装量已达七十万,本文介绍DEDECMS会员注册时,开启邮箱验证通知的解决方法. 在论坛上看到很多人都说这个功能没用,邮箱根本 ...