如何让不受spring管理的类具有spring自动注入的特性.--AutowireCapableBeanFactory

来源:互联网 发布:淘宝搜索关键词 编辑:程序博客网 时间:2024/05/16 12:20
package spring.core.pracitce;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import org.apache.commons.lang3.StringUtils;import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.beans.factory.config.AutowireCapableBeanFactory;import org.springframework.context.ApplicationEvent;import org.springframework.context.ApplicationEventPublisher;import org.springframework.context.ApplicationEventPublisherAware;import org.springframework.context.ApplicationListener;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @link http://www.javacodegeeks.com/2012/08/observer-pattern-with-spring-events.html * 如何让不受spring管理的类具有spring自动注入的特性. * 例子:java配置方式 * @author doctor * * @time   2014年12月3日 下午4:04:44 */public class ObserverPatternWithSpringEvents {@Autowired@Qualifier("messageEventSource")private MessageEventSource messageEventSource;private AnnotationConfigApplicationContext context;@Test public void test()throws Throwable{context = new AnnotationConfigApplicationContext(ObserverPatternWithSpringEventsConfigure.class);//AutowireCapableBeanFactory有个下面重要的方法可以实现让不受spring管理的类具有spring自动注入的特性.context.getAutowireCapableBeanFactory().autowireBeanProperties(this, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, true);Thread thread = new Thread(messageEventSource);thread.start();thread.join();}@Configurationpublic static class ObserverPatternWithSpringEventsConfigure{@Bean(name="messageEventSource")public MessageEventSource messageEventSource(){return new MessageEventSource();}@Bean(name="messageListener")public MessageListener messageListener(){return new MessageListener();}}public static class MessageEvent extends ApplicationEvent{private static final long serialVersionUID = 4927935382440103532L;private String message = "";public MessageEvent(Object source,String message) {super(source);if (!StringUtils.isBlank(message)) {this.message = message;}}@Overridepublic String toString(){StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("MessageEvent [message=").append(message).append("]");return stringBuilder.toString();}}/** * 实现ApplicationEventPublisherAware接口,是为了让spring注入ApplicationEventPublisher, * 它是spring分发事件源 * @author doctor * * 2014年12月4日 下午10:52:18 */public static class MessageEventSource implements Runnable,ApplicationEventPublisherAware{private ApplicationEventPublisher applicationEventPublisher;@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.applicationEventPublisher = applicationEventPublisher;}@Overridepublic void run() {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));try {while (true) {String readLine = reader.readLine();//发布事件applicationEventPublisher.publishEvent(new MessageEvent(this, Thread.currentThread().getName() + "---" + readLine));}} catch (IOException e) {e.printStackTrace();}}}public static class MessageListener implements ApplicationListener<MessageEvent>{@Overridepublic void onApplicationEvent(MessageEvent event) {System.out.println(Thread.currentThread().getName() + event);}}}

0 0
原创粉丝点击