面向切面编程(AOP)实现了从另一个层面解决了面向对象所不能解决的对象间耦合度问题。今天闲来无聊做了个模拟AOP的小例子,有不完善的地方请指出。
首先我们定义一个接口和实现类
package com.gzmu.dynamic.proxy.service;
import java.io.Serializable;
import com.gzmu.dynamic.proxy.po.User;
public interface UserService {
void saveUser(User user);
void updateUser(User user);
void deleteUser(User user);
User getUser(Serializable id);
}
package com.gzmu.dynamic.proxy.service.impl;
import java.io.Serializable;
import com.gzmu.dynamic.proxy.po.User;
import com.gzmu.dynamic.proxy.service.UserService;
public class UserServiceImpl implements UserService {
@Override
public void saveUser(User user) {
System.out.println("save user success!");
}
@Override
public void deleteUser(User user) {
System.out.println("delete user success!");
}
@Override
public User getUser(Serializable id) {
System.out.println("get user success!");
return null;
}
@Override
public void updateUser(User user) {
System.out.println("update user success!");
}
}
然后我们建立一个对UserService方法的拦截器。
package com.gzmu.dynamic.proxy.interceptor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import com.gzmu.dynamic.proxy.service.impl.UserServiceImpl;
public class UserServiceInterceptor implements InvocationHandler {
private Object targer;
private String methodName;
private BeforeInterceptor beforeInterceptor;
private AfterInterceptor afterInterceptor;
public UserServiceInterceptor(Object targer, String methodName) {
this.targer = targer;
this.methodName = methodName;
}
public void setBeforeInterceptor(BeforeInterceptor beforeInterceptor) {
if (this.beforeInterceptor == null)
this.beforeInterceptor = beforeInterceptor;
}
public void setAfterInterceptor(AfterInterceptor afterInterceptor) {
if (this.afterInterceptor == null)
this.afterInterceptor = afterInterceptor;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals(methodName)) {
execute(beforeInterceptor);
Object o = method.invoke(new UserServiceImpl(), args);
execute(afterInterceptor);
return o;
}
return method.invoke(targer, args);
}
private void execute(Interceptor interceptor) {
if (interceptor != null)
interceptor.execute();
}
}
因为我们想这个拦截器可以拦截到方法的调用,并且可以在方法的调用前后执行额外可以指定的操作,所以我们使用三个接口来实现这个功能。
package com.gzmu.dynamic.proxy.interceptor;
public interface Interceptor {
void execute();
}
// --------------------------------------------------------------
package com.gzmu.dynamic.proxy.interceptor;
public interface BeforeInterceptor extends Interceptor {
}
// --------------------------------------------------------------
package com.gzmu.dynamic.proxy.interceptor;
public interface AfterInterceptor extends Interceptor {
}
最后组装我们的拦截器来实现AOP操作
package com.gzmu.dynamic.proxy.test;
import java.lang.reflect.Proxy;
import org.junit.Test;
import com.gzmu.dynamic.proxy.interceptor.AfterInterceptor;
import com.gzmu.dynamic.proxy.interceptor.BeforeInterceptor;
import com.gzmu.dynamic.proxy.interceptor.UserServiceInterceptor;
import com.gzmu.dynamic.proxy.po.User;
import com.gzmu.dynamic.proxy.service.UserService;
import com.gzmu.dynamic.proxy.service.impl.UserServiceImpl;
public class TestCase {
@Test
public void test() {
UserServiceInterceptor interceptor = new UserServiceInterceptor(new UserServiceImpl(), "saveUser");
interceptor.setBeforeInterceptor(new BeforeInterceptor() {
@Override
public void execute() {
System.out.println("before saveUser...");
}
});
interceptor.setAfterInterceptor(new AfterInterceptor() {
@Override
public void execute() {
System.out.println("after saveUser...");
}
});
UserService serivce = (UserService) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] { UserService.class }, interceptor);
serivce.saveUser(new User());
serivce.updateUser(new User());
serivce.deleteUser(new User());
serivce.getUser(null);
}
}
运行结果如下
before saveUser...
save user success!
after saveUser...
update user success!
delete user success!
get user success!
怎么样,超爽吧,再也不用重复的编写同样的代码了,而且能然代码组织得更加有逻辑。
分享到:
相关推荐
在本主题中,我们将探讨如何使用Java动态代理来模拟实现Spring AOP的功能。 首先,我们需要了解Java中的两种动态代理机制:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于目标对象实现了接口的情况...
下面,我们将使用动态代理来实现AOP。首先,我们需要定义一个日志处理器,实现InvocationHandler接口。 ```java public class LogHandler implements InvocationHandler { private Logger logger = Logger....
动态代理是实现AOP的一种常见方式,特别是在Java中。 在Java中,动态代理主要涉及到两个类:java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler。Proxy类用于创建一个实现了特定接口的代理对象,而...
- **缓存机制**:在数据访问层,如果一个方法需要频繁访问数据库,可以使用动态代理在方法执行前先检查缓存,如果缓存中有结果则直接返回,避免了不必要的数据库访问。 - **事务管理**:动态代理可以用来管理事务...
Java动态代理是Java提供的一种在运行时创建代理对象的技术,它是通过实现InvocationHandler接口和使用Proxy类来实现的。在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如...
Java动态代理是Java编程中一个非常重要的特性,它在实际开发中被广泛应用于面向切面编程(Aspect-Oriented Programming,简称AOP)领域。AOP是一种编程范式,旨在提高代码的可重用性和模块化,通过将关注点分离,...
### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经...总之,通过本篇文章的学习,读者应该能够理解和掌握如何使用Java动态代理来实现AOP的基本原理及实践操作。
总结一下,Spring的AOP机制通过JDK动态代理和CGLIB动态代理提供了强大的横切关注点管理功能。开发者可以轻松地定义切面和通知,以实现如日志、事务管理等功能,同时保持核心业务代码的清晰和简洁。在Spring Boot项目...
这些代码可能涉及到如何创建分页对象,如何与数据库交互获取分页数据,以及如何在AOP中使用动态代理进行拦截和处理。 总的来说,Java分页、动态代理和AOP是Java开发中的关键技术,它们能帮助我们构建出更加高效、可...
Java动态代理是Java编程中一个重要的特性,它允许在运行时创建代理对象,这些代理对象可以作为原有对象的代理,实现在调用原有方法前后添加额外的功能,这正是AOP(面向切面编程)的核心思想。下面我们将深入探讨...
因此,在实际开发中,需要根据应用场景的性能要求和维护需求,权衡是否使用动态代理。 总之,AOP通过提供一种新的角度来解决OO编程中存在的问题,使得我们能够在保持业务逻辑清晰的同时,增加额外的通用功能。利用...
本篇文章将详细探讨如何通过Java的动态代理机制来模拟Spring AOP的核心概念。 首先,让我们了解什么是动态代理。在Java中,动态代理主要由`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口...
动态代理和AOP是Java和Spring框架中的重要概念,它们为开发者提供了强大的代码复用和模块化设计的能力。本文将深入解析这两个主题,并结合提供的源码进行详细讲解。 首先,让我们了解一下动态代理。在Java中,动态...
AOP通过提供一种机制来分离这两种关注点,使得开发者能够更专注于核心业务逻辑的实现,同时又能灵活地处理那些横切关注点。 ##### 2.2 织入机制 AOP中的一个重要概念是“织入”(Weaving),它是将横切关注点代码...
Java动态代理是Java提供的一种在运行时创建代理对象的技术,它是实现类似Spring AOP(面向切面编程)功能的关键机制之一。AOP允许我们在不修改已有代码的情况下,向程序添加额外的功能,比如日志记录、性能监控、...
动态代理是实现AOP的一种常见手段,尤其在Java中应用广泛。 动态代理主要分为JDK动态代理和CGLIB动态代理两种方式: 1. **JDK动态代理**: JDK动态代理基于接口实现,它通过`java.lang.reflect.Proxy`类和`java....