目录
Spring框架的AOP技术(注解方式)
1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 com.springsource.org.apache.commons.logging-1.1.1.jar com.springsource.org.apache.log4j-1.2.15.jar spring-beans-5.0.2.RELEASE.jar spring-context-5.0.2.RELEASE.jar spring-core-5.0.2.RELEASE.jar spring-expression-5.0.2.RELEASE.jar * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * spring-aop-5.0.2.RELEASE.jar * com.springsource.org.aopalliance-1.0.0.jar * aspectJ的开发包 * com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar * spring-aspects-5.0.2.RELEASE.jar *如果是Maven项目,就引入下面的jar包坐标即可 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.7</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.0.2.RELEASE</version> </dependency>
2. 步骤二:创建Spring的配置文件,引入具体的AOP的schema约束 <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.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> </beans>
3. 步骤三:创建包结构,编写具体的接口和实现类 * org.westos.demo1 * CustomerDao -- 接口 * CustomerDaoImpl -- 实现类 4. 步骤四:将目标类配置到Spring中 <bean id="customerDao" class="org.westos.demo1.CustomerDaoImpl"/> 5. 步骤五:定义切面类 * 添加切面和通知的注解 * @Aspect -- 定义切面类的注解 * 通知类型(注解的参数是切入点的表达式) * @Before -- 前置通知 * @AfterReturing -- 后置通知 * @Around -- 环绕通知 * @After -- 最终通知 * @AfterThrowing -- 异常抛出通知 * 具体的代码如下 @Aspect public class MyAspectAnno { @Before(value="execution(public void org.westos.demo1.CustomerDaoImpl.save())") public void log(){ System.out.println("记录日志..."); } } 6. 步骤六:在配置文件中定义切面类 <bean id="myAspectAnno" class="org.westos.demo1.MyAspectAnno"/> 7. 步骤七:在配置文件中开启自动代理 <aop:aspectj-autoproxy/> 放在最前面 8. 完成测试 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class Demo1 { @Resource(name="customerDao") private CustomerDao customerDao; @Test public void run1(){ customerDao.save(); customerDao.update(); } }
通知类型
1. 通知类型 * @Before -- 前置通知 * @AfterReturing -- 后置通知 * @Around -- 环绕通知(目标对象方法默认不执行的,需要手动执行) * @After -- 最终通知 * @AfterThrowing -- 异常抛出通知 2. 配置通用的切入点 * 使用@Pointcut定义通用的切入点 @Aspect public class MyAspectAnno { //随便定义一个方法,上面用注解定义一个切入点 @Pointcut(value="execution(public void org.westos.demo1.CustomerDaoImpl.save())") public void fn(){} //引用这个定义的切入点 格式:切面类名.方法名 @Before(value="MyAspectAnno.fn()") public void log(){ System.out.println("记录日志..."); }
/** * 环绕通知 */ @Around(value="MyAspectAnno.fn()") public void around(ProceedingJoinPoint joinPoint){ System.out.println("环绕通知1..."); try { // 让目标对象的方法执行 joinPoint.proceed(); } catch (Throwable e) { e.printStackTrace(); } System.out.println("环绕通知2..."); } }