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面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
Spring AOP(面向切面编程)作为Spring框架的一个重要部分,为Java开发者提供了一个强大而灵活的工具来切入代码执行流程,实现关注点的分离。通过详细解析Spring AOP的源码,本文揭示了其背后的核心原理和实现机制。...
C++平台的面向切面编程(aop)的理论知识。需要的直接拿去研究吧。
编程语言+JAVAspring+AOP编程+面向切面...它介绍了JAVAspring的AOP编程的概念、原理和作用,以及如何使用JAVAspring的AOP编程来实现面向切面的功能,包括切点、通知、切面、织入的概念,以及一些配置文件和注解的用法。
易于理解的说明, 简单明了的DEMO,从正常的编程方式,演变到依赖注入,再演变到AOP切面编程。 描述了什么是反转控制,什么是容器
这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好地理解和利用Spring AOP来提高您的应用程序的可维护性和可扩展性。 内容亮点: JDK动态...
AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。本文给大家介绍Spring 的aop实现原理,感兴趣的朋友一起学习吧
一、适合人群 1、具备一定Java编程基础,初级开发者 ...(需要知道原理的请看spring aop源码,此处不做赘述) 3、可在现有源码上快速进行功能扩展 4、spring boot,mybatis,druid,spring aop的使用
主要介绍了Spring AOP面向切面编程实现原理方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了ThinkPHP5 框架引入 Go AOP,PHP AOP编程,结合具体项目项目分析了ThinkPHP5 引入 Go AOP,PHP AOP编程相关概念、原理、操作技巧与注意事项,需要的朋友可以参考下
本文详细介绍了Java编程中使用动态代理实现AOP功能,AOP是OOP的延续,意思是面向切面编程。 从这篇文章可以大体理解spring AOP的原理。
AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个...
面向方面的编程(AOP)是一种新的编程技术,它弥补了...首先进行了AOP与OOP的比较,给出了AOP的原理和AOP的JBoss实现,最后介绍AOP在设计模式中的应用,并说明了使用它所带来的设计益处以及在应用AOP中应注意的问题。
2、掌握基于XML/注解方式的AOP编程; 二:实验内容 1、 定义交易接口: public interface Transaction{ public void income(float amount);//收入 public void expenditure(float amount);//支出 } 定义银行账号...
老规矩,还是先看官方解释:AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。它是一种新的方
java 动态代理实现,模拟了spring实现aop的原理,对学习面向切面编程的朋友有帮助!
1.jdk动态代理:使用jdk中的Proxy,Method,InvocaitonHanderl创建代理对象,jdk动态代理要求目标类必须实现接口 2.cglib动态代理:第三方的工具库,创建代理对象,原理是继承。 通过继承目标类,创建子类,子类就是...
AOP是AspectOrientedPrograming的简称,面向切面编程。AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理、缓存、对象池管理以及日志记录。AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式...
AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。 何为切面? 一个和业务没有任何耦合相关的代码段,诸如:调用日志,...