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初始化销毁相关推荐

  1. spring扩展点之二:spring中关于bean初始化、销毁等使用汇总,ApplicationContextAware将ApplicationContext注入...

    <spring扩展点之二:spring中关于bean初始化.销毁等使用汇总,ApplicationContextAware将ApplicationContext注入> <spring ...

  2. spring学习笔记02-spring-bean创建的细节问题

    spring学习笔记02-spring-bean创建的细节问题 三种创建Bean对象的方式 Bean的作用范围 Bean的生命周期 <?xml version="1.0" e ...

  3. spring学习笔记(一)创建对象的四种方式

    spring学习笔记(一)创建对象的四种方式 一.简介 ​ Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架. ​ 所谓IoC就是Iversion of Control,控制反 ...

  4. JavaEE——Spring学习笔记03【AOP开发】

    JavaEE--Spring学习笔记01[Ioc开发的模式] JavaEE--Spring学习笔记02[Spring和Mybatis的整合] JavaEE--Spring学习笔记03[AOP开发] J ...

  5. Spring学习笔记(三) AOP_annotation,AOP_XML

    在学习课程以前,听说AOP有种很神秘的感觉,好像很好深的技术.其实原理很简单,使用动态代理的方式给程序增加逻辑.与此相似的有struts2中的filter拦截器. 再讲AOP之前先把需求说一下: 同S ...

  6. spring学习笔记06-spring整合junit(出现的问题,解决的思路)

    spring学习笔记06-spring整合junit(出现的问题,解决的思路) 文章目录 spring学习笔记06-spring整合junit(出现的问题,解决的思路) 3.1测试类中的问题和解决思路 ...

  7. spring学习笔记01-BeanFactory和ApplicationContext的区别

    spring学习笔记01-BeanFactory和ApplicationContext的区别 BeanFactory 和 ApplicationContext 的区别           BeanFa ...

  8. spring学习笔记03-spring-DI-依赖注入详解(通过xml配置文件来配置依赖注入)

    spring学习笔记03-spring-DI-依赖注入详解 1.概念 2.构造函数注入 3.set方法注入 4.集合的注入 需要被注入的实体对象 package com.itheima.service ...

  9. Spring学习笔记:配置单数据源

    Spring学习笔记:配置单数据源 一.Spring Boot默认数据源类型 Springboot默认支持4种数据源类型,定义在 org.springframework.boot.autoconfig ...

最新文章

  1. FMS3系列(二):创建可交互的FMS连接--I can say:Hello World
  2. wireshark远程抓包
  3. python函数type的用意_python中type()是什么意思
  4. python add_argument()用法解析
  5. goahead 的认证和自定义登陆页面的cookie使用【原创】
  6. elasticsearch映射相关字段定义,属性定义,及动态映射(marvel插件方式)mapping
  7. POJ1068 LA2338 HDU1361 ZOJ1016 Parencodings【序列处理+括号匹配】
  8. LeetCode:每日一题——数位成本和为目标值的最大数字
  9. webpack 3 零基础入门教程 #16 - 使用 ProvidePlugin 插件来处理像 jQuery 这样的第三方包...
  10. java档案管理系统_基于JAVA的简单档案管理系统
  11. AD2017破解步骤
  12. Appscan漏洞之Authentication Bypass Using HTTP Verb Tampering
  13. 操作抖音取名项目日赚 500 实战案例分析
  14. USBKEY全解析---概要介绍
  15. 植物大战僵尸:逆向分析阳光
  16. 解决 手机能连接上wifi而电脑却却不能连接上wifi的情况
  17. 解决win7共享文件夹无法访问
  18. 在Android中绘制圆角矩形图片
  19. 深度学习论文: Rethink Dilated Convolution for Real-time Semantic Segmentation及其PyTorch实现
  20. java异地登录验证_同一帐号异地登录

热门文章

  1. 最新校园疫情防控进出登记管理PHP系统源码
  2. 我硕士毕业为什么在佳木斯卖米粉d
  3. FLUKE DSX2-8000认证级线缆测试仪使用指南
  4. BeautifulSoup搜索节点的几种方法
  5. DEFD/4/CPCAR_DROP_MPU:Rate of packets to cpu exceeded the CPCAR limit on the MPU. (Protocol=[STRING]
  6. python热词关系图_Python 爬取 热词并进行分类数据分析-[拓扑数据]
  7. SQLServer数据库的附加和分离
  8. 交换学生(Foreign Exchange, UVa 10763)
  9. Mac版typroa保姆级科学使用
  10. L1-043. 阅览室(细节、思维)