容器+AOP实现动态部署(三)

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

咱们以下方图为说明

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

实例代码

初始化对象容器

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基本版本

简单的动态调用方式是,在客户端进行赋值如下

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

因为咱们业务颗粒都在business容器中,所以咱们可以通过业务容器提供的方法直接获取,这样客户端就不用知道具体的类型了。

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对象的具体增强方式。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-23 05:06:35

容器+AOP实现动态部署(三)的相关文章

容器+AOP 实现动态部署(二)

上节咱们介绍了整体架构的实现, 现在就一步一步的进行实现 首先看咱们的容器 ,容器的目的是 存放对象 , 之后是 提供服务.看一副图 容器中 原来存放的是颗粒1,现在放入颗粒2,3,之后在对颗粒3进行删除,这就是我们容器中最基本方式. 容器的基本操作方法 package com.tgb.configra; import java.util.Map; public interface ContainerBeans { /** * 获取容器中指定对象 * * @param id * 对象名称如: g

容器+AOP 实现动态部署(一)

集合大家基本都有个认识吧,如:JDK中的List, Set, Map等,都是很好的集合.容器和集合有什么不同呢,我个人认为: 容器应提供公共的服务 容器中的服务可以操作容器中所有对象 容器中选择某个对象可以操作对象的属性和方法 详情请看下图 空白处右键容器出现容器提供的服务,容器对象右键出现对象的属性或方法.最形象的就是我们Wind的资源管理器的模型. 有了容器的基本概念后,再看看看我们最普通的开发方式.一个系统开发业务颗粒,免不了要有日志,事务一些的参杂.最普通的写法我们是怎么做的呢 常见方式

容器+AOP实现动态部署(四)

上篇咱们介绍了容器和AOP的结合,结合后如何将对象增强服务并没有过多的说明,这里将具体说明如何将对象 进行增强 ,达到一个一对多和多对多的增强方式 先从简单的方式说起 /** *JDK代理类,实现动态调用对象方法 */ public class JDKDynamicProxy implements InvocationHandler { /** *--省略方法 */ /** *回调用法,执行选择的方法 */ @Override public Object invoke(Object proxy,

Android动态部署五:如何从插件apk中启动Service

转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/DynamicDeploymentApk Android动态部署一:Google原生Split APK浅析 Android动态部署二:APK安装及AndroidManifest.xml解析流程分析 Android动态部署三:如何从插件apk中启动Activity(一) Android动态部署四:如何从插

Android动态部署五:怎样从插件apk中启动Service

转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/DynamicDeploymentApk Android动态部署一:Google原生Split APK浅析 Android动态部署二:APK安装及AndroidManifest.xml解析流程分析 Android动态部署三:怎样从插件apk中启动Activity(一) Android动态部署四:怎样从插

菜鸟学SSH(十四)——Spring容器AOP的实现原理——动态代理

之前写了一篇关于IOC的博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP. IOC负责将对象动态的注入到容器,从而达到一种需要谁就注入谁,什么时候需要就什么时候注入的效果,可谓是招之则来,挥之则去.想想都觉得爽,如果现实生活中也有这本事那就爽歪歪了,至于有多爽,各位自己脑补吧:而AOP呢,它实现的就是容器的另一大好处了,就是可以让容器中的对象都享有容器中的公共服务.那么容器是怎么做到的呢?它怎么就能让在它里面的对象自动拥有它

用spring aop实现动态代理的例子

下面由我来给大家展示用spring aop实现动态代理的例子(电脑打印) 下面就看一下具体的代码: 先定义一个打印机的接口 1 package aop007_ComPrint; 2 3 public interface Print { 4 5 public void ColorPrint(); //彩色打印 6 public void WhitePrint(); //黑白打印 7 } 然后定义两个实现类,分别实现彩色打印和黑白打印 1 package aop007_ComPrint; 2 3 p

Tomcat项目静态和动态部署方式

Tomcat项目部署方式 一.静态部署 1.直接将web项目文件件拷贝到webapps 目录中   Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用.   所以可以将JSP程序打包成一个 war包放在目录下,服务器会自动解开这个war包,   并在这个目录下生成一个同名的文件夹.一个war包就是有特性格式的jar包,   它是将一个web程序的所有内容进行压缩得到.具体如何打包,可以使用许多开发工具的IDE环境,如Eclipse等.   也

Apache Hadoop集群离线安装部署(三)——Hbase安装

Apache Hadoop集群离线安装部署(一)--Hadoop(HDFS.YARN.MR)安装:http://www.cnblogs.com/pojishou/p/6366542.html Apache Hadoop集群离线安装部署(二)--Spark-2.1.0 on Yarn安装:http://www.cnblogs.com/pojishou/p/6366570.html Apache Hadoop集群离线安装部署(三)--Hbase安装:http://www.cnblogs.com/po