`
GLC
  • 浏览: 112498 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Spring AOP上篇

    博客分类:
  • ssh
aop 
阅读更多

在Spring中、AOP的编程思想实际上跟我们之前用的过滤器或拦截器实现思路差不多;在了解AOP之前、我们先来说下代理模式吧;
代理模式:当程序不能或不想处理某个任务时,可以通过引用代理类来帮助它实行该任务。
    目标对象 -- 委托人即被代理的对象
   代理对象 -- 不能违背委托人的真实意愿,
代理要求:(代理对象必须跟目标对象具有相同的抽象接口)通俗讲就是不能违背目标对象的本意;所以、这里我们就要引入一个抽象接口的角色。

下面看例子:


/**
 * 代理模式测试
 */
	public void testProxy1()throws Exception{
  //同样的、先解析spring配置文件,通过解析实例化相应对象
		ApplicationContext ioc= new ClassPathXmlApplicationContext
				("applicationContext.xml");
    //这里一样不能实例化得到对象、要通过getBeam方法获取已实例化的对象
		TestAction action = (TestAction)ioc.getBean("testAction");
		try {
  //然后再调用要实现的方法
			action.saveObject();
			
			action.findByName();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
在spring配置文件中、我们需要配置如下方法;
<!-- 代理类 此配置旨在表达所找的代理对象-->
	<bean id="proxyDAO" class="hn.spring.why.ProxLogDAO">
		<property name="baseDAO" ref="hibernateDAO"/>
	</bean>
<!-- 此配置是原来的action所依赖的DAO 实现类、但现在通过上面的配置,引入到代理类中去实现了-->
<bean id="testAction" class="hn.spring.why.TestAction"
			scope="prototype">
		<!-- 维护当前action类依赖的DAO实现类-->
		<property name="baseDAO" ref="proxyDAO"/>  
		
	</bean>

接着代理目标对象输出日志信息
public class ProxLogDAO implements IBaseDAO {
	
	private IBaseDAO baseDAO; //代理的目标对象
  //注入目标对象
	public void setBaseDAO(IBaseDAO baseDAO) {
		this.baseDAO = baseDAO;
	}

	public void saveObject(Object obj) {
		System.out.println("【saveObject 日志处理 Begin............】");
		baseDAO.saveObject(obj); //调用目标对象上的目标方法
		System.out.println("【saveObject 日志处理 end............】");
	}

	public List getAllObectsByName(String name) {
		System.out.println("【getAllObectsByName 日志处理 Begin............】");
		List list = baseDAO.getAllObectsByName(name);
		System.out.println("【getAllObectsByName 日志处理 end............】");
		return list;
	}

}




这样就起到了代理作用、但这中静态代理也有问题,就是它必须基于抽象接口提供的不同代理类。系统中有多少抽象接口、就需要写多少代理类;它的灵活度是不够的。所以、我们大都实际使用中大都用的是动态代理。

动态代理:基于java发射API
在javaJDK文档中、我们要熟悉的有两个类,一个Proxy、它是提供用于创建动态代理类和静态方法;即动态地创建和代理类及代理类的实例。类中创建实例的方法是newProxyInstance();这个代理类实际上不存在的、它是运行时动态产生的也就是虚拟的。但是它是关联的呢、实际上,每个代理实例都有一个关联的调用处理 程序对象,它可以实现接口InvocationHandler;而在这个接口中有一个invoke方法、只要你调用这个接口,就会实现这个方法。、

下面来看例子吧


首先我们创建一个动态代理类、让它实现接口InvocationHandler

public class DynamicProxyDAO implements InvocationHandler {

//同时内部提供invoke方法
public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {

在这个类中、除了提供的方法,我们需要自己提供一个方法来实现动态创建代理类
public Object createProxyInstance(){
		/**
		 *  @param  loader 用于加载代理类动态实现的接口
		 *  @param  interfaces 目标对象上的所实现的接口列表(代理对象必须与目标对象具备相同的抽象接口)
		 *  @param  this  代理对象绑定的处理程序(代理对象上的方法被调用时,就会调用该接口中的invoke()
		 */
		
		return Proxy.newProxyInstance(loader ,interfaces , this);
	}

在实现此方法前、我们必须给它提供一个目标对象
private Object target; //被代理的目标对象
//用set方法来注入	
public void setTarget(Object target){
		this.target = target;
}
然后在创建动态代理方法中、我获取目标对象的类信息
Class clazz = target.getClass();
再将返回的值变换
return Proxy.newProxyInstance(clazz.getClassLoader(),
				clazz.getInterfaces(), this);
	

最后、同样地需要在spring配置文件中配置bean文件
<!-- 动态代理 -->
<bean id="dynamicDAO"class="hn.spring.why.DynamicProxyDAO">
		<property name="target" ref="hibernateDAO"/>
</bean>

现在我们来调用动态创建代理的方法
public void testProxy2()throws Exception{
		ApplicationContext ioc = new ClassPathXmlApplicationContext
				("applicationContext.xml");
		DynamicProxyDAO proxyDAO = (DynamicProxyDAO)ioc.getBean("dynamicDAO");
		
		//创建代理类的实例
		IBaseDAO baseDAO = (IBaseDAO)proxyDAO.createProxyInstance();
		
		//调用代理对象上的代理方法
		baseDAO.saveObject("");
	}



到这里、我似乎认为基本已经可以实现了;但是测试时发现这里还有一个重要的地方没做:反射调用
在上面的invoke方法中、我们代理方法中没调用目标对象上的目标方法;
Object result = method.invoke(target, args);
这里的args为参数数组
Return result;
这样便可以通过动态代理来调用实现类中方法;这就是动态代理。
分享到:
评论

相关推荐

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...

    Spring AOP依赖jar包

    本篇文章将详细介绍 Spring AOP 的核心概念、如何配置以及所依赖的 Jar 包,特别是 `AspectJ 1.6.12` 版本。 1. **AOP 概念** - **切面(Aspect)**:切面是关注点的模块化,如日志、事务管理等,它们横切多个对象...

    Spring aop 性能监控器

    本篇文章将深入探讨如何使用Spring AOP实现性能监控器,并通过源码分析来理解其工作原理。 首先,我们要了解AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入...

    spring AOP注解的应用1

    本篇主要探讨的是如何利用Spring AOP的注解来实现这些功能,包括前置通知、后置通知、返回通知和异常通知。 ### 前置通知(Before通知) 前置通知在目标方法执行之前运行。在Spring AOP中,我们使用`@Before`注解...

    springaop

    标题 "springaop" 暗示我们关注的是Spring框架中的AOP(面向切面编程)模块。在Spring框架中,AOP是一种强大的工具,它允许程序员定义“切面”,这些切面可以封装横切关注点,如日志、事务管理、性能监控等,将它们...

    使用SpringAop使用Oracle数据权限控制

    本篇将深入探讨如何结合Spring AOP和Oracle数据库来实现精细化的数据权限控制。 首先,我们需要理解Spring AOP的基本概念。AOP允许程序员定义“切面”,这些切面可以包含业务逻辑的多个方面,如方法调用前后的拦截...

    SpringAop xml方式配置通知

    本篇文章主要聚焦于Spring AOP的XML配置通知。 **一、AOP概念解析** 1. **切面(Aspect)**:一个关注点的模块化,例如事务管理就是一个切面。在Spring AOP中,切面由`@Aspect`注解的类定义。 2. **连接点(Join ...

    spring-aop AND proxy

    博文链接中提到的是作者“mofeichen”在iteye博客上分享的一篇关于Spring AOP的文章,虽然具体内容未给出,但可以推测可能涉及了AOP的原理、配置、使用示例以及在实际项目中的应用。 标签“源码”意味着这篇博客...

    Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结

    本篇文章将详细阐述Spring AOP的基本概念、种类、代理原理、通知类型以及切入点,帮助你深入理解这一强大的编程模式。 一、AOP概念 1. Joinpoint(连接点):在Spring AOP中,Joinpoint指的是程序执行的某个特定点...

    SpringAOP之探秘(动态代理、责任链模式、注解使用)

    本篇文章将深入探讨Spring AOP中的动态代理、责任链模式以及注解的使用。 首先,动态代理是实现AOP的关键技术之一。在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB。JDK动态代理基于接口,当目标类...

    初探spring aop内部实现 java

    本篇文章将深入探讨Spring AOP的内部实现,以及如何通过源代码理解其DataSource实现和FactoryBean模式。 首先,让我们了解AOP的基本概念。AOP的核心思想是“切面”,它封装了特定的关注点,如日志记录、事务管理、...

    Spring Aop demo

    描述中提到的博文链接指向了iteye博客上的一篇文章,尽管描述部分为空,但我们可以假设这篇文章详细介绍了如何创建和配置一个Spring AOP的示例。通常,这类文章会包含以下内容: 1. **AOP概念**:解释AOP的基本原理...

    Java动态代理(Spring Aop原理)

    这篇博客的文章链接虽然没有给出具体内容,但我们可以根据Java动态代理和Spring AOP的基本概念来深入探讨相关知识点。 首先,Java动态代理允许我们在运行时创建一个实现了特定接口的新类。这个新类会代理原始类,并...

    用xml配置的方式进行SpringAOP开发

    本篇文章主要讲解如何通过XML配置来实现Spring AOP的开发。 首先,了解AOP的基本概念。AOP通过“切面”(Aspect)来封装横切关注点,切面由“通知”(Advice)和“连接点”(Join Point)组成。通知是在特定连接点...

    通过动态代理模拟Spring AOP

    本篇文章将详细探讨如何通过Java的动态代理机制来模拟Spring AOP的核心概念。 首先,让我们了解什么是动态代理。在Java中,动态代理主要由`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口...

    用注解的方式进行SpringAOP开发

    本篇我们将深入探讨如何使用注解的方式来实现Spring AOP开发。 ### 一、注解基础 在Spring AOP中,主要使用以下几种注解: 1. `@Aspect`:定义一个切面类,切面是AOP的核心,包含通知(advisors)和切点...

    javaXML方式实现SpringAop编程(源码+jar包)

    本篇文章将深入探讨如何通过XML配置来实现Spring AOP,并结合提供的源码和jar包进行详细讲解。 首先,我们需要理解Spring AOP的基本概念。AOP是一种编程范式,用于将关注点(如日志、安全检查)与业务逻辑分离,...

    Spring-AOP-JDK动态代理

    本篇将详细讲解Spring中的AOP实现,特别是JDK动态代理的应用。 首先,我们要了解什么是AOP(Aspect Oriented Programming,面向切面编程)。AOP是一种编程范式,旨在解决应用程序中分散的、横切关注点的问题,如...

    使用Spring配置文件实现AOP

    这篇教程将详细讲解如何通过Spring的配置文件来实现AOP。 一、理解AOP概念 AOP的核心思想是将分散在各个模块中的交叉性代码(如日志、事务处理)抽取出来,形成独立的切面,以便于复用和维护。它提供了一种模块化的...

    Spring-AOP需要的外部包

    本篇将详细解析标题“Spring-AOP需要的外部包”以及描述中提及的两个关键包:`aspectjweaver.jar`和`aspectjrt.jar`。 首先,我们需要了解AOP的基本概念。面向切面编程(Aspect Oriented Programming,AOP)是一种...

Global site tag (gtag.js) - Google Analytics