最近几天回顾翻了一下spring,以前看的时候没做过多的总结,再次好好总结一次。
好记性不如烂笔头,况且记性也不咋地
spring AOP需要的基本jar包
- aop的核心包:org.springframework.aop-xxx.jar
- spring AOP联盟包:aopalliance.xx.jar
- aspectJ相关包:aspectjrt.jar aspectjweaver.jar
- 如果需要使用动态代理,添加cglib相关的jar包
spring 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"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
</beans>
- xmlns:默认的xml文档解析格式,http://www.springframework.org/schema/beans/,通过这个属性,所有在beans里面声明的属性,都可以直接通过<>来使用,如<bean>
- xmlns:xsi:xml需要遵守的规范,通过URL可以看到是W3的统一规范,后面通过xsi:schemaLocation来定位所有的解析文件
- xmlns:aop:我们需要使用到的一些语义规范,与面向界面AOP相关
- xmlns:tx:spring中与事务相关的配置内容
一个XML文件,只能声明一个默认的语义解析的规范。
比如上面的xml中就只有beans是默认的,其他的都需要通过特定的标签来使用,如aop,它自己包含很多属性,如果要使用。前面必须加上aop:xxx才可以(aop:config)。
类似,如果默认的xmlns配置的是aop相关的语义解析规范,那么在xml中就可以直接写上config即可。
aspect配置
...省略beans的定义内容
<bean id="audience" class="com.spring.test.aop.Audience"/>
<bean id="sax" class="com.spring.test.setter.Saxophone"/>
<bean id="kenny" class="com.spring.test.setter.Instrumentalist">
<property name="song" value="Jingle Bells" />
<property name="age" value="25" />
<property name="instrument" ref="sax"/>
</bean>
<aop:config proxy-target-class="true">
<!-- 这个声明了一个切面类 -->
<aop:aspect ref="audience">
<aop:pointcut id="performance" expression="execution(* com.spring.test.action1.Performer.perform(..))"/>
<aop:before pointcut-ref="performance" method="takeSeats"/>
<aop:before pointcut-ref="performance" method="turnOffCellPhones"/>
<aop:after pointcut-ref="performance" method="applaud"/>
<aop:after pointcut-ref="performance" method="demandRefund"/>
</aop:aspect>
</aop:config>
</beans>
- <aop:advisor>:用来定义只有一个通知和一个切入点的切面。
- <aop:aspect>:用来定义切面,该切面可以包含多个切入点和通知,而且标签内部的通知和切入点定义是无序的;和advisor的区别就在此,advisor只包含一个通知和一个切入点。
- 在aop:aspect中定义了两个切面,aop:before和aop:after。before:在切入点之前植入before方法。after:在切入点之后植入after方法。
pointcut配置
- execution(public**(..)) 切入点为执行所有public方法时
- execution(set(..)) 切入点为执行所有set方法开始的方法时
- execution(com.hmx.service.AccountService.(..)) 切入点为执行AccountService类中的所有方法时
- execution(*com.hmx.service..(..)) 切入点为执行com.hmx.service包下的所有方法时
- execution(*com.hmx.service...(..)) 切入点为执行com.hmx.service包及其子包下的所有方法时
Introduction
- 允许一个切面声明一个实现指定接口的通知对象,并且提供了一个接口实现类来代表这些对象