zoukankan      html  css  js  c++  java
  • JDK及CGLIB动态代理-AOP4种增强

    动态代理 AOP底层实现:有接口自动应用的就是JDK动态代理
    (1).JDK 在运行时运行时注入
    本质:在内存中构建出接口的实现类
    特点:被代理对象,必须有接口

    实例:

    复制代码
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    public class Test {
        public static void main(String[] args) {
          final SomeService service = new SomeServiceImpl();
    
          SomeService proxy =(SomeService)Proxy.newProxyInstance(service.getClass().getClassLoader(),
                  service.getClass().getInterfaces(), new InvocationHandler() {
                      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                          System.out.println("before=======");
                          method.invoke(service,args);
    System.out.println("after========"); return null; } }); proxy.doSome(); } }
    复制代码

    Cglib 底层,注入,编译期已经注入了
    本质:在内存中生成被代理类(目标类)的【子类】
    特点:可以在没有接口的情况下代理
    对于不使用接口的业务类,无法使用JDK动态代理,cglib采用非常底层的字节码技术,
    可以为一个类创建子类

    复制代码
    import cn.SomeServiceImpl;
    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    
    import java.lang.reflect.Method;
    
    
    public class Test {
        public static void main(String[] args) {
            final SomeServiceImpl someService = new SomeServiceImpl();
    
            Enhancer enhancer = new Enhancer();
    
            enhancer.setSuperclass(someService.getClass());
            enhancer.setCallback(new MethodInterceptor() {
                public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                    System.out.println("=======before");
                    methodProxy.invoke(someService,objects);
                    return null;
                }
            });
            SomeServiceImpl proxy = (SomeServiceImpl) enhancer.create();
            proxy.doSome();
        }
    }
    复制代码

    接下来是四种增强

    前置增强 MethodBeforeAdvice

    复制代码
    import org.springframework.aop.AfterReturningAdvice;
    
    import java.lang.reflect.Method;
    
    public class AfterAdvice implements AfterReturningAdvice {
        public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
            System.out.println("after========");
        }
    }
    复制代码
    复制代码
    <bean id="service" class="cn.SomeServiceImpl"></bean>
    <bean id="beforeAdvice" class="cn.BeforeAdvice"></bean> <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="service"></property> <property name="interceptorNames" value="beforeAdvice"></property> </bean>
    复制代码

    后置增强 AfterReturingAdvice

    复制代码
    import org.springframework.aop.AfterReturningAdvice;
    
    import java.lang.reflect.Method;
    
    public class AfterAdvice implements AfterReturningAdvice {
        public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
            System.out.println("after========");
        }
    }
    复制代码

    xml文件内容

    复制代码
       <bean id="service" class="cn.SomeServiceImpl"></bean>
    
        <bean id="afterAdvice" class="cn.AfterAdvice"></bean>
    
        <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
            <property name="target" ref="service"></property>
            <property name="interceptorNames" value="afterAdvice"></property>
        </bean>
    复制代码

    3.环绕增强

    复制代码
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    public class HrAdvice implements MethodInterceptor {
        public Object invoke(MethodInvocation methodInvocation) throws Throwable {
            System.out.println("before====");
            methodInvocation.proceed();
            System.out.println("after====");
            return null;
        }
    }
    复制代码

    xml文件

    复制代码
       <bean id="service" class="cn.SomeServiceImpl"></bean>
    
        <bean id="hrAdvice" class="cn.HrAdvice"></bean>
    
        <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
            <property name="target" ref="service"></property>
            <property name="interceptorNames" value="hrAdvice"></property>
        </bean>
    复制代码

    异常增强

    public class MyThrowsAdvice implements ThrowsAdvice {
        public void afterThrowing(Exception e){
            System.out.println("网络异常......");
        }
    }
    复制代码
       <bean id="service" class="cn.SomeServiceImpl"></bean>
    
        <bean id="throwsAdvice" class="cn.MyThrowsAdvice"></bean>
    
        <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
            <property name="target" ref="service"></property>
            <property name="interceptorNames" value="throwsAdvice"></property>
        </bean>
  • 相关阅读:
    关于一道PHP面试题的解法
    ThinkPHP学习(二)
    ThinkPHP学习(一)
    Apache 创建虚拟主机目录和设置默认访问页面
    awk全集
    初识云计算&openstack
    Python collections
    Python 函数/高阶函数
    Python dic/set/迭代
    python matplotlib 图标绘制
  • 原文地址:https://www.cnblogs.com/buai/p/8587800.html
Copyright © 2011-2022 走看看