本文介绍了简单Aop实现的方法,意在抛砖引玉。
首先是简单的Aspect接口
package org.aspect;
/**
* 切面接口
*/
public interface Aspect {
/**
* 事先执行
*/
public void doBefore();
/**
* 事后执行
*/
public void doAfter();
}
然后是代理工厂
package org.aspect;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
/**
* 代理工厂类
*/
public class DynamicProxyFactory {
/**
* 私有构造方法
*/
private DynamicProxyFactory() {}
/**
* 工厂方法
*
* @param instance 代理目标类实例对象
* @param aspect 切面对象
*/
public static Object newInstance(Object instance, Aspect aspect) {
List<Aspect> aspectList = new ArrayList<Aspect>();
aspectList.add(aspect);
return newInstance(instance, aspectList);
}
/**
* 工厂方法
*
* @param instance 代理目标类实例对象
* @param aspectList 切面集合
*/
public static Object newInstance(Object instance, List<Aspect> aspectList) {
SimpleInvocationHandler hander = new SimpleInvocationHandler();
hander.setAspectList(aspectList);
hander.setSource(instance);
return Proxy.newProxyInstance(instance.getClass().getClassLoader(),
instance.getClass().getInterfaces(),
hander);
}
}
最后是代理执行类
package org.aspect;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.List;
/**
* 代理委托接口实现
*/
public class SimpleInvocationHandler implements InvocationHandler {
private Object source = null;
private List<Aspect> aspectList = null;
public Object getSource() {
return source;
}
public void setSource(Object source) {
this.source = source;
}
public List<Aspect> getAspectList() {
return aspectList;
}
public void setAspectList(List<Aspect> aspectList) {
this.aspectList = aspectList;
}
/**
* 委托方法
*
* @param proxy 代理对象
* @param method 代理方法
* @param args 方法参数
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
for (Aspect aspect : aspectList) {
aspect.doBefore();
}
Object retObj = method.invoke(getSource(), args);
for (int index = aspectList.size() - 1; index >= 0; index--) {
aspectList.get(index).doAfter();
}
return retObj;
}
}
测试代码
public interface Student {
public void sayHello();
}
import org.aspect.Aspect;
public class StudentAspectOne implements Aspect {
@Override
public void doAfter() {
System.out.println("do After One");
}
@Override
public void doBefore() {
System.out.println("do Before One");
}
}
import org.aspect.Aspect;
public class StudentAspectTwo implements Aspect{
@Override
public void doAfter() {
System.out.println("do After Two");
}
@Override
public void doBefore() {
System.out.println("do Before Two");
}
}
public class StudentImpl implements Student {
@Override
public void sayHello() {
System.out.println("Student");
}
}
import java.util.ArrayList;
import java.util.List;
import org.aspect.Aspect;
import org.aspect.DynamicProxyFactory;
public class Test {
public static void main(String[] args) {
List<Aspect> aspectList = new ArrayList<Aspect>();
aspectList.add(new StudentAspectOne());
aspectList.add(new StudentAspectTwo());
Student s = (Student)DynamicProxyFactory.newInstance(new StudentImpl(), aspectList);
s.sayHello();
}
}
执行Test,控制台返回
do Before One
do Before Two
Student
do After Two
do After One
分享到:
相关推荐
在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...
通过这种方式,我们可以实现简单的Spring AOP功能,而无需使用Spring框架提供的内置AOP支持。然而,对于更复杂的需求,如基于注解的切面或自定义通知类型,使用Spring AOP的完整功能会更为合适。在实际项目中,...
下面我们将详细探讨如何使用Java动态代理实现委托模式,以及相关的源码和工具应用。 首先,理解委托模式的基本概念。委托模式通常由三部分组成:委托者(Delegate)、被委托者(Subject)和客户端(Client)。委托...
#### 三、Java动态代理实现步骤 1. **定义接口**:首先需要定义一个接口,这是代理对象需要实现的基础。 ```java public interface MyService { void doSomething(); } ``` 2. **实现接口**:接着实现该接口...
Java JDK提供了`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,它们是实现动态代理的关键组件。`Proxy`类用于创建代理对象,而`InvocationHandler`接口定义了一个方法,用于处理代理对象...
总的来说,Java动态代理和CGLIB动态代理都是强大的工具,能够帮助开发者实现AOP编程,提升代码的可维护性和复用性。根据实际需求和场景选择合适的代理方式,可以有效地优化应用程序的设计和性能。
Java动态代理是Java编程中一个非常重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以代替原对象执行某些额外的操作,而无需修改原对象的代码。动态代理在AOP(面向切面编程)中广泛应用,如日志记录、...
总的来说,Java动态代理是通过在运行时生成代理类或对象来实现对原有对象功能的扩展,它可以让我们在不修改原代码的情况下,灵活地插入横切关注点,如日志、事务管理、性能监控等。Spring AOP正是利用了这一特性,为...
CGlib是Spring AOP框架默认的动态代理实现。 ```java // 引入cglib依赖 <groupId>cglib <artifactId>cglib <version>3.3.0 // 使用CGLIB代理 Enhancer enhancer = new Enhancer(); enhancer.setSuperclass...
CGLIB库是另一个常用的Java动态代理实现,它使用ASM库在运行时动态生成字节码,从而创建代理对象。CGLIB的使用相比JDK动态代理更简单,不需要目标对象实现接口,但可能因为生成子类导致继承链过长的问题。 CGLIB的...
Java动态代理是Java编程中一个非常重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以代替原对象执行某些额外的操作,或者在调用原方法前后插入自定义的行为。这种技术广泛应用于AOP(面向切面编程)...
首先,我们要了解Java中实现动态代理的两种主要方式:`java.lang.reflect.Proxy`类和`java.lang.invoke.MethodHandle`接口。Proxy类是Java内置的动态代理实现,而MethodHandle则是在Java 7引入的新特性,提供了更...
在Spring框架中,动态代理主要用于AOP(面向切面编程)功能的实现,允许开发者在不修改原业务逻辑代码的情况下,添加额外的行为,如权限检查、事务处理等。 #### 动态代理的关键概念 1. **抽象角色**:通常指的是...
- Java动态代理简单易用,适用于有接口约束的情况,但如果原对象没有接口,或者需要提升性能,可能需要转向CGLib。 - CGLib无需接口限制,性能通常优于Java动态代理,但实现相对复杂,且由于创建子类,可能会遇到...
Java代理在软件开发中起着至关重要的作用,它允许我们为已有对象添加额外的功能或行为,而无需修改原对象的代码。代理模式是设计模式的一种,常见于面向切面编程(AOP)中,用于实现如日志、权限控制、事务处理等...
Spring AOP通过动态代理实现,有两种代理方式:JDK动态代理和CGLIB代理。JDK代理用于接口实现类,而CGLIB代理用于无接口或非代理类。 EL是JavaServer Faces (JSF) 和其他Java技术中用于在视图层解析表达式并获取...
2. 动态代理:动态代理模式在Java中主要通过Java的反射API和InvocationHandler接口实现。它可以动态地生成一个代理类,该代理类能够拦截对原对象的调用,并在调用前后添加额外的行为。这种模式常用于AOP(面向切面...
Spring AOP通过代理模式实现了这一功能,可以创建代理对象来拦截方法调用,执行切面逻辑。 在Spring中,注解方式实现AOP主要包括以下几个关键注解: 1. `@Aspect`:这个注解用于定义一个切面类,该类包含了若干个...
在Spring配置中启用AOP代理,并确保切面类被扫描到。如果使用XML配置,可以在`<context:component-scan>`标签中添加`<aop:aspectj-autoproxy/>`;如果使用Java配置,可在配置类上添加`@EnableAspectJAutoProxy`注解...
总结起来,Java代理机制的核心在于创建一个代理对象来封装原对象,代理对象可以在调用原对象方法的同时执行其他操作。在面向接口编程的帮助下,我们可以轻松地实现日志记录等跨切面的关注点,为软件开发带来更大的...