spring ioc---定制bean初始化和销毁时的回调函数

版权声明:仅供学习交流使用 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();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/drxRose/article/details/84948481
今日推荐