在业务对象执行某个方法时,在业务方法前和方法后均让操作者执行相应操作(切面编程), 操作者和业务者均面向接口编程,并在代理类中
实现解耦。即操作方法和业务方法的执行能够最大限度独立。
1. 先定义日志等级:
package boke.javamode.log;
/**
* 日志等级
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public enum Level {
INFO,WARN,DEBUG;
}
2. 日志类-可扩展
package boke.javamode.log;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 日志
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public class Logger {
public static void log(Level level, String logInfo) {
if (level.equals(Level.INFO)) {
System.out.println("Logger INFO : "
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Date()) + " " + logInfo);
} else if (level.equals(Level.WARN)) {
System.out.println("Logger WARN : "
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Date()) + " " + logInfo);
} else if (level.equals(Level.DEBUG)) {
System.out.println("Logger DEBUG : "
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Date()) + " " + logInfo);
}
}
}
3. 业务接口
package boke.javamode;
/**
* 业务接口
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public interface ISay {
void sayHello(String name);
void sayGoodBye(String name);
}
4. 业务对象
package boke.javamode;
/**
* 业务对象
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public class Say implements ISay {
public void sayGoodBye(String name) {
System.out.println("GoodBye " + name);
}
public void sayHello(String name) {
System.out.println("Hello " + name);
}
}
5. 操作者接口
package boke.javamode;
import java.lang.reflect.Method;
/**
* 操作者接口
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public interface IOperationExecutor {
/**
* 方法执行之前的操作
*
* @param method
*/
void start(Method method);
/**
* 方法执行之前的操作
*
* @param method
*/
void end(Method method);
}
6. 操作者实现
package boke.javamode;
import java.lang.reflect.Method;
import boke.javamode.log.Level;
import boke.javamode.log.Logger;
/**
* 操作者实现
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public class LoggerOperation implements IOperationExecutor {
public void end(Method method) {
Logger.log(Level.INFO, method.getName() + " method end...");
}
public void start(Method method) {
Logger.log(Level.INFO, method.getName() + " method start...");
}
}
7. 动态代理实现 - JDk提供的动态代理实现机制
package boke.javamode;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import boke.javamode.log.Level;
import boke.javamode.log.Logger;
/**
* 动态代理
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public class DynamicProxySay implements InvocationHandler {
private Object proxyOperation; // 操作者对象
private Object proxyLogic; // 业务逻辑对象
/**
* 获得代理对象(业务逻辑)
*
* @param proxyOperation
* @param proxyLogic
* @return
*/
public Object getProxyObj(Object proxyOperation, Object proxyLogic) {
this.proxyOperation = proxyOperation;
this.proxyLogic = proxyLogic;
return Proxy.newProxyInstance(this.proxyLogic.getClass()
.getClassLoader(), this.proxyLogic.getClass().getInterfaces(),
this);
}
/**
* JVM动态调用
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object resultObj = null;
try {
Class operCls = this.proxyOperation.getClass();
Method start = operCls.getMethod("start",
new Class[] { Method.class });
// 反射执行start方法
start.invoke(proxyOperation, new Object[] { method });
// 执行业务逻辑对象
resultObj = method.invoke(proxyLogic, args);
Method end = operCls.getMethod("end", new Class[] { Method.class });
// 反射执行end方法
end.invoke(proxyOperation, new Object[] { method });
} catch (Exception e) {
e.printStackTrace();
}
return resultObj;
}
}
8. 客户端
package boke.javamode;
/**
* 客户端
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
IOperationExecutor operExe = new LoggerOperation();
ISay say = new Say();
ISay proxySay = (ISay) new DynamicProxySay().getProxyObj(operExe, say);
proxySay.sayHello("Alice");
System.out.println();
proxySay.sayGoodBye("Bob");
}
}
// 输出:
Logger INFO : 2010-07-10 18:27:35 sayHello method start...
Hello Alice
Logger INFO : 2010-07-10 18:27:35 sayHello method end...
Logger INFO : 2010-07-10 18:27:35 sayGoodBye method start...
GoodBye Bob
Logger INFO : 2010-07-10 18:27:35 sayGoodBye method end...
分享到:
相关推荐
在Spring框架中,AOP(面向切面编程)是一个核心特性,它允许开发者将横切关注点(如日志、事务管理等)与业务逻辑分离,实现代码的解耦和复用。然而,在某些场景下,我们可能需要访问被AOP代理的对象背后的真实目标...
综上所述,AOP为软件设计带来了模块化和解耦的优势,Spring通过JDK动态代理和CGLib动态代理提供了灵活的实现。理解并掌握这两种代理方式,对于深入理解和有效利用Spring AOP至关重要。在实际开发中,根据业务需求和...
3. 转账服务接口和服务实现:定义转账业务的接口和实现,其中转账方法不包含任何事务管理代码。 4. 配置文件:XML配置文件中会定义事务管理器、事务属性以及代理对象的配置。 5. 测试类:通过测试类验证转账业务的...
总之,基于Java动态代理和反射机制实现ORM,可以有效地解耦业务逻辑和数据库操作,提高代码的可读性和可维护性。虽然现有的ORM框架如Hibernate、MyBatis已经相当成熟,但对于学习和理解Java的高级特性,这样的实践...
当通过Proxy类创建代理对象时,需要提供一个实现了InvocationHandler接口的实例。这个实例将在方法被调用时介入,执行额外的逻辑。 以下是一个简单的例子,展示了如何使用Java动态代理实现AOP: ```java import ...
2. CGLIB库:当目标类没有实现接口时,CGLIB库可以通过字节码操作生成子类实现动态代理。 现在,我们转向"AOP(面向切面编程)"。AOP是Spring框架的核心特性之一,它允许我们将关注点(如日志、事务管理、安全检查...
总结来说,Spring AOP通过动态代理实现了面向切面编程,利用反射在运行时生成代理对象并插入通知代码。这种设计让开发者能够专注于业务逻辑,而不必关心横切关注点的实现细节,提高了代码的可维护性和复用性。理解...
通过实现`InvocationHandler`接口并提供一个执行处理器,再通过`Proxy`类创建一个代理对象,就可以在不修改原有业务逻辑的情况下,实现对方法的增强。 #### 四、利用Java动态代理实现AOP的具体步骤 1. **定义业务...
另外,CGLIB是一个强大的高性能的代码生成库,它可以用来扩展Java类与实现Java接口,并且提供了一个API来动态地创建代理对象。 在Spring Boot中,AOP(面向切面编程)是通过动态代理实现的,用于解耦核心业务逻辑和...
3. **灵活性**:动态代理允许在运行时决定代理对象的行为,便于实现动态织入和切面的灵活配置。 在Java中,动态代理主要有两种方式:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于目标类实现有接口...
5. 使用代理对象:在业务代码中,通过工厂获取到代理对象,并调用其接口方法,实际上会触发`InvocationHandler`中的`invoke()`方法,执行预定义的增强操作。 这样的设计不仅保持了代码的整洁,还实现了高内聚、低...
Java动态代理是Java提供的一种强大的功能,它允许我们在运行时创建代理对象,这些代理对象可以扩展或修改目标对象的行为。在本场景中,我们将探讨如何使用Java动态代理结合注解来实现日志拦截,以便在调用方法时记录...
总的来说,JDK动态代理是Spring AOP实现的基础,它允许我们在运行时动态创建代理对象,实现对方法调用的拦截和增强。Spring AOP则在此基础上提供了更高级的抽象,让我们可以方便地定义和管理切面,从而实现更灵活的...
Java 动态代理是实现AOP(面向切面编程)的一种常见方式,尤其适用于日志记录、性能统计、安全控制和事务处理等横切关注点的分离。在Java中,从JDK 1.2开始,`java.lang.reflect.Proxy`类和`java.lang.reflect....
在"AopDemo"这个文件中,我们可以期待看到一个完整的示例,它将演示如何使用JDK动态代理和CGLIB来创建代理对象,并添加增强功能。通过这个例子,开发者可以更好地理解AOP的工作原理,以及如何在实际项目中应用这两种...
它通过将这些关注点与核心业务逻辑分离,实现代码的解耦,提高可维护性和复用性。动态代理是实现AOP的一种常见方式,特别是在Java中。 在Java中,动态代理主要涉及到两个类:java.lang.reflect.Proxy和java.lang....
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。AOP的核心概念是切面、通知、连接点、切入点和织入。在...
2. CGLIB动态代理:当被代理对象没有实现接口时,Spring会使用CGLIB库来创建代理。CGLIB是一个代码生成库,可以在运行时动态地生成子类,以此实现对目标类的代理。Enhancer类是CGLIB的主要入口,可以用来定制生成的...
动态代理是指在程序运行时,根据指定的接口动态创建一个代理类,并且这个代理类可以实现与被代理对象相同的行为。在Java中,动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler...