原文:http://blog.chinaunix.net/uid-26884465-id-3350348.html
AOP,面向切面编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
有两种方式可以实现aop,一种是根据利用jdk自带的proxy,另外一种是利用cglib的proxy.
一 jdk代理
JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中 InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。
自定义一个接口
public interface TestInterface {
public void insert();
}
实现接口
public class TestImpl implements TestInterface{
@Override
public void insert() {
// TODO Auto-generated method stub
System.out.println("插入数据");
}
}
创建jdk动态代理的工厂类
public class JdkDymanicProxyFactory implements InvocationHandler{
private Object targetObject;
public Object createProxyFactory(Object target){
this.targetObject = target;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
}
//执行方法的时候回去回调这个函数
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
//在这里做一下日记
System.out.println("execute:"+method.getName());
return method.invoke(targetObject, args);
}
}
测试执行结果
package com.lwq;
/**
* @author thomaslwq
* @version 创建时间:Sep 17, 2012 8:56:20 AM
* 类说明 利用jdk的动态代理实现aop
*/
public class JdkProxyTest {
public static void main(String args[]){
JdkDymanicProxyFactory jdpf = new JdkDymanicProxyFactory();
TestInterface ti = (TestInterface) jdpf.createProxyFactory(new TestImpl());
ti.insert();
}
}
运行结果如下:
execute:insert
插入数据
二 利用cglib代理实现aop
CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。 CGLIB是针对类实现代理的,主要对指定的类生成一个子类,并覆盖其中的方法, 因为是继承,所以不能使用final来修饰类或方法。和jdk代理实现不同的是,cglib不要求类实现接口。
即你可以直接编出一个类:
public class CglibTestImpl {
public void insert() {
// TODO Auto-generated method stub
System.out.println("插入数据");
}
}
然后创建cglib代理的工厂类:
package com.lwq;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* @author thomaslwq
* @version 创建时间:Sep 17, 2012 9:24:23 AM
* 类说明
*/
public class CglibProxyFactory implements MethodInterceptor{
private Object targetObject;
public Object createProxyInstance(Object target){
this.targetObject = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());
//设置回调函数
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
// TODO Auto-generated method stub
System.out.println("record:"+method.getName());
System.out.println("Object:"+obj.getClass());
System.out.println("targetObject:"+targetObject.getClass());
return method.invoke(targetObject, args);
}
}
最后写一个测试类:
package com.lwq;
/**
* @author thomaslwq
* @version 创建时间:Sep 17, 2012 9:29:21 AM
* 类说明
*/
public class CglibProxyTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
CglibProxyFactory cpf = new CglibProxyFactory();
//没有实现接口
CglibTestImpl ti = (CglibTestImpl)cpf.createProxyInstance(new CglibTestImpl());
ti.insert();
}
}
测试结果如下:
record:insert
插入数据
JDK动态代理和CGLIB字节码生成的区别?
* JDK动态代理只能对实现了接口的类生成代理,而不能针对类
* CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
因为是继承,所以该类或方法最好不要声明成final
分享到:
相关推荐
压缩包中的"aop"文件可能包含了一个简单的Spring AOP示例项目,包括了上述两种实现方式的源代码和配置文件。下载后,可以直接运行以观察AOP如何工作。 总结来说,Spring AOP提供了一种强大的方式来实现横切关注点,...
每种实现方式都有其适用场景和优缺点。基于代理的方式简单易懂,但受限于目标对象是否需要实现接口;AspectJ注解方式简化了代码,提高了可读性;XML配置提供了清晰的结构,适合大型项目;Java配置则结合了灵活性和可...
在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...
动态代理是实现AOP的一种常用技术,它允许在运行时创建代理对象,拦截对真实对象的调用,并在调用前后添加额外的行为。 在Java开发中,反射机制是实现动态代理的关键技术之一。反射提供了在运行时访问和操作类的...
本文将详细解析Spring AOP的三种实现方式,帮助你深入理解这一重要概念。 首先,理解AOP的基本概念至关重要。AOP是一种编程范式,它允许开发者定义“切面”,即关注点的模块化,如日志、事务管理等。这些切面可以...
在Spring框架中,AOP的实现有两种主要方式:一种是基于XML配置,另一种是基于注解。本篇将主要讨论如何通过注解方式来实现AOP编程。 首先,我们需要了解Spring中的核心注解。`@Aspect`是定义一个切面的注解,通常会...
Spring AOP,全称Spring面向切面编程,是Spring框架中的一个重要组成部分,它提供了一种在不修改原有代码的情况下,对...了解并熟练掌握这两种配置方式,能够帮助我们更好地利用Spring AOP提高代码的可维护性和复用性。
在Spring AOP中,切面可以通过两种方式定义:使用注解或者XML配置。在这个例子中,我们可能会选择注解方式,因为它更简洁且易于理解。 1. **创建切面类(Aspect)** 我们可以创建一个名为`LoggingAspect`的Java类...
通过研究这些示例,你可以更好地理解和应用这两种AOP实现方式。 总结来说,XML配置在Spring AOP中扮演着核心角色,它允许我们精细控制切面的定义、通知的执行时机以及代理的生成方式。无论是基于代理还是自动代理,...
总结一下,通过上述步骤,我们已经在Spring Boot应用中利用Spring AOP和注解方式实现了数据脱敏。这个拦截器可以在不修改原有业务代码的情况下,确保敏感信息在响应给客户端之前得到处理,提高了应用的安全性。同时...
2. 动态代理:Java提供两种动态代理方式,JDK动态代理和CGLIB代理。 - JDK动态代理:基于接口实现,适用于目标对象实现了接口的情况。AOP框架会动态生成一个实现了所有接口的代理类。 - CGLIB代理:如果目标对象...
在Spring中,AOP主要分为两种实现方式:基于XML配置和基于注解。本示例主要探讨注解方式。 1. **定义切面(Aspect)** 切面是关注点的模块化,它包含通知(Advice)和切入点(Pointcut)。在Spring中,我们可以...
综上所述,Spring AOP提供了通过XML配置和AOP标签两种方式来实现切面编程,帮助开发者更高效地组织代码,降低维护成本。无论选择哪种方式,理解切入点表达式、通知类型和切面的概念都是至关重要的。在Spring 2.5及...
Spring AOP的实现主要依赖于两种技术:动态代理和AspectJ。对于接口,Spring使用Java动态代理(JDK Proxy)创建代理对象;而对于类,Spring则使用CGLIB库生成子类代理。这两种方式都是在运行时生成代理对象,从而在...
Spring AOP主要通过两种方式实现:JDK动态代理和CGLIB代理。 - **JDK动态代理**: - 当目标对象实现了至少一个接口时,Spring会使用JDK的java.lang.reflect.Proxy类创建一个代理对象。 - 代理对象在调用实际方法...
AOP通过提供一种机制来分离这两种关注点,使得开发者能够更专注于核心业务逻辑的实现,同时又能灵活地处理那些横切关注点。 ##### 2.2 织入机制 AOP中的一个重要概念是“织入”(Weaving),它是将横切关注点代码...
- **代理(Proxy)**:Spring AOP通过代理模式来实现切面功能,有JDK动态代理和CGLIB代理两种方式。 **2. JDK 动态代理** - 当目标类实现了接口时,Spring AOP会选择使用JDK动态代理。它会生成一个实现了目标类所有...
详细介绍了AOP的核心功能(拦截功能)在底层是如何实现的;介绍了两种实现AOP的动态代理:jdk动态代理和cglib动态代理,并详细描述了它们在代码层面的实现。附有必须的cglib.jar和asm.jar
总结,AOP思想的Java实现主要有静态代理和动态代理两种方式。静态代理适用于代理类相对固定的场景,而动态代理则更加灵活,可以在运行时动态创建代理对象。无论哪种方式,它们都为我们的代码带来了更高的复用性和可...
通过以上两种配置方式,我们可以看到Spring AOP提供了非常灵活且强大的功能。使用`ProxyFactoryBean`可以针对单个对象进行精确控制,而`DefaultAdvisorAutoProxyCreator`则更适合于自动化的场景,特别是当项目中有...