2017-11-06 18:59:30

  • Bean初始化和销毁方法

配置初始化和销毁的方法:
* init-method=”setup”
* destroy-method=”teardown”
执行销毁的时候,必须手动关闭工厂,而且只对scope=” singleton ”(也就是默认值)有效。

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="bean" class="spring3.Bean" init-method="setup" destroy-method="teardown">
<property name="s" value="hello"/>
</bean> </beans>

代码文件:

public class Bean {
private String s; public void setS(String s) {
this.s = s;
} public void setup(){
System.out.println("这是初始化方法");
} public void teardown(){
System.out.println("这是销毁方法");
}
} public class Spring3 { @Test
public void demo1(){
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("" +
"config2.xml"); Bean b = (Bean) ac.getBean("bean"); // 只有ClassPathXmlApplicationContext有close()方法,ApplicationContext没有
ac.close();
}
}
  • Bean的生命周期

Bean的生命周期的个步骤:
1.instantiate bean对象实例化
2.populate properties 封装属性
3.如果Bean实现BeanNameAware 执行 setBeanName(让当前类了解Spring容器)
4.如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象setApplicationContext(让当前类了解Spring容器)
5.如果存在类实现 BeanPostProcessor(前处理Bean) ,执行postProcessBeforeInitialization
6.如果Bean实现InitializingBean 执行 afterPropertiesSet
7.调用<bean init-method="init"> 指定初始化方法 init
8.如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessAfterInitialization
9.执行业务处理
10.如果Bean实现 DisposableBean 执行 destroy
11.调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="bean" class="spring3.Bean" init-method="setup" destroy-method="teardown">
<property name="s" value="hello"/>
</bean> <!--后处理bean不需要添加id,系统会自动调用-->
<bean class="spring3.MyBeanPostProcessor"/> </beans>

代码文件:

public interface B {
public void add();
} public class Bean implements B,DisposableBean,BeanNameAware,ApplicationContextAware,InitializingBean{
private String s; Bean(){
System.out.println("第一步:默认构造方法");
} public void setS(String s) {
System.out.println("第二步:属性注入");
this.s = s;
} public void add(){
System.out.println("第九步:处理业务逻辑");
System.out.println("这是添加方法");
} public void setup(){
System.out.println("第七步:这是初始化方法");
} public void teardown(){
System.out.println("这是销毁方法");
} @Override
public void setBeanName(String s) {
System.out.println("第三步:注入配置的id号"+s);
} @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("第四步:注入ApplicationContext"+applicationContext);
} @Override
public void afterPropertiesSet() throws Exception {
System.out.println("第六步:属性设置后执行");
} @Override
public void destroy() throws Exception {
System.out.println("第十步:Spring调用销毁方法");
}
}

自定义的 BeanPostProcessor

public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* bean:实例对象
* beanName:在配置文件中配置的类的标识.
*/
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("第五步:初始化之前执行...");
return bean;
} public Object postProcessAfterInitialization(final Object bean, String beanName)
throws BeansException {
System.out.println("第八步:初始化后执行...");
return bean;
}
}

结果:

    public void demo1(){
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("" +
"config2.xml"); Bean b = (Bean) ac.getBean("bean");
b.add();
// 只有ClassPathXmlApplicationContext有close()方法,ApplicationContext没有
ac.close();
} 输出:
第一步:默认构造方法
第二步:属性注入
第三步:注入配置的id号bean
第四步:注入ApplicationContextorg.springframework.context.support.ClassPathXmlApplicationContext@6591f517: startup date [Mon Nov 06 19:50:53 CST 2017]; root of context hierarchy
第五步:初始化之前执行...
第六步:属性设置后执行
第七步:这是初始化方法
第八步:初始化后执行...
第九步:处理业务逻辑
这是添加方法
第十步:Spring调用销毁方法
这是销毁方法

当然了在后处理Bean的时候是可以进行动态代理进行增强的。

但是要特别注意,这个时候在定义对象的时候,必须是使用接口来作为类型名,而不能是实现类,因为这次返回的是代理类,代理类和实现类是平级关系,是无法相互转换的。

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* bean:实例对象
* beanName:在配置文件中配置的类的标识.
*/
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("第五步:初始化之前执行...");
return bean;
} public Object postProcessAfterInitialization(final Object bean, String beanName)
throws BeansException {
System.out.println("第八步:初始化后执行...");
// 动态代理进行增强
Object proxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(),
bean.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("权限校验:");
Object res = method.invoke(bean, args);
return res;
}
});
return proxy;
}
} public class Spring3 { @Test
public void demo1(){
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("" +
"config2.xml"); B b = (B) ac.getBean("bean");
b.add();
// 只有ClassPathXmlApplicationContext有close()方法,ApplicationContext没有
ac.close();
}
} 结果:
第一步:默认构造方法
第二步:属性注入
第三步:注入配置的id号bean
第四步:注入ApplicationContextorg.springframework.context.support.ClassPathXmlApplicationContext@6591f517: startup date [Mon Nov 06 20:18:39 CST 2017]; root of context hierarchy
第五步:初始化之前执行...
第六步:属性设置后执行
第七步:这是初始化方法
第八步:初始化后执行...
权限校验:
第九步:处理业务逻辑
这是添加方法
第十步:Spring调用销毁方法
这是销毁方法

Java Spring-Bean的更多相关文章

  1. java Spring bean作用域

    1. Singleton作用域 当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则 ...

  2. Java Spring Bean相关配置

    1.Bean配置信息组成部分: (1)Bean实现类 (2)Bean的属性信息 (3)Bean的依赖关系 (4)Bean的行为配置 2.配置方式: (1)XML配置 (2)注解配置 (3)Java类配 ...

  3. java spring bean的什么周期

    http://www.cnblogs.com/TIMHY/p/7794973.html

  4. Spring Bean Life Cycle Methods – InitializingBean, DisposableBean, @PostConstruct, @PreDestroy and *Aware interfaces

    Spring Beans are the most important part of any Spring application. Spring ApplicationContext is res ...

  5. Spring 基于Java的Bean声明

    Spring 基于Java的Bean声明 使用@Configuration进行设置: Xml: <?xml version="1.0" encoding="UTF- ...

  6. java Spring系列之 配置文件的操作 +Bean的生命周期+不同数据类型的注入简析+注入的原理详解+配置文件中不同标签体的使用方式

    Spring系列之 配置文件的操作 写在文章前面: 本文带大家掌握Spring配置文件的基础操作以及带领大家理清依赖注入的概念,本文涉及内容广泛,如果各位读者耐心看完,应该会对自身有一个提升 Spri ...

  7. Spring8:一些常用的Spring Bean扩展接口

    前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...

  8. Spring Bean详细讲解

    什么是Bean? Spring Bean是被实例的,组装的及被Spring 容器管理的Java对象. Spring 容器会自动完成@bean对象的实例化. 创建应用对象之间的协作关系的行为称为:装配( ...

  9. Spring Bean的生命周期(非常详细)

    Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...

  10. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

随机推荐

  1. mycelipse中关于编码的配置

    (1)修改工作空间的编码方式: Window->Preferences->General->Workspace->Text file Encoding在Others里选择需要的 ...

  2. 【转载】网络安全---Strurts2漏洞介绍

    Apache Struts2 作为世界上最流行的 Java Web 服务器框架之一,3 月 7 日带来了本年度第一个高危漏洞——CVE编号 CVE-2017-5638 .其原因是由于 Apache S ...

  3. 无线路由器wan口和lan口ip同网段导致无法上网解决办法

    环境 本地网段为192.168.0.0/24 路由器默认网段也是192.168.0.0/24 设置好路由器wan口DHCP自动获取ip以后无法上网 解决办法 把路由器是lan口地址设置为192.168 ...

  4. 表空间Tablespace

    SQL Fundamentals: 表的创建和管理(表的基本操作,闪回技术flashback,表结构修改) Oracle Schema Objects——Tables——TableStorage 数据 ...

  5. 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块

    简介 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块. 举个例子: ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘 ...

  6. RSA与AES的区别

    RSA 非对称加密,公钥加密,私钥解密,反之亦然.由于需要大数的乘幂求模等算法,运行速度慢,不易于硬件实现. 通常私钥长度有512bit,1024bit,2048bit,4096bit,长度越长,越安 ...

  7. 因为smb和nfs挂掉导致客户端开机启动不了

    因为smb和nfs挂掉导致客户端开机启动不了 虚拟机里的Linux启动不起来 决定开机 按住esc键,看一下到底启动到哪一步出错 从图中可以看出是挂载文件系统的时候出错,文件系统是CIFS, 是sam ...

  8. thinkphp处理jQuery EasyUI form表单问题

    jQuery EasyUI form表单不是ajax方式提交,而是在提交的时候新建一个隐藏的iframe并在iframe里面创建一个与绑定表单一样的表单,然后在iframe里面进行同步提交而不是异步提 ...

  9. [golang note] 协程基础

    协程概念 √ 协程通常称为coroutine,在golang中称为goroutine. √ 协程本质上是一种用户态线程,它不需要操作系统来进行抢占式调度,在实际实现中寄存在线程之中. √ 协程系统开销 ...

  10. c/c++ json使用

    比如出名的有CJson,c++一般用jsoncpp http://sourceforge.net/projects/jsoncpp/ jsoncpp:http://www.cnblogs.com/fe ...