Java实现简单的AOP(一)

来源:互联网 发布:《网络黑白》 编辑:程序博客网 时间:2024/05/19 17:57
AOP编程是面向切面编程,说白了,一段代码的执行归根结底是方法的执行,当一个系统写好之后,往往需要新的功能或者添加一些新的操作,这些新的功能又是一些方法,这些方法需要嵌入到原来的系统中,让他们在系统原有方法的执行前或者后等等位置执行,这个时候,有两种方案,修改原来的代码,违背了OCP,方案二,使用AOP;

AOP编程就是在程序的执行过程中找到一些切入点,嵌入一些新的方法,以改变程序原来的执行过程,宏观上看,程序的功能变强大了。

Java语言中AOP是用JDK动态代理技术来实现的:代码
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;interface IUserBean {       public void getUser();       public void addUser();       public void updateUser();         public void deleteUser();  }  class UserBean implements IUserBean {private String username = null;public UserBean() {}public UserBean(String username) {this.username = username;}public void setUsername(String username) {this.username = username;}public String getUsername(){return this.username;}public void addUser() {System.out.println("this is addUser() method!");}public void deleteUser() {System.out.println("this is deleteUser() method!");}public void getUser() {System.out.println("this is getUser() method!");}public void updateUser() {System.out.println("this is updateUser() method!");}}[color=red]class JDKProxy implements InvocationHandler {private Object targetObject;public Object createProxyObject(Object targetObject){this.targetObject=targetObject;return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),this.targetObject.getClass().getInterfaces(),this);}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {UserBean userBean = (UserBean) targetObject;String userName = userBean.getUsername();//权限判断if(userName!=null && !"".equals(userName)) {//调用目标对象的方法return method.invoke(targetObject, args);} else return null;}}[/color]public class Demo{public static void main(String[] args) {JDKProxy jProxy = new JDKProxy();//IUserBean userBean = (IUserBean) jProxy.createProxyObject(new UserBean(""));IUserBean userBean = (IUserBean) jProxy.createProxyObject(new UserBean("aaa"));userBean.addUser();userBean.updateUser();userBean.deleteUser();userBean.getUser();}}

可以看到,JDK动态代理模式其实就是使用了代理模式,创建了一个代理对象。

这个代理对象将原来的方法周围及嵌入了一些新方法,其余代理模式唯一的区别是,代理模式直接覆盖接口的方法,而jdk动态代理中使用了反射技术,仅仅需要覆盖InvokerHandler接口的invoke方法。

但是JDK动态代理仅仅对实现接口的那些类支持AOP编程,对于不实现接口的那些类则无能为力。为了解决这个问题我们使用CGLIG的代理技术,
import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;class UserBean {private String username = null;public UserBean() {}public UserBean(String username) {this.username = username;}public void setUsername(String username) {this.username = username;}public String getUsername(){return this.username;}public void addUser() {System.out.println("this is addUser() method!");}public void deleteUser() {System.out.println("this is deleteUser() method!");}public void getUser() {System.out.println("this is getUser() method!");}public void updateUser() {System.out.println("this is updateUser() method!");}}class CGLibProxy implements MethodInterceptor { private Object targetObject;public Object createProxyObject(Object targetObject) {this.targetObject = targetObject;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(this.targetObject.getClass()); //非final 进行覆盖enhancer.setCallback(this); //回调,通过return enhancer.create(); //创建代理对象}public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {UserBean userBean = (UserBean) targetObject;String userName = userBean.getUsername();Object result = null;if(userName!=null && !"".equals(userName)) {//调用目标对象的方法return methodProxy.invoke(targetObject, args);}  else return null;}}public class Demo{public static void main(String[] args) { CGLibProxy cProxy = new  CGLibProxy();//UserBean userBean = (UserBean) jProxy.createProxyObject(new UserBean(""));UserBean userBean = (UserBean) cProxy.createProxyObject(new UserBean("aaa"));userBean.addUser();userBean.updateUser();userBean.deleteUser();userBean.getUser();}}


Spring的AOP技术就是基于这两个技术实现的。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大班健康发生火灾怎么办 学生上课不提问怎么办 入户通知单丢了怎么办 打架后还来找事该怎么办 着火了怎么办教案视频 电脑一小半黑屏怎么办 绝地求生闪退怎么办 win7没浏览器了怎么办 浏览器被删除了怎么办 把快捷方式删了怎么办 ie文件找不到了怎么办 ie文件不存在了怎么办 大学素质分不够怎么办 素拓学分不够怎么办 大学毕业之前素拓分拿不满怎么办 武汉幼儿医保卡怎么办 养老院护工欺老人怎么办 皮肤毛孔粗大有痘印痘坑怎么办 额头上毛孔大怎么办 额头皮肤毛孔大怎么办 脸部粗糙毛孔大怎么办 脸上有痘印毛孔粗大怎么办 毛孔粗大痘印怎么办 教官12123一直加载怎么办 教官嗓子哑了怎么办 喜欢上考场教官怎么办 跟教官打起来怎么办 车险贴丢了怎么办 大学不想军训该怎么办 职高军训不想去怎么办 上大学不想军训怎么办 收费站忘记带钱怎么办 孕妇咳得厉害怎么办 怀孕九个月咳嗽怎么办 门冬氨酸高怎么办 代理保证金不退怎么办 电脑游戏太大下载慢怎么办 四川百裕制药怎么办 想退出学校中层怎么办 眼镜度数高了怎么办 眼睛散光200度怎么办