关闭

利用java中的观察者模式模仿spring中的ApplicationContextAware

标签: spring观察者模式java
292人阅读 评论(0) 收藏 举报
分类:

1.spring中ApplicationContextAware的作用:

spring框架中,如果需要在一个普通的javaBean中获得ioc容器对象,其中有一种方法就是 实现ApplicationContextAware接口,ioc容器启动或者销毁,对应的bean都可以获得ioc的状态。这就是java中的观察者设计者模式。在 tomcat中大量的应用到了这种设计模式,已spring中几个典型的Bean演示观察者设计者模式.

2.利用spring的几个典型的Bean演示观察者模式:

2.1类的清单:

 2.1.1 被观察者接口:ApplicationContext

 2.1.2被观察者实现类:WebApplicationContext

 2.1.3观察者接口:ApplicationContextAware

 2.1.4观察者实现类:SimpleUrlHandlerMapping

 2.1.5客户端:client

2.2类功能的描述和类的代码(注:在设计模式中的描述)

2.2.1 ApplicationContext

package com.xinghengedu.observer;
/**
 * 模仿spring中的applicationContext:被观察者
 * @author issuser
 *被观察者需要实现三个接口:
 *注册
 *
 */
public interface ApplicationContext {
	
	
	
	/**
	 * 注册观察者:在spring中就是注入ioc容器
	 */
	void  registerObserver(ApplicationContextAware applicationContextAware);
	
	
	/**
	 * 移除观察者
	 */
	void  clearObserver(ApplicationContextAware applicationContextAware);
	
	
	/**
	 * 更新观察者的状态
	 */
	void notifyObserver();  
	
	
	/**
	 * 模仿ioc容器的创建过程
	 */
	void  onCreate();
	
	
	

}

2.2.2 ApplicationContextAware


package com.xinghengedu.observer;




/**
 *观察者需要实现的接口
 * @author issuser
 *
 */
public interface ApplicationContextAware {

	
	
	/**
	 * 向观察者中注入ioc容器
	 * @param applicationContext
	 */
	void setApplicationContext(ApplicationContext applicationContext);

}

2.2.3 WebApplicationContext

package com.xinghengedu.observer;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
 * 被观察者的具体实现
 * @author issuser
 *
 */
public class WebApplicationContext implements ApplicationContext {

	private Map<String, ApplicationContextAware> observers = new HashMap<String, ApplicationContextAware>();

	public WebApplicationContext() {

	}

	@Override
	public void registerObserver(ApplicationContextAware applicationContextAware) {
		this.observers.put(applicationContextAware.getClass().getSimpleName(), applicationContextAware);
	}

	@Override
	public void clearObserver(ApplicationContextAware applicationContextAware) {
		this.observers.remove(applicationContextAware.getClass().getSimpleName());

	}

	@Override
	public void notifyObserver() {
		Set<String> observerNames = observers.keySet();
		if (observerNames.size() > 0) {
			for (String temp : observerNames) {
				this.observers.get(temp).setApplicationContext(this);
			}
		}

	}
	
	
	public    void  onCreate(){
		
		System.out.println("ioc容器正在被初始化.....");
		
		this.notifyObserver();
	}

}



2.2.4 SimpleUrlHandlerMapping

package com.xinghengedu.observer;
/**
 * 观察者的具体实现
 * @author issuser
 *
 */
public class SimpleUrlHandlerMapping  implements ApplicationContextAware{

    
    private ApplicationContext  applicationContext;
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        
        System.out.println("ioc呗注入到了:SimpleUrlHandlerMapping");
        
        this.applicationContext=applicationContext;
    }

    public SimpleUrlHandlerMapping(ApplicationContext applicationContext) {
        applicationContext.registerObserver(this);
    }
    
    

}



2.2.5 Client

package com.xinghengedu.observer;


/**
 * java中的观察者模式:
 * 被观察者接口:ApplicationContext
 * 被观察者实现类:WebApplicationContext
 * 观察者接口:ApplicationContextAware
 * 观察者实现类:SimpleUrlHandlerMapping
 * 客户端:client
 * 
 * @author issuser
 *
 */
public class Client {

	public static void main(String[] args) {
		ApplicationContext context = new WebApplicationContext();
		SimpleUrlHandlerMapping SimpleUrlHandlerMapping = new SimpleUrlHandlerMapping(context);
		
		context.onCreate();
		
		
	}

}
注:以上几个类虽然为spring中常用的几个类,只是借助几个类大致的描述这种设计模式的思想,spring中的源码博大精深,希望读者不要纠结于这些细节!


1
0
查看评论

利用Spring实现观察者模式(Oberver)

转载:http://www.zhengmenbb.com/archives/298.htm 侦听者类: Observer package com.zhengmenbb.spring.listener; import java.util.Map; public interface Obse...
  • u010571844
  • u010571844
  • 2015-03-02 14:51
  • 897

用 spring 实现观察者设计模式

传统观察者设计模式编写方法:    发布者类:Publisher.java  import java.util.ArrayList;  import java.util.Iterator;  import java.util.List;    public class Publisher imple...
  • gzjoek
  • gzjoek
  • 2006-04-14 17:18
  • 3724

【spring】切面的配置、实现ApplicationContextAware、实现ApplicationListener

1.项目中配置切面(AOP),横向监控     ① 实例代码(基于注解的方式): @Component @Aspect @Order(1) public class ServiceLoggingAspect { private final Logger logg...
  • lihuapiao
  • lihuapiao
  • 2016-02-02 09:54
  • 1113

SpringMVC中的观察者模式

观察者接口Observer public interface Observer { public void execute(Map paras) throws ServerException; public Boolean isAsyn(); } 1、paras为观察者观察时接收...
  • u013807095
  • u013807095
  • 2015-01-12 08:49
  • 1348

Spring整理系列(06)——spring中Aware结尾接口

一、关于spring中Aware结尾接口介绍:Spring中提供一些Aware结尾相关接口,像是BeanFactoryAware、 BeanNameAware、ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等。实现这些...
  • javaloveiphone
  • javaloveiphone
  • 2016-08-07 16:16
  • 5546

ApplicationContextAware获取Spring上下文,通过基类获取properties中的配置属性

说明: 该方法实现了,通过继承JAR包中基类来获取properties中配置的相关属性,并添加至spring容器中,供代码中使用。 1。 基类 package com.ffcs.icity.config; import java.lang.annotation.ElementType; imp...
  • linwei_1029
  • linwei_1029
  • 2014-12-12 17:02
  • 5618

使用ApplicationContextAware得到一个ApplicationContext对象

ApplicationContext的BeanFactory 的子类, 拥有更强大的功能,ApplicationContext可以在服务器启动的时候自动实例化所有的bean,而 BeanFactory只有在调用getBean()的时候才去实例化那个bean, 这也是我们为什么要得到一个Applica...
  • kouwoo
  • kouwoo
  • 2015-02-02 10:04
  • 2562

通过实现ApplicationContextAware接口获取bean

场景: 在代码中需要动态获取其它bean 实例代码: view source 01 package org.company.xxx; 02 03 impo...
  • xyr05288
  • xyr05288
  • 2015-06-18 11:40
  • 1345

Spring中ApplicationContextAware接口使用理解

一、这个接口有什么用? 当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean。换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象。 二、怎么使用这...
  • flqljh
  • flqljh
  • 2015-11-14 11:38
  • 6055

Spring之Bean实现了ApplicationContextAware等aware接口,对于setApplicationContext方法执行时间点的说明

对于实现了Aware接口的Bean对象,如: public class beanTest implement ApplicationContextAware { private static ApplicationContext applicationContext; public vo...
  • fycghy0803
  • fycghy0803
  • 2017-07-05 11:32
  • 846
    个人资料
    • 访问:12578次
    • 积分:333
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:0篇
    • 译文:0篇
    • 评论:15条
    最新评论