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
- java 之 AOP
- Java AOP 之 AspectJ
- Java AOP 之 AspectJ
- JAVA AOP之ASM
- java框架之AOP框架
- Java框架之AOP框架
- java框架之AOP框架
- java 之 简易AOP Framework
- JAVA AOP之动态代理
- java基础之AOP原理
- AOP系列之三:用Java动态代理实现AOP
- 什么是AOP系列之:用Java动态代理实现AOP
- JAVA AOP编程之动态代理技术
- JAVA面试之AOP与IOC解析
- Spring AOP 之 java 动态代理基础
- Spring Boot AOP之Java 动态代理
- java学习笔记之: spring-aop
- java基础之ioc和aop
- 14条最佳JS代码编写技巧
- 操作XML公共类 .
- java_xml读取写入方法
- Count/Sum of Form记录数合计数
- 内核空间与用户空间的内存映射
- java 之 AOP
- Netty 3.1 中文用户手册(一)-序言
- Tomcat与Apache服务器
- 浅谈java Timer
- html+js实现表格增删
- mysql 性能优化方案
- Netty 3.1 中文用户手册(二)-开始
- Perl中find的用法
- [Linux笔记]Linux内核的Makefile和kconfig解读