两种方式
目标类
package com.mfs.chapter04;
import org.springframework.stereotype.Component;
@Component("userDao")
public class UserDAO {
public int add(){
System.out.println("添加用户");
// 制造异常
int a = 2/0;
return 0;
}
public int delete(int id) {
System.out.println("删除用户");
return 1;
}
}
方式一:基于xml配置文件配置切面
切面类
package com.mfs.chapter04;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
public class MyAspect {
public void before() {
System.out.println("before");
}
public void afterReturning(Object obj) {
System.out.println("afterRunning"+obj);
}
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("around前");
Object obj = proceedingJoinPoint.proceed();
System.out.println("around后");
return obj;
}
public void after() {
System.out.println("after");
}
public void afterThrowing(Throwable e) {
System.out.println("afterThrowing"+e);
}
}
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:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd ">
<!-- 扫描注解 -->
<context:component-scan
base-package="com.mfs.chapter04"></context:component-scan>
<!-- 切面类 -->
<beans:bean id="myAspect" class="com.mfs.chapter04.MyAspect"></beans:bean>
<aop:config>
<!-- 切面配置 -->
<aop:aspect ref="myAspect">
配置切入点
<aop:pointcut
expression="execution(public * com.mfs.chapter04.UserDAO.*(..))"
id="myPointCut" />
<!-- 在切入点之前增强 -->
<aop:before method="before" pointcut-ref="myPointCut" />
<!-- 在切入点的方法成功执行后增强,执行中断则不会增强,比如中间有异常抛出,obj用来获取切入点返回值对象 -->
<aop:after-returning method="afterReturning"
pointcut-ref="myPointCut" returning="obj"/>
<!-- 在切入点执行后增强,即便切入点中断 -->
<aop:after method="after" pointcut-ref="myPointCut" />
<!-- 在切入点前后增强 -->
<aop:around method="around" pointcut-ref="myPointCut"/>
<!-- 在切入点抛出异常后执行,e用来获取抛出的异常对象 -->
<aop:after-throwing method="afterThrowing"
pointcut-ref="myPointCut" throwing="e" />
</aop:aspect>
</aop:config>
</beans>
方式二: 注解方式配置切面
切面类
package com.mfs.chapter04;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class MyAspect {
@Pointcut("execution(public * com.mfs.chapter04.UserDAO.*(..))")
private void myPointCut() {}
@Before("myPointCut()")
public void before() {
System.out.println("before");
}
@AfterReturning(value="myPointCut()",returning="obj") //obj必须和通知方法中的参数名一致!!!
public void afterReturning(Object obj) {
System.out.println("afterRunning"+obj);
}
@Around("myPointCut()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("around前");
Object obj = proceedingJoinPoint.proceed();
System.out.println("around后");
return obj;
}
@After("myPointCut()")
public void after() {
System.out.println("after");
}
@AfterThrowing(value="myPointCut()",throwing="e") //e必须和通知方法中的参数名一致!!!
public void afterThrowing(Throwable e) {
System.out.println("afterThrowing"+e);
}
}
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:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd ">
<!-- 扫描注解 -->
<context:component-scan
base-package="com.mfs.chapter04"></context:component-scan>
<!-- 自动代理 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
测试类
package com.mfs.chapter04;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:com/mfs/chapter04/applicationContext.xml")
public class Test01 {
@Resource(name="userDao")
UserDAO userDao;
@Test
public void test() {
userDao.delete(3);
System.out.println("****************************************");
userDao.add();
}
}