Spring AOP之传统AOP的动态代理

自动代理的方式的介绍

自动创建代理

前面的开发案例中,每个代理都是同ProxyFactoryBean织入切面代理,在实际开发中,非常多的Bean每个都配置ProxyFactoryBena开发的维护量是巨大的,也是非常麻烦的。

解决方案:自动创建代理

– BeanNameAutoProxyCreator 根据Bean名称创建代理

– DefaultAdvisorAutoProxyCreator 根据Advisor本身包含信息创建代理

– AnnotationAwareAspectJAutoProxyCreator 基于Bean中的AspectJ注解进行自动代理

基于Bean名称的自动代理

对所有以DAO结尾的Bean所有方法使用代理

Spring AOP之传统AOP的动态代理

代码演示

新建一个demo5,从demo3和demo4中将下面这几个类拿过来

Spring AOP之传统AOP的动态代理

新建一个配置文件applicationContext3.xml




    
    
    

    
    
    

    
        
        
    

准备工作完成了,接下来我们进行测试,创建一个SpringDemo5

package com.jikewenku.aop.demo5;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext3.xml")
public class SpringDemo5 {
    @Resource(name="studentDao")
    private StudentDao studentDao;
    @Resource(name="customerDao")
    private CustomerDao customerDao;

    @Test
    public void demo1(){
        studentDao.find();
        studentDao.save();
        studentDao.update();
        studentDao.delete();

        customerDao.find();
        customerDao.save();
        customerDao.update();
        customerDao.delete();

    }
}

接下来运行一下它,看具体实现的结果是什么

Spring AOP之传统AOP的动态代理

如图,可以看到我们所有类的所有方法都使用了前置增强,也就是说根据目标类的名称然后自动来产生代理,这就是基于Bean名称的自动代理,这种方式比前面的方式更灵活一点,但是还有一点问题就是,如果我想增强这个类里面的save方法,那么应该怎么做呢?这种方式又不太合适了,下面我们再介绍一种比较合适的方式。

基于切面信息的自动代理

DefaultAdvisorAutoProxyCreator举例

如果我们想对某些类里面的某些方法进行代理,我们就可以使用下面这种方式。

配置环绕代理案例

Spring AOP之传统AOP的动态代理

代码演示

新建demo6,将demo5里的文件复制过来,新建一个配置文件applicationContext4.xml




    
    
    

    
    
    

    
    
        
        
    

    

新建一个测试类SpringDemo6

package com.jikewenku.aop.demo6;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext4.xml")
public class SpringDemo6 {
    @Resource(name="studentDao")
    private StudentDao studentDao;
    @Resource(name="customerDao")
    private CustomerDao customerDao;

    @Test
    public void demo1(){
        studentDao.find();
        studentDao.save();
        studentDao.update();
        studentDao.delete();

        customerDao.find();
        customerDao.save();
        customerDao.update();
        customerDao.delete();

    }
}

运行程序,观察结果。

Spring AOP之传统AOP的动态代理

可以看到只有客户进行了环绕增强。

本站所有文章均来自互联网,如有侵权,请联系站长删除。极客文库 » Spring AOP之传统AOP的动态代理
分享到:
赞(0)

评论抢沙发

评论前必须登录!