Spring常用介面和類
阿新 • • 發佈:2019-01-30
ApplicationContextAware介面
ApplicationContextAware
是用來獲取spring的上下文。通過工具類直接實現該介面,返回ApplicationContext
物件。
- 實現類
@Component
public class SpringContextUtil implements ApplicationContextAware{
private static ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
//獲取Spring容器context
this.applicationContext=arg0;
}
public static ApplicationContext getSpringContext(){
return applicationContext;
}
}
- Junit測試
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:config/spring-mvc.xml" ,"classpath*:config/spring-common.xml"})
public class UserControllerTest {
/**
* Spring應用上下文
*/
@Autowired
private ApplicationContext context;
@Test
public void test() {
System.err.println(context);
ApplicationContext springContext = SpringContextUtil.getSpringContext();
System.err.println(springContext);
}
}
- 測試結果:
可以看到,列印了兩次ApplicationContext
的結果,其中一次是通過@Autowired
注入的,另外一個就是實現ApplicationContextAware
介面時獲取的。專案中可以通過這兩種之一來獲取上下文物件。
ApplicationEvent和ApplicationListener
ApplicationEvent
對應定義事件,ApplicationListener
定義監聽事件。一般用來處理一些非同步的操作。比如一些非同步入庫等。
- 定義自定義事件
MySpringEvent
public class MySpringEvent extends ApplicationEvent {
private String name;
/**
* 非同步呼叫很方便。比如說
*/
public MySpringEvent(Object source, String name) {
super(source);
this.name = name;
}
@Override
public Object getSource() {
return super.getSource();
}
@Override
public String toString() {
return super.toString();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 定義事件監聽器
@Component
public class MyApplicationListener implements ApplicationListener<MySpringEvent>{
public void onApplicationEvent(MySpringEvent event) {
if(event instanceof MySpringEvent){
//執行一些自定義操作,這裡列印一下。
MySpringEvent mySpringEvent=(MySpringEvent)event;
System.out.println("-------------------- "+mySpringEvent.getName()+"---------------");
}
}
}
- 測試:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:config/spring-mvc.xml","classpath*:config/spring-common.xml"})
public class MyApplicationListenerTest {
@Autowired
public ApplicationContext applicationContext;
@Test
public void test() {
applicationContext.publishEvent(new MySpringEvent("source", "Tom"));
}
}
一般在業務中釋出一個事件。比如說非同步入庫。那自定義事件應該就是一個物件,監聽器就是應該入庫的操作,在其他業務要觸發的時候在釋出事件。
InitializingBean
InitializingBean介面為bean提供了初始化方法的方式。但是會在使用配置init-method前面執行。
- 實現介面
InitializingBean
@Component
public class InitializingBeanBean implements InitializingBean{
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean初始化Bean,init-method在後面執行。");
}
}
- 測試:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:config/spring-mvc.xml","classpath*:config/spring-common.xml"})
public class InitTest {
@Test
public void test() {
System.out.println("啟動完畢");
}
}
使用init-method
來初始化bean
spring配置:
<bean id="init" class="com.tgb.inter_face.InitMethodBean" init-method="execute"></bean>
對應類:
public class InitMethodBean {
public void execute(){
System.out.println("我是通過init-method呼叫的");
}
}
結果都是可以打印出來。
DisposableBean
bean在銷燬的時候呼叫的
@Component
public class InitializingBeanBean implements InitializingBean,DisposableBean{
/**
* bean在初始化的時候呼叫
*/
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean初始化Bean,init-method在後面執行。");
}
/**
* bean在銷燬的時候呼叫的
* @throws Exception
*/
public void destroy() throws Exception {
System.out.println("bean在銷燬的時候呼叫的");
}
}
測試:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:config/spring-mvc.xml","classpath*:config/spring-common.xml"})
public class InitTest {
@Autowired
ApplicationContext applicationContext;
@Test
public void test() {
System.out.println("啟動完畢");
//tomcat裡面要手動,關閉上下文,會呼叫到destroy
ConfigurableApplicationContext context = (ConfigurableApplicationContext) applicationContext;
context.close();
}
}
FactoryBean
使用場景:1、通過外部對類是否是單例進行控制,該類自己無法感知 2、對類的建立之前進行初始化的操作,在afterPropertiesSet()中完成。
- 繼承該介面後實現的三個方法。
/**
* 工廠Bean,返回的是該工廠Bean的getObject方法所返回的物件。創建出來的物件是否屬於單例由isSingleton中的返回決定。
*/
public User getObject() throws Exception {
return new User();
}
public Class<?> getObjectType() {
return User.class;
}
public boolean isSingleton() {
return true;
}
獲取bean,使用上下文獲取bean
User bean = context.getBean(User.class);
BeanPostProcessor
每個bean初始化前後都會呼叫一次。
/**
*
* @param arg0
* @param arg1
* @return
* @throws BeansException
*/
public Object postProcessAfterInitialization(Object arg0, String arg1)
throws BeansException {
System.out.println("bean初始化前呼叫"+arg1);
return arg0;
}
public Object postProcessBeforeInitialization(Object arg0, String arg1)
throws BeansException {
System.out.println("bean初始化後呼叫"+arg1);
return arg0;
}
BeanFactoryPostProcessor
BeanFactory的後置處理器。需要在Bean的配置檔案中,註冊BeanFactory的後置處理器。
public class BeanFactory implements BeanFactoryPostProcessor{
public BeanFactory() {
System.out.println("初始化BeanFactory");
}
public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)
throws BeansException {
System.out.println("hello,我是BeanFactoryPostProcessor");
}
}
spring.xml
<bean id="beanFactory" class="com.tgb.inter_face.BeanFactory"></bean>
總結
- 實現BeanFactoryPostProcessor介面,初始化BeanFactory時候會呼叫。
- 實現InitializingBean介面,bean在初始化的時候呼叫afterPropertiesSet();
- 實現BeanPostProcessor,可以在每個bean前後呼叫一次。
- 使用init-method初始化的方法執行。
- 實現FactoryBean工廠介面自定義的bean初始化。
- 實現DisposableBean介面,銷燬bean時呼叫。