zoukankan      html  css  js  c++  java
  • 容器+AOP实现动态部署(三)

      上节咱们谈到容器的基本特性,这次继续说容器怎样与AOP进行结合。增强咱们的对象。为对象加入额外的方法。

    咱们下面方图为说明

     


        业务对象通过business 的容器我们能够注入,服务类的对象我们通过Service容器将公共类的对象进行注入。关系增强型AOP则通过组合两者关系进行确定性和不不定性的叠加处理。他们的初始化是通过容器的初始化进行装载的。

    实例代码

     1 初始化对象容器

    public class ClassPathXmlApplicationContext
     {
    	
    	// 业务容器beans
    	private Map<String, Object> businessBeans = new HashMap<String, Object>();
    
    	// 公共服务容器beans
    	private Map<String, Object> aspectBeans = new HashMap<String, Object>();
    
    	//关系集合配置
    	private Map<String, Object> relationBeans = new HashMap<String, Object>();
    
    	// 设置是否须要aop
    	private boolean isAop = true;
    	
    	
    /**
    


    有了各个容器对象的支持。就为咱们兴许动态调用提供了有力的保障

    增强服务是Aop的特性,请參考博客【动态代理】这里是通过模拟JDK代理进行实现的。

     

    2 获取对象,辨别是否增强


    2.1基本版本号

    简单的动态调用方式是,在client进行赋值例如以下 

      public static void main(String[] args) {
            Greeting greeting = new JDKDynamicProxy(newGreetingImpl()).getProxy();//參数为详细的类型
            greeting.sayHello("Jack");
        }

    由于咱们业务颗粒都在business容器中,所以咱们能够通过业务容器提供的方法直接获取,这样client就不用知道详细的类型了。


    2.2增强版

    /**
     * 获取容器中指定对象
     *
     * @param id
     *           对象名称如:getBean("user")
     * @return
     */
    public Object getBean(String id) {
          return  businessBeans.get(id);
    }

    而将对象增强与否是通过咱们的AOP关系进行解析的。所以。以上的方式是不能实现增强的,必须在返回值的时候进行截取,所以在return上动了手脚

     

    2.3加强版

    /**
     * 获取容器中指定对象
     * 
     * @param id
     *            对象名称如: getBean("user")
     * @return
     */
    public Object getBean(String id) {
    
            //IsAop标签进行辨别是否增强
    	if (!isAop) {
    		return businessBeans.get(id);
    	}
    	//JDK代理类实现动态增强服务
    	return new JDKDynamicProxy(businessBeans.get(id), aspectBeans, businessBeans,relationBeans)
    			.getProxy();
    }

    通过getBean方法我们获取拦截对象。同一时候我们将服务类容器,关系容器一起进行传入。这样达到了一个什么效果呢?请看下图



     

    AOP容器中,我们拥有了业务对象,服务对象和关系集合。通过解析关系集合我们动态 Invoke服务的方法在业务方法前后进行增强。

    描写叙述完毕后,咱们再看详细的实现。

    简单的JDK方法调用还请參考Java代理】博客。这里我们对代理类进行了封装。


    3 配置文件 


    3.1服务类配置XML Service.xml

    <!--该文件对是服务类的配置,全部服务类都须要在该文件进行注冊-->
    <beans>
    <!--服务类配置容器。配置缓存服务类。全名称 -->
    <aspectbean id="aspectCachBean" class="com.tgb.configra.AspectCachBean"></aspectbean>
     
    </beans>


    3.2关系配置Aop.xml

     
    <!--aop关系配置文件-->
    <beans>        
    <!--是否启用aop-->
    <aop isaop="false"></aop>
     
    <!--配置业务颗粒和服务类的增强关系 ,method是拦截业务对象方法,aspectMethod是运行的服务方法-->
    <aspectbefore  aspectId="aspectCachBean" method="save" aspectMethod="cacheSave" ></aspectbefore>
     
    </beans>

    小结:


    到此容器和AOP的结合已经基本成型。我们是通过在获取容器对象之时对该对象进行了代理,将该对象转入到AOP容器中,这样在AOP容器中对该对象进行一系列的增强。

    容器事先没有不论什么对象。在执行时进行装配。进行实时存取。带到动态代理。下篇咱们介绍AOP对象的详细增强方式。

  • 相关阅读:
    单词 统计
    第十周学习记录
    梦断代码阅读笔记03
    梦断代码阅读笔记02
    梦断代码阅读笔记01
    用户模板和用户场景
    第九周学习记录
    分享好友-分享朋友圈
    生命周期函数-页面刷新
    底部导航的设置
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7117665.html
Copyright © 2011-2022 走看看