Spring自动代理

作者: 往事随风_0817 | 来源:发表于2019-02-14 23:34 被阅读6次

Spring自动代理

Spring的一般代理是通过ProxyFactoryBean织入切面代理,如果有非常多的Dao则每个Dao都需要配置ProxyFeactoryBean开发维护非常麻烦

解决方案:自动创建代理

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

对所有Dao结尾Bean所有方法切面Demo

//XML配置
<!--增强目标-->
<bean id="userDao" class="cn.akwangl.BeanNameAuto.UserDaoImpl"/>
<bean id="customerDao" class="cn.akwangl.BeanNameAuto.CustomerDao"/>

<!--Advice通知方式-->
<bean id="myBeforeAdvice" class="cn.akwangl.BeanNameAuto.MyBeforeAdvice"/>
<bean id="myAroundAdvice" class="cn.akwangl.BeanNameAuto.MyAroundAdvice" />

<!--根据Bean的名字自动创建代理-->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="beanNames" value="*Dao"/>
    <property name="interceptorNames" value="myBeforeAdvice"/>
</bean>

//目标对象类
public class UserDaoImpl implements UserDao {
    @Override
    public void save(User user) {System.out.println("保存用户");}
    @Override
    public void update(User user) {System.out.println("修改用户");}
    @Override
    public void findAll() {System.out.println("查询用户");}
    @Override
    public void delete(Long id) {System.out.println("删除用户");}
}

public class CustomerDao {
    public void find(){System.out.println("查询客户...");}
    public void save(){System.out.println("保存客户...");}
    public void update(){System.out.println("修改客户...");}
    public void delete(){System.out.println("删除客户...");}
}

//通知方式
//环绕通知
public class MyAroundAdvice implements MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        System.out.println("权限验证...");
        Object proceed = methodInvocation.proceed();
        System.out.println("日志记录...");
        return proceed;
    }
}

//前置通知
public class MyBeforeAdvice implements MethodBeforeAdvice {

    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("权限验证...");
    }
}

//Test类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext3.xml")
public class BeanNameAuto_Test {

    @Resource(name = "customerDao")
    private CustomerDao customerDao;


    @Resource(name = "userDao")
    private UserDao userDao;

    @Test
    public void beanNameAuto() {
        customerDao.delete();
        customerDao.find();
        customerDao.save();
        customerDao.update();
        userDao.findAll();
    }
}
//XML配置
<!--增强目标-->
<bean id="userDao" class="cn.akwangl.DefaultAdvisor.UserDaoImpl"/>
<bean id="customerDao" class="cn.akwangl.DefaultAdvisor.CustomerDao"/>

<!--Advice通知方式-->
<bean id="myBeforeAdvice" class="cn.akwangl.DefaultAdvisor.MyBeforeAdvice"/>
<bean id="myAroundAdvice" class="cn.akwangl.DefaultAdvisor.MyAroundAdvice" />

<!--配置切面-->
<bean id="myAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="pattern" value=".*save"/>
    <property name="advice" ref="myAroundAdvice"/>
</bean>

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

//目标类
public class UserDaoImpl implements UserDao {
    @Override
    public void save(User user) {System.out.println("保存用户");}
    @Override
    public void update(User user) {System.out.println("修改用户");}
    @Override
    public void findAll() {System.out.println("查询用户");}
    @Override
    public void delete(Long id) {System.out.println("删除用户");}
}
public class CustomerDao {
    public void find(){System.out.println("查询客户...");}
    public void save(){System.out.println("保存客户...");}
    public void update(){System.out.println("修改客户...");}
    public void delete(){System.out.println("删除客户...");}
}

//通知方式
//环绕通知
public class MyAroundAdvice implements MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        System.out.println("权限验证...");
        Object proceed = methodInvocation.proceed();
        System.out.println("日志记录...");
        return proceed;
    }
}

//前置通知
public class MyBeforeAdvice implements MethodBeforeAdvice {

    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("权限验证...");
    }
}

//Test类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext4.xml")
public class DefaultAdvisor_Test {

    @Resource(name = "customerDao")
    private CustomerDao customerDao;

    @Resource(name = "userDao")
    private UserDao userDao;

    @Test
    public void beanNameAuto() {
        customerDao.delete();
        customerDao.find();
        customerDao.save();
        customerDao.update();

        userDao.findAll();
        userDao.save(new User());
    }
}

相关文章

  • Spring自动代理

    Spring自动代理 Spring的一般代理是通过ProxyFactoryBean织入切面代理,如果有非常多的Da...

  • rm端如何实现数据源代理,业务执行流程

    继承AbstractAutoProxyCreator,spring自动对Datasource实现代理,当然你也可以...

  • spring-AOP(二) 自动代理

    spring-AOP(二) 自动代理 知识导读 在何时何处创建代理对象,如何能覆盖被代理对象,返回代理后的对象 自...

  • 说说在 Spring 中如何自动创建代理

    Spring 提供了自动代理机制,可以让容器自动生成代理,从而把开发人员从繁琐的配置中解脱出来 。 具体是使用 B...

  • ssh框架的基本整合

    Spring框架的基本整合 AOP注解方式编写切面类(包含通知和切入点)开启自动代理 JDBC模板技术Spring...

  • Spring AOP 自动创建代理

    1. 代理创建器 自动创建代理对象,将一个切面织入到多个目标对象中 三种自动代理创建器BeanNameAutoPr...

  • spring aop 汇总

    静态代理、动态代理和cglib代理 aop 使用 Spring AOP - 注解方式使用介绍spring aop ...

  • spring aop半自动与全自动编程

    在spring中,我们可以通过在配置文件中配置目标类,切面类,代理类来达到目的。首先要讲的的是半自动代理。这种情况...

  • Spring AOP 学习笔记(1) ---- 代理模式

    参考文章 spring aop 官方文档 掘金spring aop 教程 掘金动态代理 代理模式分类 根据代理类的...

  • Spring AOP 实现原理

    Spring AOP 实现原理 静态代理 众所周知 Spring 的 AOP 是基于动态代理实现的,谈到动态代理就...

网友评论

    本文标题:Spring自动代理

    本文链接:https://www.haomeiwen.com/subject/ktjueqtx.html