自动代理的好处:自动检查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("张三");
}
}
运行结果