发布时间 : 星期四 文章Spring提供俩种方式实现AOP更新完毕开始阅读a898cf619b6648d7c1c74648
7. IUserBean userBean = (IUserBean) jProxy.createProxyObject(new UserBean(\8. userBean.addUser(); 9. } 10.}
执行成功后输出:
this is addUser() method!
再次修改测试类: Java代码
1. package com.royzhou.aop; 2.
3. public class TestProxy { 4.
5. public static void main(String[] args) { 6. JDKProxy jProxy = new JDKProxy();
7. IUserBean userBean = (IUserBean) jProxy.createProxyObject(new UserBean());
8. userBean.addUser(); 9. } 10.}
即当用户没有权限时,控制台不输出东西,说明我们拦截方法对其做的权限判断生效了.
从上面这个例子可以成功拦截了调用的方法并对其做了相应的处理
如果不使用JDK提供的Proxy类
通过cglib创建代理类,好处是不要求我们的目标对象实现接口 Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());
enhancer.setCallback(this); //回调,参数是一个实现MethodInterceptor接口的类,我们对代理对象的所有操作都经过它处理 return enhancer.create(); //创建代理对象
修改UserBean 去掉IUserBean接口
Java代码
1. package com.royzhou.aop; 2.
3. public class UserBean { 4.
5. private String userName = null; 6.
7. public UserBean() { 8. } 9.
10. public UserBean(String userName) { 11. this.userName = userName; 12. } 13.
14. public void addUser() {
15. System.out.println(\16. } 17.
18. public void deleteUser() {
19. System.out.println(\20. } 21.
22. public void getUser() {
23. System.out.println(\24. } 25.
26. public void updateUser() {
27. System.out.println(\28. } 29.
30. public String getUserName() { 31. return userName; 32. } 33.
34. public void setUserName(String userName) { 35. this.userName = userName; 36. } 37.}
通过cglib创建代理类
CGLibProxy.java Java代码
1. package com.royzhou.aop; 2.
3. import java.lang.reflect.Method; 4.
5. import net.sf.cglib.proxy.Enhancer;
6. import net.sf.cglib.proxy.MethodInterceptor; 7. import net.sf.cglib.proxy.MethodProxy; 8.
9. public class CGLibProxy implements MethodInterceptor { 10.
11. private Object targetObject; 12.
13. public Object createProxyObject(Object targetObject) { 14. this.targetObject = targetObject; 15. Enhancer enhancer = new Enhancer();
16. enhancer.setSuperclass(this.targetObject.getClass()); //非final 进行覆盖
17. enhancer.setCallback(this); //回调,通过 18. return enhancer.create(); //创建代理对象 19. } 20.
21. public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { 22. UserBean userBean = (UserBean) targetObject; 23. String userName = userBean.getUserName(); 24. Object result = null;
25. if(userName!=null && !\26. //调用目标对象的方法
27. result = methodProxy.invoke(targetObject, args); 28. }
29. return result; 30. } 31.}
编写测试类: Java代码
1. package com.royzhou.aop; 2.
3. public class TestProxy { 4.
5. public static void main(String[] args) { 6. CGLibProxy cProxy = new CGLibProxy();
7. UserBean userBean = (UserBean) cProxy.createProxyObject(new UserBean(\8. userBean.addUser(); 9. } 10.}
输出:
this is addUser() method!
当取消用户权限时,控制台不输出任何东西.
说明通过CGLib成功生成代理对象,拦截了目标对象的方法.
Spring主要通过代理来实现AOP
下面是AOP的一些基本概念:
切面(Aspect):对横切关注点的抽象(类似类对对象的抽象)
连接点(JoinPoint):被拦截到的点,泛指方法
切入点(CutPoint):对哪些连接点进行拦截的定义
通知(Advice):在特定的连接点,AOP框架执行的动作.前置/后置/例外/最终/环绕通知(调用方法之前执行,全部执行完毕之后)
引入(Introduction): 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。
目标对象(Target Object): 包含连接点的对象。也被称作 被通知或被代理对象。
AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
织入(Weaving): 组装方面来创建一个被通知对象。这可以在编译时 完成(例