1、问题描述:拦截所有业务方法,判断用户是否有权限,有权限就允许他执行业务方法。
1.1定义一个UserServcie业务接口
public interface UserService {
public void save();
public void update(String name,Integer userid);
public String getUserName(Integer userid);
}
1.2、编写实现UserServcie接口的类
public class UserServiceBean implements UserService {
private String user = null;
public UserServiceBean (String user){
this.user = user;
}
public UserServiceBean (){
}
public String getUserName(Integer userid) {
return "xxx";
}
public String getUser() {
return user;
}
public void save() {
// if(user!=null){System.out.println("我是save()方法");}
System.out.println("我是save()方法");
}
public void update(String name, Integer userid) {
System.out.println("我是update()方法");
}
}
2、编写JDKProxyFactory代理工厂类,要求实现java.lang.reflect.InvocationHandler接口,实现invoke方法.
public class JDKProxyFactory implements InvocationHandler{
private Object targetObject;
//创建目标对象的代理类
public Object createProxyInstance(Object targetObject){
this.targetObject = targetObject;
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
//實現目標對象的所有接口,InvocationHandler是回調
this.targetObject.getClass().getInterfaces(), this);
}
//當客戶端調用代理對象方法的時候,會先調用this的這個方法invoke
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
PersonServiceBean bean = (PersonServiceBean)this.targetObject;
Object result = null;
if(bean.getUser()!=null){
//最終方法的調用委派給目標對象targetObject
result = method.invoke(targetObject, args);
}else{
System.out.println("沒有權限,退出程序.....");
}
return result;
}
}
2.2 第二种方式,创建 CGlibProxyFactory代理工厂,要求实现MethodInterceptor接口,并实现其中的intercept方法.
(注:要加入cglib相关jar包)
public class CGlibProxyFactory implements MethodInterceptor{
private Object targetObject;
public Object createProxyInstance(Object targetObject){
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());//继承目标类,重写final方法
enhancer.setCallback(this);
return enhancer.create();
}
//类似struts2拦截器
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
UserServiceBean bean = (UserServiceBean)this.targetObject;
Object result = null;
if(bean.getUser()!=null){
result = method.invoke(targetObject, args);
}else{
System.out.println("沒有權限,退出程序.....");
}
return result;
}
}
3、编写测试类
public class AOPTest extends TestCase {
@Test
public void proxyTest(){
//测试JDKProxy
System.out.println("----------测试JDKProxy----------");
JDKProxyFactory factory = new JDKProxyFactory();
UserService userService = (UserService )factory.createProxyInstance(new UserServiceBean());
userService .save();
userService = (UserService )factory.createProxyInstance(new UserServiceBean("test"));
userService .save();
//测试CGlibProxy
System.out.println("----------测试CGlibProxy----------");
CGlibProxyFactory factory2 = new CGlibProxyFactory();
userService = (UserServiceBean)factory2.createProxyInstance(new PersonServiceBean());
userService .save();
userService = (UserServiceBean)factory2.createProxyInstance(new UserServiceBean("test"));
userService .save();
}
}
运行结果:
----------测试JDKProxy----------
沒有權限,退出程序.....
我是save()方法
----------测试CGlibProxy----------
沒有權限,退出程序.....
我是save()方法
分享到:
相关推荐
### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)...对于希望深入了解Spring AOP原理与实践的读者来说,掌握以上概念将是开启面向方面编程之旅的第一步。
面向切面编程(AOP)是一种编程范式,旨在将横切关注点(如日志、安全等)与业务逻辑分离,从而提高模块化。AOP通过预定义的“切面”对横切关注点进行模块化,从而可以在不修改业务逻辑代码的情况下增加新功能。动态...
### Spring AOP面向方面编程原理详解 #### 一、引言与定义 Spring AOP(Aspect Oriented Programming)是Spring框架中的一个核心组件,用于实现面向切面编程。AOP是一种编程范式,旨在将横切关注点(Cross-cutting...
总之,C++ AOP编程理论的研究和应用,能够帮助开发者在面对庞大的代码库维护挑战时,提供更加灵活和高效的解决方案。通过模拟或者采用专门的AOP工具,可以将横切关注点从核心业务逻辑中分离出来,从而提高代码的整洁...
本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...
Spring AOP,全称为Spring的面向切面编程,是Spring框架的重要组成部分,旨在实现关注点的分离,提高代码的可维护性和...对于那些需要更高级功能或对性能有更高要求的项目,可以考虑使用AspectJ进行更深入的AOP编程。
本文将深入探讨这两个主题,并结合JDK的反射和CGLIB库来阐述其实现原理。 首先,我们来看动态代理。动态代理是Java提供的一种在运行时创建代理对象的技术,它允许我们在不修改原有代码的情况下,为已有接口添加额外...
本教程将通过模拟Spring AOP来阐述如何实现一个简单的切面编程。我们将讨论以下几个核心概念:切面、通知、连接点和代理。 首先,我们要理解什么是切面。在AOP中,切面是关注点的模块化,它结合了“横切关注点”...
三、Spring AOP实现原理 1. 切面配置:在Spring中,切面可以通过XML配置或注解来定义。通知、切入点和引入都可以在切面中声明。 2. 代理创建:Spring根据目标对象是否实现了接口,选择使用JDK动态代理或CGLIB代理...
总之,Spring AOP通过代理技术实现了面向切面编程,使得开发者能够更专注于业务逻辑,而将通用的横切关注点剥离出来,提高了代码的可读性和可维护性。通过深入理解Spring AOP的实现机制,我们可以更好地利用这一强大...
总的来说,JavaEE CGLIB字节码增强方式提供了一种灵活的手段来实现AOP编程,它通过动态生成字节码创建目标类的子类,实现了对目标方法的拦截和增强,从而在不修改原有代码的基础上,增强了代码的功能和可维护性。...
Spring AOP 的底层实现技术 --- Jdk 动态代理原理 JDK 动态代理是 Spring AOP 的底层实现技术,允许开发者在运行期创建接口的代理实例。在 JDK 1.3 以后,JDK 动态代理技术提供了实现 AOP 的绝好底层技术。JDK 动态...
Java AOP(面向切面编程)是软件设计中的一个重要概念,它允许程序员定义“切面”,这些切面封装了特定的、与业务逻辑不直接相关的关注点,如日志、事务管理、性能监控等。AOP的核心思想是将横切关注点从核心业务...
编程语言+JAVAspring+AOP编程+面向切面...它介绍了JAVAspring的AOP编程的概念、原理和作用,以及如何使用JAVAspring的AOP编程来实现面向切面的功能,包括切点、通知、切面、织入的概念,以及一些配置文件和注解的用法。
**AOP(面向切面编程)**是一种编程范式,主要应用于处理系统中的横切关注点,例如日志记录、事务管理、权限控制等。它将这些分散在代码各处的功能抽取出来,集中管理和实现,使得核心业务逻辑更加清晰。 在Java中...
面向切面编程(Aspect-Oriented Programming, AOP)是一种编程范式,它旨在将横切关注点(cross-cutting concerns)从业务...了解这些实现机制的原理和优缺点,有助于开发者在设计和开发时选择最合适的方法来实现AOP。
本文将深入Spring源码,探索AOP的实现原理。 首先,我们需要理解AOP的基本概念。AOP允许开发者定义“切面”(Aspect),一个切面封装了跨越多个对象的横切关注点。切点(Pointcut)定义了这些关注点在何时何地被...
**Spring AOP编程实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的核心特性之一,它提供了一种在不修改原有代码的情况下,通过插入额外的行为(如日志、事务管理等)来增强功能的...
AOP是一种编程范式,用于将关注点(如日志、安全检查)与业务逻辑分离,使得代码更加模块化。在Spring中,AOP通过定义切面(Aspect)、通知(Advice)、切入点(Pointcut)和织入(Weaving)等概念来实现。 1. **切...