Java Spring-Bean
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的更多相关文章
- java Spring bean作用域
		
1. Singleton作用域 当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则 ...
 - Java Spring Bean相关配置
		
1.Bean配置信息组成部分: (1)Bean实现类 (2)Bean的属性信息 (3)Bean的依赖关系 (4)Bean的行为配置 2.配置方式: (1)XML配置 (2)注解配置 (3)Java类配 ...
 - java spring bean的什么周期
		
http://www.cnblogs.com/TIMHY/p/7794973.html
 - 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 ...
 - Spring 基于Java的Bean声明
		
Spring 基于Java的Bean声明 使用@Configuration进行设置: Xml: <?xml version="1.0" encoding="UTF- ...
 - java Spring系列之 配置文件的操作 +Bean的生命周期+不同数据类型的注入简析+注入的原理详解+配置文件中不同标签体的使用方式
		
Spring系列之 配置文件的操作 写在文章前面: 本文带大家掌握Spring配置文件的基础操作以及带领大家理清依赖注入的概念,本文涉及内容广泛,如果各位读者耐心看完,应该会对自身有一个提升 Spri ...
 - Spring8:一些常用的Spring Bean扩展接口
		
前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...
 - Spring Bean详细讲解
		
什么是Bean? Spring Bean是被实例的,组装的及被Spring 容器管理的Java对象. Spring 容器会自动完成@bean对象的实例化. 创建应用对象之间的协作关系的行为称为:装配( ...
 - Spring Bean的生命周期(非常详细)
		
Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...
 - 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)
		
Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...
 
随机推荐
- Java项目工程化之项目构建工具Maven
			
欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...
 - poj1952 BUY LOW, BUY LOWER【线性DP】【输出方案数】
			
BUY LOW, BUY LOWER Time Limit: 1000MS Memory Limit: 30000K Total Submissions:11148 Accepted: 392 ...
 - web框架们~Django~Flask~Tornado
			
1.web框架本质 2.Django 3.Flask 4.Tornado
 - Python开发【模块】:re正则
			
re模块 序言: re模块用于对python的正则表达式的操作 '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行 '^' 匹配字符开头,若指定flags ...
 - PAT 1117 Eddington Number [难]
			
1117 Eddington Number (25 分) British astronomer Eddington liked to ride a bike. It is said that in o ...
 - 模块讲解----hashlib模块(加密)
			
作用 用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 语法 import hashlib #md5 ...
 - 剑指offer-有序二维数组中的查找
			
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. def Find(self, t ...
 - monkey基础学习
			
原文地址https://blog.csdn.net/beyond_f/article/details/78543070 一.Monkey测试简介 Monkey测试是Android平台自动化测试的一种手 ...
 - centos远程访问mssql数据库
			
http://blog.path8.net/archives/5921.html http://www.jaggerwang.net/2013/03/18/centos%E4%B8%8B%E5%AE% ...
 - zw版【转发·台湾nvp系列Delphi例程】HALCON HSerializedItem
			
zw版[转发·台湾nvp系列Delphi例程]HALCON HSerializedItem procedure TForm1.FormShow(Sender: TObject);var img, im ...