java 之 AOP

来源:互联网 发布:vb窗体透明控件不透明 编辑:程序博客网 时间:2024/06/09 23:26

JDK的动态代理:

package com.ethan.aop;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import com.ethan.service.PersonServiceBean;public class JDKProxyFactory implements InvocationHandler {//被代理的目标对象private Object target;public Object getProxy(Object target) {this.target = target;return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {PersonServiceBean bean = (PersonServiceBean) this.target;Object result = null;if(bean.getUser()!=null) {//........advice()----->前置通知try {result = method.invoke(target, args);//afteradvice()---->后置通知} catch(Exception e) {//exceptionadvice()------->例外通知} finally {//finallyadvice()-----------最终通知}}return result;}}

如果类没有实现接口,那就让CGlib来吧:

package com.ethan.aop;import java.lang.reflect.Method;import com.ethan.service.PersonServiceBean;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;/** * 对没有接口的类, 产生代理类 * @author ETHAN * */public class CGlibProxyFactory implements MethodInterceptor{//被代理的目标对象private Object target;public Object getProxy(Object target) {this.target = target;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(target.getClass());//非final的类enhancer.setCallback(this);return enhancer.create();}@Overridepublic Object intercept(Object proxy, Method method, Object[] args,MethodProxy methodProxy) throws Throwable {PersonServiceBean bean = (PersonServiceBean) this.target;Object result = null;if(bean.getUser()!=null) {result = method.invoke(target, args);}return result;}}

package com.ethan.service;public interface PersonService {public void save(String name);public void update(String name,Integer personid);public String getPersonName(Integer personid);}

package com.ethan.service;/** * 根据权限 允许执行业务方法 * user -----------? null * @author ETHAN * */public class PersonServiceBean implements PersonService {private String user = null;public PersonServiceBean() {}public PersonServiceBean(String user) {this.user = user;}@Overridepublic void save(String name) {System.out.println("save()..................");}@Overridepublic void update(String name, Integer personid) {System.out.println("update()...............");}@Overridepublic String getPersonName(Integer personid) {System.out.println("getPersonName()..............");return "xxx";}public String getUser() {return user;}public void setUser(String user) {this.user = user;}}

import com.ethan.aop.CGlibProxyFactory;import com.ethan.aop.JDKProxyFactory;import com.ethan.service.PersonService;import com.ethan.service.PersonServiceBean;public class AOPTest {/** * @param args */public static void main(String[] args) {//testJDK();CGlibProxyFactory factory = new CGlibProxyFactory();//没有输出//PersonService service = (PersonService) factory.getProxy(new PersonServiceBean());PersonService service = (PersonService) factory.getProxy(new PersonServiceBean("xxx"));service.save("xxx");}private static void testJDK() {JDKProxyFactory factory = new JDKProxyFactory();//没有输出PersonService service = (PersonService) factory.getProxy(new PersonServiceBean());//PersonService service = (PersonService) factory.getProxy(new PersonServiceBean("xxx"));service.save("xxx");}}

===========================================================================================

AOP 概念:


aspect:横切性关注点的抽象即为切面。类是对物体特征的抽象;切面是横切性关注点的抽象。


joinpoint: 连接点。那些被拦截到的点。可以是方法(spring中),field,construtor


pointcut: 切入点。对 哪些 jointpoint, 哪些方法。。。进行拦截的定义。


advice: 拦截到joinpoint之后要做的事情 即通知。可分为前置,后置,异常,最终,环绕通知。


target: 代理的目标对象


weave: 织入。将aspect 应用到 target对象 并创建proxy对象的过程。


introduction: 引入。在不修改类代码的前提下,可以在运行期动态的为类添加一些方法或field

原创粉丝点击