Spring的AspectJ的AOP
基于注解
第一步:引入aspectj依赖aop环境jar包.
spring-aspects-3.2.0.RELEASE.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
第二步:编写被增强的类:
@Component
public class OrderDao {
public void selectData() {
System.out.println("----------执行selectData方法");
}
}
第三步:使用AspectJ注解形式:
//切面
@Aspect
@Component
public class MyAspect {
/*
1.第一个*号:表示返回类型,*号表示所有的类型。
2.包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com包、子孙包下所有类的方法。
3.第二个*号:表示类名,*号表示所有的类。
4.*(…):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。
*/
@Before("execution(* com.dcits.pms.OrderDao.selectData(..))")
public void before() {
System.out.println("----------前置增强....");
}
}
第四步:创建applicationContext.xml
* 引入aop的约束:
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
....
<!--开启注解-->
<aop:aspectj-autoproxy proxy-target-class="true"/>
第五步:测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class JUnitTest {
@Autowired
private OrderDao orderDao;
@Test
public void test() {
orderDao.selectData();
}
}
附:AspectJ的通知类型:
@Before 前置通知
@AfterReturning 后置通知
@Around 环绕通知
@AfterThrowing抛出通知
@After 最终final通知
@DeclareParents 引介通知
基于XML
第一步:编写被增强的类:
public class OrderDao {
public void selectData() {
System.out.println("----------执行selectData");
}
}
第二步:定义切面
//切面
public class MyAspect {
public void before() {
System.out.println("----------前置增强....");
}
}
第三步:配置applicationContext.xml
<bean id="orderDao" class="com.dcits.pms.OrderDao"></bean>
<bean id="myAspect" class="com.dcits.pms.MyAspect"></bean>
<aop:config>
<!-- 定义切点:对哪些Joinpoint进行拦截 -->
<aop:pointcut expression="execution(* com.dcits.pms.OrderDao.selectData(..))" id="mypointcut"/>
<aop:aspect ref="myAspect">
<!-- 前置通知 -->
<aop:before method="before" pointcut-ref="mypointcut"/>
</aop:aspect>
</aop:config>
第四步:测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class JUnitTest {
@Autowired
private OrderDao orderDao;
@Test
public void test() {
orderDao.selectData();
}
}