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种类 1. 静态织入:在编译时完成,如AspectJ。 2. 动态织入:运行时进行,Spring AOP属于此类,又分为静态和动态两种形式。 三、Spring AOP代理原理 Spring AOP通过两种类型的代理来实现: 1. JDK动态代理:...
二、Spring AOP实现机制 Spring AOP通过动态代理来实现,主要有两种代理方式: 1. JDK动态代理:适用于实现了接口的目标对象,通过反射创建代理对象,代理对象在调用真实对象方法前/后执行通知。 2. CGLIB代理:...
Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它通过预定义的切点(Pointcut)来拦截方法的调用,并将横切关注点(如日志、事务管理等)与业务逻辑分离。本知识点将围绕Spring AOP的核心组件进行分析...
2. AOP的不同类型的通知 - **BeforeAdvice(前置通知)**:在目标方法执行之前执行的通知。 - **AfterAdvice(后置通知)**:在目标方法执行之后执行的通知。 - **AfterReturningAdvice(返回后通知)**:仅在...
2. **连接点(Join Point)**:程序执行过程中的特定点,如方法调用或异常抛出。 3. **通知(Advice)**:在特定连接点执行的代码,即切面要执行的行为。Spring提供了多种类型的Advice,包括MethodBeforeAdvice(在...
#### 二、AOP 关键概念 在深入了解 Spring AOP 之前,我们需要掌握以下几个关键概念: 1. **切面(Aspect)**: 定义了横切关注点的模块化封装。一个切面是由一系列的**通知(Advice)**组成,这些通知定义了切面的...
3. **工厂方法模式(Factory Method)**:Spring AOP中的`ProxyFactory`是一个典型的工厂方法模式实现,它根据不同的条件创建不同的代理对象,将实例化推迟到子类,提供了更大的灵活性。 4. **原型模式(Prototype...
- 使用`org.springframework.aop.framework.ProxyFactory`等接口来手动配置和创建包含通知的代理。 8. **动态代理**: - Spring AOP支持自动动态代理,根据需要创建代理实例。 9. **TargetSource替换**: - ...
接着,我们需要一个代理工厂(ProxyFactory)来创建代理对象,工厂会根据目标对象是否实现接口选择JDK或CGLIB。 1. 定义切点(Pointcut): - 可以使用正则表达式或者自定义注解来定义切点,表示哪些方法会被拦截...
1.ProxyFactory 基于 MethodBeforeAdvice、AfterReturningAdvice 利用 Spring Api 定义前、后置处理方法,并通过代理工厂类获取代理对象(代码或Xml配置实现) 2.ProxyFactoryBean 显式地设置 Advisors、Advice、...
2. **配置属性**: - `target`:这是必须设置的属性,表示要代理的目标对象。 - `interceptors`或`advisors`:这些属性用于指定拦截器或顾问,它们定义了在目标方法调用前后需要执行的行为。 - `proxyTargetClass...
使用ProxyFactory或ProxyFactoryBean实现计算器功能,同时(1)日志功能:在程序执行期间追踪正在发生的活动(打印出调用的方法,以及参数的参数值);(2)验证功能:希望计算器只能处理正数的运算,当有负数参与...
- **Spring AOP 的织入机制**:由 ProxyFactory 或 ProxyFactoryBean 在运行时自动完成。 ##### Target(目标对象) - **定义**:需要应用 Aspect 功能的对象。 - **实例化**:通常是一个具体的 Java 对象。 ####...
Spring AOP源码02:ProxyFactory Spring AOP源码03:JdkDynamicAopProxy Spring AOP源码04:MethodInvocation 拦截器调用 Spring AOP源码05:DefaultAdvisorAutoProxyCreator Spring期末考压轴题:当Spring AOP遇上...
在Spring中,`org.springframework.aop.framework.ProxyFactoryBean`或`org.springframework.aop.framework.ProxyFactory`可以用来创建JDK代理对象。 下面是一段简单的示例代码,展示了如何使用Spring的JDK动态代理...
使用`ProxyFactory`或`AopProxyFactoryBean`来创建代理,并将通知添加到代理工厂中。 总结起来,Spring AOP的通知类型提供了灵活的扩展机制,使得我们可以在不修改业务代码的前提下,实现如日志记录、事务管理、...
进入 ProxyFactory.getProxy 方法。createAopProxy 方法决定使用 JDK 还是 Cglib 创建代理对象。可以看出,默认是使用 JDK 动态代理创建代理对象,如果目标类是接口,则使用 JDK 动态代理,否则使用 Cglib。 在这里...
### Spring AOP 源码深度剖析 #### 一、Spring AOP 介绍与核心概念 Spring AOP(面向切面编程)是Spring框架提供的一个强大的功能模块,...理解和掌握这些核心原理对于深入学习Spring框架及其高级特性具有重要意义。
- `org.springframework.aop.framework.ProxyFactory`:这是一个非bean工厂类,提供了与`ProxyFactoryBean`相似的功能,但不依赖于IoC容器。 - `org.springframework.aop.framework.Advised`:这个接口定义了对代理...