AOP学习——配置Spring AOP【1】,使用xml文件
使用Spring AOP,除了spring.jar这个包外,还需要aspectjweaver.jar。将这两个jar包加到类路径就可以了。
一般使用Spring AOP可以通过xml文件或者annotation实现AOP的配置。
用一个简单的例子说明。
首先有一个业务接口Component:
public interface Component {
??? public void business();
??? public void dobusiness();
}
还有它的实现类ComponentImpl:
public class ComponentImpl implements Component{
??? public void business() {
??????? System.out.println("bussiness");
??? }
??? public void dobusiness() {
??????? System.out.println("do business");
??? }
}
?
现在我要做一个切面AspectBean:
public class AspectBean {
public void validateUser()
{
System.out.println("执行用户验证!");
}
public void writeLogInfo()
{
System.out.println("书写日志信息");
}
public void beginTransaction()
{
System.out.println("开始事务");
}
public void endTransaction()
{
System.out.println("结束事务");
}
}
在调用业务接口方法之前,我要执行validateUser,beginTransaction方法,调用玩业务接口方法之后,执行endTransaction,writeLogInfo方法。
另外,我们发现,这个切面是一个POJO,易于测试和方便移植。
?
还有一个主类使用这个接口:
public class Main {
??? public static void main(String[] args) {
??????? ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
??????? Component component=(Component)ctx.getBean("component");
??????? component.business();
??? }
}
?
好,现在通过xml文件和annotation配置Spring AOP:
?
使用xml文件配置AOP:
创建一个xml文档beans.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">??
??
??? <aop:config>
??????? <aop:aspect id="aspectDemo" ref="aspectBean">
??????????? <aop:pointcut id="somePointcut"
??????????? expression="execution(* annoaop.Component.business*(..))" />
??????????? <aop:before pointcut-ref="somePointcut"
??????????? method="validateUser" />
??????????? <aop:before pointcut-ref="somePointcut"
??????????? method="beginTransaction" />
??????????? <aop:after-returning pointcut-ref="somePointcut"
??????????? method="endTransaction" />
??????????? <aop:after-returning pointcut-ref="somePointcut"
??????????? method="writeLogInfo" />
??????? </aop:aspect>
??? </aop:config>
?
???
??? <bean id="aspectBean"
??? style="margin: 0cm 0cm 0pt; text-indent: 21pt;">??? </bean>
??? <bean id="component"
??? style="margin: 0cm 0cm 0pt; text-indent: 21pt;">??? </bean>
</beans>
?
红色部分就是配置AOP的地方。
所有的切面都放在aop:config标签里面。
使用aop:aspect声明一个切面aspectDemo。
使用aop:pointcut声明一个切入点,expression属性需要通过切入点表达式告诉spring你的target是什么。
切入点表达式的使用规则:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
有“?”号的部分表示可省略的,modifers-pattern表示修饰符如public、protected等,ret-type-pattern表示方法返回类型,declaring-type-pattern代表特定的类,name-pattern代表方法名称,param-pattern表示参数,throws-pattern表示抛出的异常。在切入点表达式中,可以使用*来代表任意字符,用..来表示任意个参数。
例子里面expression="execution(* annoaop.Component.business*(..))"表示匹配annoaop.Component接口里面以business开头的所有方法,参数任意,返回类型任意。
注意:spring会根据xml文件里你声明的增强顺序来执行,假如你设置:
??????????? <aop:after-returning pointcut-ref="somePointcut"
??????????? method=" writeLogInfo" />
??????????? <aop:after-returning pointcut-ref="somePointcut"
??????????? method="endTransaction " />
则输出为
书写日志信息
结束事务
而不是原来的
结束事务
书写日志信息
?
运行主方法:
执行用户验证!
开始事务
bussiness
结束事务
??? 书写日志信息