Spring框架学习08——自动代理方式实现AOP

在传统的基于代理类的AOP实现中,每一个代理都是经过ProxyFactoryBean织入切面代理,在实际开发中,很是多的Bean每一个都配置ProxyFactoryBean开发维护量巨大。
解决方案:自动建立代理spring

  • BeanNameAutoProxyCreator 根据Bean名称建立代理
  • DefaultAdvisorAutoProxyCreator 根据Advisor自己包含信息建立代理
  • AnnotationAwareAspectJAutoProxyCreator 基于Bean中的AspectJ注解进行自动代理

一、基于Bean名称的自动代理

建立StuDao接口和接口实现类StuDaoImpl
StuDao接口,代码示例以下:app

public interface StuDao {
    public void save();
    public void modify();
    public void delete();
}

 

StuDaoImpl实现类,代码示例以下:ide

public class StuDaoImpl implements StuDao {
    @Override
    public void save() {
        System.out.println("保存");
    }

    @Override
    public void modify() {
        System.out.println("修改");
    }

    @Override
    public void delete() {
        System.out.println("删除");
    }
}

建立CustomDao类,演示不使用接口的实例方式测试

public class CustomDao {
    public void add(){
        System.out.println("添加客户");
    }
    public void modify(){
        System.out.println("修改客户");
    }
}

建立切面类,实现加强方法spa

public class MyBeforeAdvice implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println("前置加强========");
    }
}

在applicationContext.xml中配置代理

<!--配置目标类-->
<bean id="stuDao" class="aop.StuDaoImpl"></bean>
<bean id="customDao" class="aop.CustomDao"></bean>
<!--配置加强-->
<bean id="myBeforeAdvice" class="aop.MyBeforeAdvice"></bean>
<!--配置自动建立代理-->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="beanNames" value="*Dao"></property>
    <property name="interceptorNames" value="myBeforeAdvice"></property>
</bean>

建立测试类日志

@Test
public void demo(){
    ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
    StuDao stuDao = (StuDao) app.getBean("stuDao");
    stuDao.save();
    stuDao.modify();
    stuDao.delete();
    CustomDao customDao = (CustomDao) app.getBean("customDao");
    customDao.add();
    customDao.modify();
}

运行结果code

二、基于切面信息的自动代理

StuDao接口,代码示例以下:xml

public interface StuDao {
    public void save();
    public void modify();
    public void delete();
}

StuDaoImpl实现类,代码示例以下:blog

public class StuDaoImpl implements StuDao {
    @Override
    public void save() {
        System.out.println("保存");
    }

    @Override
    public void modify() {
        System.out.println("修改");
    }

    @Override
    public void delete() {
        System.out.println("删除");
    }
}

建立CustomDao类,演示不使用接口的实例方式

public class CustomDao {
    public void add(){
        System.out.println("添加客户");
    }
    public void modify(){
        System.out.println("修改客户");
    }
}

建立切面类,实现环绕加强

public class MyAspect implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation m) throws Throwable {
        //加强方法
        check();
        //执行目标方法
        Object obj = m.proceed();
        //加强方法
        log();
        return obj;
    }

    public void check(){
        System.out.println("模拟权限控制============");
    }
    public void log(){
        System.out.println("模拟日志记录============");
    }
}

在applicationContext.xml中配置

<!--配置目标类-->
<bean id="stuDao" class="aop.StuDaoImpl"></bean>
<bean id="customDao" class="aop.CustomDao"></bean>
<!--配置加强-->
<bean id="myAroundAdvice" class="aop.MyAspect"></bean>
<!--配置切面-->
<bean id="myAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <!--配置要加强的方法,\. 表示转义字符-->
    <property name="pattern" value="aop\.CustomDao\.add"></property>
    <property name="advice" ref="myAroundAdvice"></property>
</bean>
<!--配置基于切面自动建立代理-->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>

建立测试类

@Test
public void demo(){
    ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
    StuDao stuDao = (StuDao) app.getBean("stuDao");
    stuDao.save();
    stuDao.modify();
    stuDao.delete();
    CustomDao customDao = (CustomDao) app.getBean("customDao");
    customDao.add();
    customDao.modify();
}

运行结果

相关文章
相关标签/搜索