生命周期
时间:2020-04-13
本文章向大家介绍生命周期,主要包括生命周期使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、初始化和销毁
在目标方法执行前后进行初始化或销毁
(1)在Service方法的实现类里面创建初始化方法和销毁方法:
public class StudentServiceImpl implements StudentService { private StudentDao studentDao; public StudentServiceImpl() { System.out.println("service的实现类被创建了!!"); } public StudentDao getStudentDao() { return studentDao; } public void setStudentDao(StudentDao studentDao) { this.studentDao = studentDao; } public void addStudent(){ System.out.println("StudentService的实现类的Add方法!!"); studentDao.addStudent(); } public void myInit(){ System.out.println("初始化方法"); } public void myDestory(){ System.out.println("销毁方法"); } }
(2)配置文件中对初始化方法和销毁方法进行配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <bean id="studentDao" class="pers.zhb.dao.StudentDaoImpl"> </bean> <bean id="studentService" class="pers.zhb.service.StudentServiceImpl" init-method="myInit" destroy-method="myDestory"> <property name="studentDao" ref="studentDao"></property> </bean> </beans>
(3)测试:
public class TestCycle { public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");//创建容器对象 StudentService studentService= (StudentService) applicationContext.getBean("studentService"); studentService.addStudent(); applicationContext.getClass().getMethod("close").invoke(applicationContext); } }
必须执行close方法(这里是利用反射调用的close()方法)后销毁方法才会执行,必须是单例的。
(4)作用:
初始化方法:用于准备数据等
销毁方法:释放资源等
2、BeanPostProcessor后处理Bean
spring提供一种机制,只要实现了BeanPostProcessor接口,并将实现类提供给spring容器,spring容器将会自动执行,在初始化方法前执行before(),初始化方法后执行after()
spring提供工厂勾子,用于修改实例对象,可以生成代理对象,是AOP的底层
(1)创建MyBeanPostProcessor类,实现 BeanPostProcessor 接口:
public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { System.out.println("前方法"+s); return o; } @Override public Object postProcessAfterInitialization(Object o, String s) throws BeansException { System.out.println("后方法"+s); return o; } }
(2)配置文件:
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <bean id="studentDao" class="pers.zhb.dao.StudentDaoImpl"> </bean> <bean id="studentService" class="pers.zhb.service.StudentServiceImpl" init-method="myInit" destroy-method="myDestory"> <property name="studentDao" ref="studentDao"></property> </bean> <bean class="pers.zhb.abc.MyBeanPostProcessor"></bean> </beans>
(3)测试:
public class TestCycle { public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");//创建容器对象 StudentService studentService= (StudentService) applicationContext.getBean("studentService"); studentService.addStudent(); applicationContext.getClass().getMethod("close").invoke(applicationContext); } }
前方法studentDao 后方法studentDao service的实现类被创建了!! 前方法studentService 初始化方法 后方法studentService StudentService的实现类的Add方法!! StudentDao的实现类的Add方法!! 四月 13, 2020 3:54:12 下午 org.springframework.context.support.AbstractApplicationContext doClose 信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@3f91beef: startup date [Mon Apr 13 15:54:11 CST 2020]; root of context hierarchy 销毁方法
(4)动态代理的方式:
public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { System.out.println("前方法"+s); return o; } @Override public Object postProcessAfterInitialization(Object o, String s) throws BeansException { System.out.println("后方法"+s); return Proxy.newProxyInstance(MyBeanPostProcessor.class.getClassLoader(), o.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("开启事务"); //执行目标方法 Object o1=method.invoke(o,args); System.out.println("提交事务"); return o1; } }); } }
前方法studentDao 后方法studentDao service的实现类被创建了!! 前方法studentService 初始化方法 后方法studentService 开启事务 StudentService的实现类的Add方法!! 开启事务 StudentDao的实现类的Add方法!! 提交事务 提交事务 四月 13, 2020 4:09:20 下午 org.springframework.context.support.AbstractApplicationContext doClose 信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@3f91beef: startup date
[Mon Apr 13 16:09:20 CST 2020]; root of context hierarchy 销毁方法
原文地址:https://www.cnblogs.com/zhai1997/p/12692026.html
- 解决Myeclipse下Debug出现Source not found以及sql server中导入数据报错
- Hadoop阅读笔记(七)——代理模式
- 认识ASP.NET MVC的5种AuthorizationFilter
- 2017十大“最差”密码出炉
- SVG图形绘制入门第一弹
- 使用自定义标记来构建页面
- ASP.NET MVC集成EntLib实现“自动化”异常处理[实例篇]
- ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程
- 机器学习实战之决策树
- 初学ReactJS,写了一个RadioButtonList组件
- 今天,你有微信小游戏提交审核吗?
- 云计算,迷你版线程同步
- Kubernetes 年度关键进展回顾
- 比较一下以“反射”和“表达式”执行方法的性能差异
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 1.2 ribbon-客户端负载均衡
- 1. feign的使用及原理
- hadoop案例实现之WordCount (计算单词出现的频数)
- ribbon源码
- feign源码
- DAO层配置绑定weblogic应用服务器的JNDI导致单元测试失败
- 1.操作系统底层工作的基本原理
- ibatis 日常问题总结
- 2.1 并发编程之java内存模型JMM & synchronize & volatile详解
- 使用intellij idea 查看Java字节码
- 2.2 指令重排&happens-before 原则 & 内存屏障
- 设计模式之代理模式(由浅入深)
- jquery param 数据 数组参数序列化
- 3 CPU缓存一致性协议MESi
- 4. synchronized详解