首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

AOP学习——配备Spring AOP【1】,使用xml文件

2012-10-31 
AOP学习——配置Spring AOP【1】,使用xml文件使用Spring AOP,除了spring.jar这个包外,还需要aspectjweaver.jar

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

结束事务

??? 书写日志信息

热点排行