spring中的Aware接口功能详解

在spring中有很多以XXXAware命名的接口,很多人也不清楚这些接口都是做什么用的,这篇文章将描述常用的一些接口。

一,ApplicationContextAware

获取spring容器,用来访问容器中定义的其他bean。实现接口方法public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {}

eg:

package org.company.xxx;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * 获取spring容器,以访问容器中定义的其他bean
 */
public class SpringContextUtil implements ApplicationContextAware {

	// Spring应用上下文环境
	private static ApplicationContext applicationContext;

	/**
	 * 实现ApplicationContextAware接口的回调方法,设置上下文环境
	 */
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		SpringContextUtil.applicationContext = applicationContext;
	}

	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}

	/**
	 * 获取对象 这里重写了bean方法,起主要作用
	 * 
	 * @param name
	 * @return  Object 一个以所给名字注册的bean的实例
	 * @throws BeansException
	 */
	public static Object getBean(String beanId) throws BeansException {
		return applicationContext.getBean(beanId);
	}
}

二、ApplicationEventPublisherAware

这是一个事件通知发布接口,实现public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher)方法。实现ApplicationListener<ApplicationEvent>接口的类在onApplicationEvent(ApplicationEvent event)方法中可以监听到这个事件通知。

eg: 源码来源:http://m.blog.csdn.net/article/details?id=50970667

定义事件:

package com.zghw.spring.demo.demo.event;

import org.springframework.context.ApplicationEvent;
/**
 * 定义一个发送短信的事件
 * 实现了ApplicationEvent
 * @author zghw
 *
 */
public class SendMessageEvent extends ApplicationEvent {
	private static final long serialVersionUID = 1L;
	//消息对象
	private Message message;
	
	//source代表了发布该事件的发布源
	public SendMessageEvent(Object source,Message message) {
		super(source);
		this.message = message;
	}

	public Message getMessage() {
		return message;
	}

	public void setMessage(Message message) {
		this.message = message;
	}
	
}

  定义监听器观察者:

package com.zghw.spring.demo.demo.event;

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
/**
 * 发送短信监听器,监听到事件就开始发送。
 * 实现ApplicationListener
 * @author zghw
 *
 */
@Component
public class SendMessageListenter implements ApplicationListener<SendMessageEvent>{

	/**
	 * 监听事件SendMessage,当有事件发生则调用该方法
	 */
	public void onApplicationEvent(SendMessageEvent event) {
		Message message = event.getMessage();
		String msg=message.getMessage();
		String phone = message.getPhone();
		try {
			System.out.println("开始向手机"+phone+"发送短信,短信内容为:"+msg);
			Thread.sleep(1000);
			System.out.println("发送短信成功!");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

  定义事件注册中心以及发布事件主题:

package com.zghw.spring.demo.demo.event;

import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Service;

/**
 * 实现ApplicationEventPublisherAware让容器ApplicationContext作为事件发布中心,
 * 因为ApplicationContext实现了ApplicationEventPublisher
 * @author zghw
 *
 */
@Service
public class UserService implements ApplicationEventPublisherAware{
	private ApplicationEventPublisher publisher;
	
	
	public void registerUser(String name,String phone) throws InterruptedException{
		System.out.println("注册用户中");
		Thread.sleep(300);
		System.out.println("注册完成!");
		
		Message message=new Message();
		message.setMessage("你好,"+name+" 你中了1000W");
		message.setPhone(phone);
		SendMessageEvent event=new SendMessageEvent(this,message);
		//发布中心发布事件
		publisher.publishEvent(event);
	}


	/**
	 * 实现ApplicationEventPublisherAware的方法,spring在使用时UserServicebean对象时会自动帮我们注入
	 * ApplicationEventPublisher的实现
	 */
	public void setApplicationEventPublisher(
			ApplicationEventPublisher applicationEventPublisher) {
		this.publisher = applicationEventPublisher;
	}
}

 

posted @ 2016-07-31 13:30  jiangfullll  阅读(1707)  评论(0)    收藏  举报