Spring提供俩种方式实现AOP 联系客服

发布时间 : 星期四 文章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): 组装方面来创建一个被通知对象。这可以在编译时 完成(例