`
隐形的翅膀
  • 浏览: 497370 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

AOP 学习, ProxyFactory 学习二

AOP 
阅读更多
ProxyFactory: 拦截具有接口的类


public interface ITask {
	
	public void execute();

}

public class TaskImpl implements ITask {

	@Override
	public void execute() {
		
		System.out.println("run code to here");

	}

}


import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class MessageDecorator implements MethodInterceptor{
	
	public Object invoke(MethodInvocation invocation) throws Throwable{
		System.out.print("hello\n");
		Object retVal=invocation.proceed();
		System.out.print("end");
		return retVal;
	}

}


//通过setInterfaces()方法可以明确告知ProxyFactory,我们要对ITask接口类型进行代理。

import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.NameMatchMethodPointcutAdvisor;
public class test2 {

	public static void main(String[] args) {
		
                TaskImpl target =new TaskImpl();
		
		ProxyFactory pf=new ProxyFactory(target);
		
		//pf.setInterfaces(Class[] interfaces) 函数原型
		pf.setInterfaces(new Class[]{ITask.class});
		//通过setInterfaces()方法可以明确告知ProxyFactory,我们要对ITask接口类型进行代理。
		
		
		NameMatchMethodPointcutAdvisor advisor = new NameMatchMethodPointcutAdvisor();  
		
		advisor.setMappedName("execute"); //切点
		
		advisor.setAdvice(new MessageDecorator()); //切面, 拦截时要执行的动作
		
		pf.addAdvisor(advisor); 
		
		ITask task=(ITask)pf.getProxy();
		
		task.execute();

	}
}




如果目标类实现了至少一个接口,不管我们有没有通过ProxyFactory的setInterfaces()方法明确指定要对特定的接口类型进行代理,只要不将ProxyFactory的optimize和ProxyTargetClass两个属性的值设置为true,那么ProxyFactory都会按照面向接口进行代理。

pf.setOptimize(true);
pf.setProxyTargetClass(true);

下面的代码和上面的代码输出结果是一样的

public static void main(String[] args) {
		
                TaskImpl target =new TaskImpl();
		
		ProxyFactory pf=new ProxyFactory(target);
		
		NameMatchMethodPointcutAdvisor advisor = new NameMatchMethodPointcutAdvisor();  
		
		advisor.setMappedName("execute"); 
		
		advisor.setAdvice(new MessageDecorator());
		
		pf.addAdvisor(advisor); 
		
		ITask task=(ITask)pf.getProxy();
		
		task.execute();

}



注意如果是基于接口进行代理的, 那么在最后从带来得到的类pf.getProxy(), 强制转化时, 必须是转化成接口类型的,


TaskImpl task=(TaskImpl)pf.getProxy();  这样是不允许的, 会抛出错误

如何强制使用CGLIB对具有接口的类进行代理呢, 只需要添加更换下面的代码

pf.setProxyTargetClass(true); // add this line

ITask task=(ITask)pf.getProxy();
		
//TaskImpl task=(TaskImpl)pf.getProxy(); // this line also works now
		
System.out.println(task.getClass());



结果

class TaskImpl$$EnhancerByCGLIB$$67d0dc43
hello
run code to here
end





分享到:
评论

相关推荐

    aop的详细总结(包含例子)

    二、AOP种类 1. 静态织入:在编译时完成,如AspectJ。 2. 动态织入:运行时进行,Spring AOP属于此类,又分为静态和动态两种形式。 三、Spring AOP代理原理 Spring AOP通过两种类型的代理来实现: 1. JDK动态代理:...

    spring-aop.rar_aop1270_spring_spring aop

    二、Spring AOP实现机制 Spring AOP通过动态代理来实现,主要有两种代理方式: 1. JDK动态代理:适用于实现了接口的目标对象,通过反射创建代理对象,代理对象在调用真实对象方法前/后执行通知。 2. CGLIB代理:...

    springAOP核心组件分析

    Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它通过预定义的切点(Pointcut)来拦截方法的调用,并将横切关注点(如日志、事务管理等)与业务逻辑分离。本知识点将围绕Spring AOP的核心组件进行分析...

    小马哥讲 Spring AOP 编程思想 - API 线索图.pdf

    2. AOP的不同类型的通知 - **BeforeAdvice(前置通知)**:在目标方法执行之前执行的通知。 - **AfterAdvice(后置通知)**:在目标方法执行之后执行的通知。 - **AfterReturningAdvice(返回后通知)**:仅在...

    SpringAOP

    2. **连接点(Join Point)**:程序执行过程中的特定点,如方法调用或异常抛出。 3. **通知(Advice)**:在特定连接点执行的代码,即切面要执行的行为。Spring提供了多种类型的Advice,包括MethodBeforeAdvice(在...

    spring aop

    #### 二、AOP 关键概念 在深入了解 Spring AOP 之前,我们需要掌握以下几个关键概念: 1. **切面(Aspect)**: 定义了横切关注点的模块化封装。一个切面是由一系列的**通知(Advice)**组成,这些通知定义了切面的...

    第四章:Spring AOP API 设计模式1

    3. **工厂方法模式(Factory Method)**:Spring AOP中的`ProxyFactory`是一个典型的工厂方法模式实现,它根据不同的条件创建不同的代理对象,将实例化推迟到子类,提供了更大的灵活性。 4. **原型模式(Prototype...

    第二章:Spring AOP 基础1

    - 使用`org.springframework.aop.framework.ProxyFactory`等接口来手动配置和创建包含通知的代理。 8. **动态代理**: - Spring AOP支持自动动态代理,根据需要创建代理实例。 9. **TargetSource替换**: - ...

    个人用java动态代理模拟实现spring aop

    接着,我们需要一个代理工厂(ProxyFactory)来创建代理对象,工厂会根据目标对象是否实现接口选择JDK或CGLIB。 1. 定义切点(Pointcut): - 可以使用正则表达式或者自定义注解来定义切点,表示哪些方法会被拦截...

    AOP 和 Aspect 注解切入 测试 Demo

    1.ProxyFactory 基于 MethodBeforeAdvice、AfterReturningAdvice 利用 Spring Api 定义前、后置处理方法,并通过代理工厂类获取代理对象(代码或Xml配置实现) 2.ProxyFactoryBean 显式地设置 Advisors、Advice、...

    spring-aop-ProxyFactoryBean 源码分析

    2. **配置属性**: - `target`:这是必须设置的属性,表示要代理的目标对象。 - `interceptors`或`advisors`:这些属性用于指定拦截器或顾问,它们定义了在目标方法调用前后需要执行的行为。 - `proxyTargetClass...

    AOP实现计算器代码.zip

    使用ProxyFactory或ProxyFactoryBean实现计算器功能,同时(1)日志功能:在程序执行期间追踪正在发生的活动(打印出调用的方法,以及参数的参数值);(2)验证功能:希望计算器只能处理正数的运算,当有负数参与...

    spring AOP 概念

    - **Spring AOP 的织入机制**:由 ProxyFactory 或 ProxyFactoryBean 在运行时自动完成。 ##### Target(目标对象) - **定义**:需要应用 Aspect 功能的对象。 - **实例化**:通常是一个具体的 Java 对象。 ####...

    Spring AOP 自动代理源码 DefaultAdvisorAutoProxyCreator

    Spring AOP源码02:ProxyFactory Spring AOP源码03:JdkDynamicAopProxy Spring AOP源码04:MethodInvocation 拦截器调用 Spring AOP源码05:DefaultAdvisorAutoProxyCreator Spring期末考压轴题:当Spring AOP遇上...

    Spring_0300_JDKProxy

    在Spring中,`org.springframework.aop.framework.ProxyFactoryBean`或`org.springframework.aop.framework.ProxyFactory`可以用来创建JDK代理对象。 下面是一段简单的示例代码,展示了如何使用Spring的JDK动态代理...

    如何使用Spring AOP的通知类型及创建通知

    使用`ProxyFactory`或`AopProxyFactoryBean`来创建代理,并将通知添加到代理工厂中。 总结起来,Spring AOP的通知类型提供了灵活的扩展机制,使得我们可以在不修改业务代码的前提下,实现如日志记录、事务管理、...

    Spring源码学习十二:@Transactional是如何工作的1

    进入 ProxyFactory.getProxy 方法。createAopProxy 方法决定使用 JDK 还是 Cglib 创建代理对象。可以看出,默认是使用 JDK 动态代理创建代理对象,如果目标类是接口,则使用 JDK 动态代理,否则使用 Cglib。 在这里...

    spring 总结.pdf

    ### Spring AOP 源码深度剖析 #### 一、Spring AOP 介绍与核心概念 Spring AOP(面向切面编程)是Spring框架提供的一个强大的功能模块,...理解和掌握这些核心原理对于深入学习Spring框架及其高级特性具有重要意义。

    SPRING对动态代理的封装

    - `org.springframework.aop.framework.ProxyFactory`:这是一个非bean工厂类,提供了与`ProxyFactoryBean`相似的功能,但不依赖于IoC容器。 - `org.springframework.aop.framework.Advised`:这个接口定义了对代理...

Global site tag (gtag.js) - Google Analytics