版权声明:仅供学习交流使用 https://blog.csdn.net/drxRose/article/details/84948481
约莫有4种方式定制bean初始化和销毁时的回调函数,如下表格.
方式 | 说明 |
使用beans标签的属性 | beans标签中,使用以下两个属性, `default-init-method`和`default-destroy-method`, 其值,对应的是bean类中初始化和销毁方法的方法名称. |
使用bean标签的属性 | bean标签中,使用以下两个属性, `init-method`和`destroy-method`, 其值即bean类中对应的回调函数名. |
使用JSR250的注解 | @PostConstruct:初始化方法 @PreDestroy:销毁方法 |
实现约定的接口 | InitializingBean,初始化的接口. DisposableBean,销毁的接口 |
当混合使用时,4种方式先后执行的顺序.
JSR-250注解->实现接口的回调-->xml方式的回调/全局默认方式的回调.其中xml方式的回调,会覆盖全局默认方式的回调.
声明回调函数的合并类文件.
package siye;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
public interface BeanManager
{
}
/**
* 实现特定接口的方式.
*/
class UserImpl implements InitializingBean, DisposableBean
{
@Override
public void destroy() throws Exception
{
System.out.println("destroy_bean_by_Impl");
}
@Override
public void afterPropertiesSet() throws Exception
{
System.out.println("init_bean_by_Impl");
}
}
/**
* 注解的方式.
* JSR250的注解
*/
@Component("userByAnnoJSR250")
@Lazy
class UserByAnnoJSR250
{
@PostConstruct
public void prepare()
{
System.out.println("init_bean_by_anno");
}
@PreDestroy
public void destroy()
{
System.out.println("destroy_bean_by_anno");
}
}
/**
* 使用bean标签属性的方式.
*/
class UserByBeanTag
{
public void myInit()
{
System.out.println("init_bean_by_bean_Tag");
}
public void myDestroy()
{
System.out.println("destroy_bean_by_bean_Tag");
}
}
/**
* 使用beans标签的属性.
*/
@Component("userByBeansTag")
@Lazy
class UserByBeansTag
{
public void globalInit()
{
System.out.println("init_bean_by_beans_tag");
}
public void globalDestroy()
{
System.out.println("destroy_bean_by_beans_tag");
}
}
配置文件,config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
default-init-method="globalInit" default-destroy-method="globalDestroy">
<bean id="userImpl" class="siye.UserImpl" lazy-init="true" />
<bean id="userByBeanTag" class="siye.UserByBeanTag" lazy-init="true"
init-method="myInit" destroy-method="myDestroy" />
<context:component-scan base-package="siye" />
</beans>
测试类
package siye;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 管理bean的初始化和销毁操作.
* 回调函数.
* 4种方式.
*/
public class UnitTest
{
private ClassPathXmlApplicationContext context;
@Before
public void prepare()
{
String path = "classpath:/siye/config.xml";
context = new ClassPathXmlApplicationContext(path);
}
/*
* 实现接口的方式.
*/
@Test
public void testImpl()
{
UserImpl obj = context.getBean("userImpl", UserImpl.class);
System.out.println(obj);
}
/*
* 使用注解的方式
*/
@Test
public void testAnno()
{
UserByAnnoJSR250 obj = context.getBean(UserByAnnoJSR250.class);
System.out.println(obj);
}
/*
* 使用bean标签的属性
*/
@Test
public void testBeanTag()
{
UserByBeanTag obj =
context.getBean("userByBeanTag", UserByBeanTag.class);
System.out.println(obj);
}
/*
* 使用beans标签的属性
*/
@Test
public void testBeansTag()
{
UserByBeansTag obj =
context.getBean("userByBeansTag", UserByBeansTag.class);
System.out.println(obj);
}
@After
public void destroy()
{
if (context != null)
{
context.close();
}
}
}