Spring学习笔记-Bean初始化销毁
1.bean的初始化操作
1.1通过在配置文件中,设置bean的init-method方法,destory-method方法,spring框架会通过反射机制来调用
java类
package com.crazycoder2010.spring.init; public class InitDestoryMethodBean { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } /** * 当属性被注入完毕后把注入的值打印出来 通常用来检测bean的各个必填属性是否被赋值 */ public void init() { if (name == null) { throw new IllegalArgumentException("name should not be null!!"); } System.out.println("InitMethodBean.init() was called,name=" + name); } /** * 容器销毁时执行 */ public void destory() { System.out.println("InitDestoryMethodBean.destory() was called."); } }
该bean的配置
<bean id="initMethodBean" class="com.crazycoder2010.spring.init.InitDestoryMethodBean" init-method="init" destroy-method="destory"><!-- 这个init-method和destory-method属性是关键 --> <property name="name" value="Kevin" /> </bean>
方法调用
public static void main(String[] args) { InitDestoryMethodBeanTest test = new InitDestoryMethodBeanTest(); test.getBean("initMethodBean"); }
输出
InitMethodBean.init() was called,name=Kevin
1.2实现org.springframework.beans.factory.InitializingBean接口
java类
public class InitDestoryInterfaceBean implements InitializingBean,DisposableBean { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void afterPropertiesSet() throws Exception { if (name == null) { throw new IllegalArgumentException("name should not be null!!"); } System.out.println("InitMethodBean.init() was called,name=" + name); } @Override public void destroy() throws Exception { System.out.println("InitDestoryInterfaceBean.destroy() was called."); } }
bean配置-和普通的bean同样处理
<bean id="initInterfaceBean" class="com.crazycoder2010.spring.init.InitInterfaceBean"> <property name="name" value="Scott" /> </bean>
方法调用
public class InitDestoryInterfaceBeanTest extends BaseConfigurableSpring { public static void main(String[] args){ InitDestoryInterfaceBeanTest test = new InitDestoryInterfaceBeanTest(); test.getBean("initInterfaceBean"); test.beanFactory.destroySingletons(); } }
打印输出
InitMethodBean.init() was called,name=Scott
比较两种初始化方法
两种方式最大的区别在于第二中方式依赖spring框架本身,如果后期需要将spring地换成另一个ioc框架时需要作很大的改动,而第一中方式是不需要的,但是缺点也很明显,这种检查关系不明显,需要在配置文件中显示的去声明,然后才能知道这个方法的用途,其实笔者还是推荐第二中做法,因为实际应用中一旦用了spring,几乎不会去来回换框架折腾的:)
2.bean销毁
这个销毁和初始化类似,但是也有些差别,刚开始写了个destory方法,然后调用,发现怎么也不执行,后来看了下,必须显式的调用以下beanfactory.destroySingletons()方法才能执行:(
重新设计一下我们的基类,因为destorySingletons()方法是在DefaultSingletonBeanRegistry类中定义的
package com.crazycoder2010.spring.init; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import com.crazycoder2010.spring.BaseSpring; public class BaseConfigurableSpring extends BaseSpring { XmlBeanFactory beanFactory ;//这里换成了XmlBeanFactory public Object getBean(String beanName) { init();//确保spring容器已经启动 return beanFactory.getBean(beanName); } private void init() { if (beanFactory == null) { beanFactory = new XmlBeanFactory(new ClassPathResource(configFiles()[0])); } } }
bean的配置和init类似,第一种方案添加destory-method属性,指向销毁的方法,第二种做法是实现org.springframework.beans.factory.InitializingBean接口
Spring学习笔记-Bean初始化销毁相关推荐
- spring扩展点之二:spring中关于bean初始化、销毁等使用汇总,ApplicationContextAware将ApplicationContext注入...
<spring扩展点之二:spring中关于bean初始化.销毁等使用汇总,ApplicationContextAware将ApplicationContext注入> <spring ...
- spring学习笔记02-spring-bean创建的细节问题
spring学习笔记02-spring-bean创建的细节问题 三种创建Bean对象的方式 Bean的作用范围 Bean的生命周期 <?xml version="1.0" e ...
- spring学习笔记(一)创建对象的四种方式
spring学习笔记(一)创建对象的四种方式 一.简介 Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架. 所谓IoC就是Iversion of Control,控制反 ...
- JavaEE——Spring学习笔记03【AOP开发】
JavaEE--Spring学习笔记01[Ioc开发的模式] JavaEE--Spring学习笔记02[Spring和Mybatis的整合] JavaEE--Spring学习笔记03[AOP开发] J ...
- Spring学习笔记(三) AOP_annotation,AOP_XML
在学习课程以前,听说AOP有种很神秘的感觉,好像很好深的技术.其实原理很简单,使用动态代理的方式给程序增加逻辑.与此相似的有struts2中的filter拦截器. 再讲AOP之前先把需求说一下: 同S ...
- spring学习笔记06-spring整合junit(出现的问题,解决的思路)
spring学习笔记06-spring整合junit(出现的问题,解决的思路) 文章目录 spring学习笔记06-spring整合junit(出现的问题,解决的思路) 3.1测试类中的问题和解决思路 ...
- spring学习笔记01-BeanFactory和ApplicationContext的区别
spring学习笔记01-BeanFactory和ApplicationContext的区别 BeanFactory 和 ApplicationContext 的区别 BeanFa ...
- spring学习笔记03-spring-DI-依赖注入详解(通过xml配置文件来配置依赖注入)
spring学习笔记03-spring-DI-依赖注入详解 1.概念 2.构造函数注入 3.set方法注入 4.集合的注入 需要被注入的实体对象 package com.itheima.service ...
- Spring学习笔记:配置单数据源
Spring学习笔记:配置单数据源 一.Spring Boot默认数据源类型 Springboot默认支持4种数据源类型,定义在 org.springframework.boot.autoconfig ...
最新文章
- FMS3系列(二):创建可交互的FMS连接--I can say:Hello World
- wireshark远程抓包
- python函数type的用意_python中type()是什么意思
- python add_argument()用法解析
- goahead 的认证和自定义登陆页面的cookie使用【原创】
- elasticsearch映射相关字段定义,属性定义,及动态映射(marvel插件方式)mapping
- POJ1068 LA2338 HDU1361 ZOJ1016 Parencodings【序列处理+括号匹配】
- LeetCode:每日一题——数位成本和为目标值的最大数字
- webpack 3 零基础入门教程 #16 - 使用 ProvidePlugin 插件来处理像 jQuery 这样的第三方包...
- java档案管理系统_基于JAVA的简单档案管理系统
- AD2017破解步骤
- Appscan漏洞之Authentication Bypass Using HTTP Verb Tampering
- 操作抖音取名项目日赚 500 实战案例分析
- USBKEY全解析---概要介绍
- 植物大战僵尸:逆向分析阳光
- 解决 手机能连接上wifi而电脑却却不能连接上wifi的情况
- 解决win7共享文件夹无法访问
- 在Android中绘制圆角矩形图片
- 深度学习论文: Rethink Dilated Convolution for Real-time Semantic Segmentation及其PyTorch实现
- java异地登录验证_同一帐号异地登录
热门文章
- 最新校园疫情防控进出登记管理PHP系统源码
- 我硕士毕业为什么在佳木斯卖米粉d
- FLUKE DSX2-8000认证级线缆测试仪使用指南
- BeautifulSoup搜索节点的几种方法
- DEFD/4/CPCAR_DROP_MPU:Rate of packets to cpu exceeded the CPCAR limit on the MPU. (Protocol=[STRING]
- python热词关系图_Python 爬取 热词并进行分类数据分析-[拓扑数据]
- SQLServer数据库的附加和分离
- 交换学生(Foreign Exchange, UVa 10763)
- Mac版typroa保姆级科学使用
- L1-043. 阅览室(细节、思维)