Spring实战教程 | 第十一篇:SrpringAOP之Spring中的自动代理

自动代理的好处:自动检查IoC容器的目标对象,并对这些目标对象产生代理对象,也就是我们不用为每个Action建立相应的代理bean
下面的例子是所有类都以do开头的方法,在被调用时,都要进行日志的输出
实现思路:
① 在接口TimeBookInterface中添加方法doAuditing()和doCheck(),实现类TimeBook实现该接口
② 使用Before、After通知
③ 修改配置文档
④ 测试
代码示例
(1)TimeBookInterface.java

public interface TimeBookInterface {
    // 负责具体的业务逻辑
    public void doAuditing(String name);

    public void doCheck(String name);
}

实现类

public class TimeBook implements TimeBookInterface {

    @Override
    public void doAuditing(String name) {
        // TODO Auto-generated method stub
        System.out.println("审核数据的相关程序执行中...");
    }

    @Override
    public void doCheck(String name) {
        // TODO Auto-generated method stub
        System.out.println("财务关账的相关程序执行中...");
    }
}

(2)负责日志输出信息的类LogBefore,实现了MethodBeforeAdvice接口,重写了before()方法

public class LogBefore implements MethodBeforeAdvice {
    private Logger logger = Logger.getLogger(this.getClass().getName());
    @Override
    // 用于执行审核程序前调用该方法
    public void before(Method m, Object[] args, Object target) throws Throwable {
        logger.log(Level.INFO, args[0] + " 开始审核数据...");
    }
}

负责日志输出信息的类LogAfter,实现了MethodReturningAdvice接口,重写了afterReturning()方法

public class LogAfter implements AfterReturningAdvice{
    private Logger logger = Logger.getLogger(this.getClass().getName());
    @Override
    //用与在执行审核程序后调用该方法
    public void afterReturning(Object object, Method m, Object[] args,
            Object target) throws Throwable {
        logger.log(Level.INFO, args[0] + " 结束审核数据...");
    }
}

(3)修改配置文档,增加一个自动代理的Bean

<bean id="timeBook" class="spring.aop.TimeBook"></bean>


 <!-- 这个就是自动代理的关键,加入这个bean就代表了开启自动代理 --> 
    <bean id="autoProxyCreator"
        class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>

    <!-- 以下是实现Before通知 -->
    <bean id="logBefore" class="autoProxy.LogBefore"></bean>
    <bean id="logBeforeAdvisor"
        class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
         <property name="advice">
           <ref bean="logBefore"/>
         </property>
         <!-- 指定以do开头的方法 -->
         <property name="patterns">
         <value>.*do.*</value>
         </property>
    </bean>

    <!-- 以下是实现After通知 -->
    <bean id="logAfter" class="autoProxy.LogAfter"></bean>
    <bean id="logAfterAdvisor"
        class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
         <property name="advice">
           <ref bean="logAfter"/>
         </property>
         <!-- 指定以do开头的方法 -->
         <property name="patterns">
         <value>.*do.*</value>
         </property>
    </bean>

(4)测试

public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new FileSystemXmlApplicationContext(
                "classpath:autoProxy-config.xml");
        //注意:这里的getBean是timeBook这个bean了,因为已经没有了代理bean 
        TimeBookInterface timeProxy = (TimeBookInterface) context
                .getBean("timeBook");
        timeProxy.doCheck("张三");
    }
}

运行结果
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值