上一文中 讲了Annotation如何配置AOP,地址如下:http://5148737.blog.51cto.com/5138737/1428048
使用同样的bean,用xml来实现一下:
Hello.java 接口
定义了三个方法:
package com.xj.bean.aop;public interface Hello {public void addHello(); //添加方法public void deleteHello(); //删除方法public void findHello();
}
2.HelloImpl.java实现类
实现了接口中的三个方法,简单的打印
package com.xj.bean.aop;
public class HelloImpl implements Hello{@Overridepublic void addHello() {System.out.println("add");}@Overridepublic void deleteHello() {System.out.println("delete");}@Overridepublic void findHello() {System.out.println("find");}}
3.HelloProxy.java(所谓的Aspect)
不再使用annotation,所以注解去掉,里面的两个校验方法,在执行之前打印日志,执行之后打印日志。
package com.xj.bean.aop;public class HelloProxy {//准备在每个方法执行之前打印日志private void beforeLog(){ System.out.println("check add"); }//准备在每个方法执行之后打印日志private void afterLog(){System.out.println("after check delete");}
}
4.ApplicationContext.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> <!-- <aop:aspectj-autoproxy/> xml方法不需要开启aspectj的注解--> <bean id="hello" class="com.xj.bean.aop.HelloImpl"/> <!--定义普通的bean--><bean id="helloProxy" class="com.xj.bean.aop.HelloProxy"/> <!--定义Aspect的bean--><!--Aop的xml配置,均采用aop:开头,并且都方法aop:config中--><aop:config><!-- 定义aspect,ref引用所在的bean--><aop:aspect ref="helloProxy"> <!--定义pointcut:即特殊功能的执行范围--><aop:pointcut id="addMethod" expression="execution(* com.xj.bean.aop.*.add*(..))"/><aop:pointcut id="deleteMethod" expression="execution(* com.xj.bean.aop.*.delete*(..))"/><!-- 定义advice,即执行时机,为after、before、throwing等--><aop:before method="beforeLog" pointcut-ref="addMethod"/><aop:after method="afterLog" pointcut-ref="deleteMethod"/></aop:aspect></aop:config></beans>
5.测试
ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
Hello hello = (Hello)context.getBean("hello");
hello.addHello();
hello.deleteHello();
6.结果
可以看出来,结果和annotation相同。
before check add //add方法之前打印日志
add
delete
after check delete //delete方法之后打印日志
转载于:https://blog.51cto.com/5148737/1428071