Spring的IOC和AOP之深剖(8)

<bean></bean>
<bean/>
<aop:config>
<aop:pointcut expression="execution(public void delete())"/>
 <!-- 异常抛出增强 -->
<aop:advisor advice-ref="error" pointcut-ref="pointcut"/>
</aop:config>
</beans>

2.CGLIB代理

CGLIB(CODE GENERLIZE LIBRARY)代理是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的所有方法,所以该类或方法不能声明称final的。

如果目标对象没有实现接口,则默认会采用CGLIB代理;

如果目标对象实现了接口,可以强制使用CGLIB实现代理(添加CGLIB库,并在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>)

public class CglibProxy implements MethodInterceptor {
    private Enhancer enhancer = new Enhancer(); 
    public Object getProxy(Class clazz){ 
      //设置需要创建子类的类 
      enhancer.setSuperclass(clazz); 
      enhancer.setCallback(this); 
      //通过字节码技术动态创建子类实例 
      return enhancer.create(); 
    } 
    public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy proxy) throws Throwable {
        System.out.println("前置代理"); 
          //通过代理类调用父类中的方法 
          Object result = proxy.invokeSuper(obj, args); 
          System.out.println("后置代理"); 
          return result; 
    }

test

public class Test {
    public static void main(String[] args) {
        final UserService service=new UserService();
        //1.创建
        Enhancer enhancer=new Enhancer();
        //2.设置根据哪个类生成子类
        enhancer.setSuperclass(service.getClass());
        //3.指定回调函数
        enhancer.setCallback(new MethodInterceptor() {
            //实现MethodInterceptor接口方法 
            public Object intercept(Object proxy, Method method, Object[] object,
                    MethodProxy methodproxy) throws Throwable {
            //System.out.println("代码增强");
            System.out.println("前置代理");
            //通过代理类调用父类中的方法 
            Object invoke = method.invoke(service, object);
            System.out.println("后置代理"); 
            return invoke;
            }
        });
        //通过字节码技术动态创建子类实例 
        UserService proxy = (UserService) enhancer.create();
        proxy.delete();
    }
}

applicationContext.xml

<bean></bean>
<bean/>
<aop:config>
<aop:pointcut expression="execution(public void delete())"/>
 <!-- 异常抛出增强 -->
<aop:advisor advice-ref="error" pointcut-ref="pointcut"/>
</aop:config>
<aop:aspectj-autoproxy proxy-target-class="true"/>

Spring AOP四种实现方式

Spring AOP自定义注解方式实现日志管理

Spring AOP进行日志记录 

使用Spring AOP进行性能监控 

利用Spring AOP 更新Memcached 缓存策略的实现 

Spring AOP的两种代理  

Spring AOP的注解实例

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d0a66771283e2103c6bdc01c098f5a37.html