AOP(面向方面编程)是一种新的编程技术,它能够将那些本不应该纠缠在一起的任务分离开,从而为程序提供更好的封装性和互操作性.
AOP是通过代理机制实现的.
代理是指为其他对象提供一种代理以控制对这个对象的访问.
代理分为三种:
1.静态代理,代理对象必须实现目标对象的接口,且一个接口只服务于一种类型的目标对象。
2.JDK动态代理,代理对象必须实现java.lang.reflect.InvacationHandler接口,只能为接口创建代理实例。
3.CGLib动态代理,使用非常底层的字节码技术,可以为任何对象创建代理.
以下是目标对象接口和目标对象.
目标对象接口如下:<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package org.test.spring.aop;
public interface IHello
{
public void hello(String name);
}
目标对象如下:<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package org.test.spring.aop;
public class HelloSpeaker implements IHello
{
public void hello(String name)
{
System.out.print("Hi," + name);
}
}
一.静态代理静态代理比较容易理解,静态代理其实很容易理解,静态代理其实就是个装饰器而已.
让代理对象也实现目标对像的接口,这样做的目的是让使用者在使用代理对象时感觉不到代理对象的存在.
代理对象如下:<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package org.test.spring.aop;
public class HelloSpeakerProxy implements IHello
{
private IHello helloSpeaker;
public HelloSpeakerProxy(IHello helloSpeaker)
{
this.helloSpeaker = helloSpeaker;
}
public void hello(String name)
{
this.helloSpeaker.hello(name);
System.out.println(", welcome to our pub.");
}
public static void main(String[] args)
{
IHello helloSpeaker = new HelloSpeaker();
IHello proxy = new HelloSpeakerProxy(helloSpeaker);
proxy.hello("Huy Vanpon");
}
}
二.JDK动态代理所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package org.test.spring.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class HelloSpeakerProx implements InvocationHandler
{
private Object target;
public Object invoke(Object proxy, Method method, Object[] parameters)
throws Throwable
{
Object object = null;
try
{
object = method.invoke(target, parameters);
System.out.println(", welcome to our pub.");
}
catch (Exception e)
{
e.printStackTrace();
}
return object;
}
/**
* <p>
* 这个方法用于得到代理对象
* </p>
*
* @param target
* 目标对象
* @return result(Object)代理对象
*/
public Object getProxy(Object target)
{
this.target = target;
/**
* newProxyInstance(ClassLoader loader, Class<?>[] interfaces,
* InvocationHandler invocationHandler) loader: 定义代理类的加加载器(目标类的加载器)
* interfaces: 代理类要实现的接口列表 invocationHandler: 指派方法调用的调用处理程序
*/
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
public static void main(String[] args)
{
IHello proxy = (IHello) new HelloSpeakerProx()
.getProxy(new HelloSpeaker());
proxy.hello("Huy Vanpon");
}
}
三.CGLib动态代理使用jdk创建代理有一个限制,即它只能为接口创建代理实例.CGLib使用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的拦截技术,并顺势织入横切逻辑.
运行这个例子,一定要记得导入CGLib相应的包哦..
package org.test.spring.aop;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class HelloSpeakerPro implements MethodInterceptor
{
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz)
{
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object object, Method method, Object[] args,
MethodProxy proxy) throws Throwable
{
Object result = null;
result = proxy.invokeSuper(object, args);
System.out.println(", welcome to our pub.");
return result;
}
public static void main(String[] args)
{
HelloSpeakerPro helloSpeakerPro = new HelloSpeakerPro();
HelloSpeaker helloSpeaker = (HelloSpeaker) helloSpeakerPro
.getProxy(HelloSpeaker.class);
helloSpeaker.hello("Huy Vanpon");
}
}
分享到:
相关推荐
在Java编程领域,代理机制和面向切面编程(AOP)是两个重要的概念,它们在Spring框架中得到了广泛的应用。本文将深入探讨这两个主题,并结合JDK的反射和CGLIB库来阐述其实现原理。 首先,我们来看动态代理。动态...
3. **反射机制**:在AOP动态代理中,反射机制扮演着重要角色。通过反射,我们可以动态获取类的信息,包括类的字段、方法等,并能够在运行时动态地调用方法。在创建代理对象和处理方法调用时,都会用到反射。 4. **...
总结一下,Spring的AOP机制通过JDK动态代理和CGLIB动态代理提供了强大的横切关注点管理功能。开发者可以轻松地定义切面和通知,以实现如日志、事务管理等功能,同时保持核心业务代码的清晰和简洁。在Spring Boot项目...
动态代理是实现AOP的一种常用技术,它允许在运行时创建代理对象,拦截对真实对象的调用,并在调用前后添加额外的行为。 在Java开发中,反射机制是实现动态代理的关键技术之一。反射提供了在运行时访问和操作类的...
Java在JDK1.3后引入的动态代理机制,使我们可以在运行期动态的创建代理类。使用动态代理实现AOP需要有四个角色:被代理的类,被代理类的接口,织入器,和InvocationHandler,而织入器使用接口反射机制生成一个代理类...
它提供了一种更高级的动态代理机制,不仅可以基于JDK动态代理,还可以基于CGLIB库生成字节码实现代理。AOP允许开发者定义“切面”(Aspect),切面封装了关注点,如日志、事务、安全检查等,使得这些功能可以独立于...
织入是指将切面应用到目标对象,创建代理的过程。 总结来说,动态代理是AOP的核心实现手段之一,它使得我们可以无侵入地在原有业务代码基础上添加功能,提高了代码的可维护性和可扩展性。无论是JDK动态代理还是...
**Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的...
动态代理提供了创建代理对象的机制,而Spring AOP则是基于动态代理实现的面向切面编程框架,简化了在多处插入相同逻辑的复杂度。在实际开发中,理解并熟练运用这两个技术对于提高代码质量和可维护性至关重要。
总结来说,AOP的实现机制主要涉及切面、连接点、通知等概念,以及静态代理和动态代理的实现方式。在Spring框架中,AOP通过代理类和切点匹配来实现通知的自动插入,从而达到关注点分离的效果,提高了代码的可维护性和...
AOP代理是实现这一功能的关键机制。下面将详细解释Spring中的Aop代理。 1. AOP的基本概念: AOP的核心思想是将关注点分离,即将横切关注点(如日志、事务)与业务逻辑分离,使得代码更加模块化,易于维护。切面是...
本篇文章将详细探讨如何通过Java的动态代理机制来模拟Spring AOP的核心概念。 首先,让我们了解什么是动态代理。在Java中,动态代理主要由`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口...
5. AOP代理的使用:当通过Spring的依赖注入(DI)获取到一个对象时,实际上得到的是一个代理对象。通过这个代理对象调用方法,Spring会自动插入预先定义好的通知逻辑。 总的来说,JDK动态代理是Spring AOP实现的...
AOP通过代理机制实现了这一目标,代理可以在方法调用前后插入额外的代码,实现对原有功能的增强。 在Spring AOP中,有两种主要的代理方式:静态代理和动态代理。 1. **静态代理**:在静态代理中,我们需要手动创建...
当目标对象实现了至少一个接口时,Spring将使用JDK的动态代理机制。JDK动态代理通过实现InvocationHandler接口,并在运行时动态生成一个实现了目标对象所有接口的代理类。 - **JDK动态代理**:JDK的java.lang....
动态代理是Java提供的一种机制,它允许我们在运行时创建对象的代理,该对象可以代表原对象执行额外的操作。在Spring AOP中,有两种主要的代理方式:JDK动态代理和CGLIB代理。JDK动态代理基于接口实现,而CGLIB代理则...
AOP是一种编程范式,它强调从横切关注点的角度来组织和管理代码。在传统的面向对象编程中,关注点往往是按照功能或行为来划分的,例如将业务逻辑放在不同的类中。但是,某些关注点(如日志记录、事务处理等)并不...