一步一步深入spring(5)--使用基于注解的spring实现 AOP
1.要利用spring aop,至少需要添加以下jar包
使用spring需要的jar
spring.jar 、commons-logging.jar
使用切面编程(AOP)需要的jar
aspectjrt.jar、aspectjweaver.jar、cglib-nodep-2.1_3.jar
使用JSR-250提供的注解,如@Resource,需要的jar
common-annotations.jar
2.使用spring 进行aop编程,首先我们要在Spring的配置文件中引入aop命名空间:
<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.springramework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd”> </beans>
当然我们在使用spring的时候,肯定会使用到spring ioc相关的内容,也需要加入命名空间对IOC部分的支持
3.使用注解方式来实现aop,首先需要在spring的配置文件中启动对@AspectJ注解的支持
<aop:aspectj-autoproxy/>
4.建立一个类,作为切面类,然后在切面类中依次添加切入点,前置通知,后置通知,例外通知,最终通知,环绕通知等:
完整的java文件:
package com.yangyang.aop; 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; //声明该类为一个切面
@Aspect
public class MyInterceptor {
//切入点要拦截的类
@Pointcut("execution (* com.yangyang.service..*.*(..))")
private void anyMethod(){} //声明一个切入点,切入点的名称其实是一个方法 //前置通知(不需要获取输入参数)
@Before("anyMethod()")//第一个参数为切入点的名称
public void doAccessCheck(){
System.out.println("前置通知");
} //后置通知(不需要获取返回值)
@AfterReturning("anyMethod()")
public void doAfterReturning(){
System.out.println("后置通知:");
} //例外通知(不需要异常信息)
@AfterThrowing("anyMethod()")
public void doAfterThrowing(){
System.out.println("例外通知");
} //最终通知
@After("anyMethod()")
public void doAfter(){
System.out.println("最终通知");
} //环绕通知(特别适合做权限系统)
@Around("anyMethod()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("环绕通知进入方法");
Object object=pjp.proceed();
System.out.println("环绕通知退出方法");
return object;
} }
5.建立供测试的业务方法:这里只列出实现:
 package com.yangyang.service.impl;
 import com.yangyang.service.PersonService;
 public class PersonServiceImpl implements PersonService{
     @Override
     public String getNameById(Long id) {
         System.out.println("我是getNameById()方法");
         return "csy";
     }
     @Override
     public void save(String name) {
         throw new RuntimeException("故意抛出了异常,仅供测试");
     //    System.out.println("我是save()方法");
     }
     @Override
     public void update(String name, Long id) {
         System.out.println("我是update()方法");
     }
 }
6.将业务service的bean以及切面的类加入spring管理,完整的配置文件如下:
<?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:context="http://www.springframework.org/schema/context"
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/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<!-- 加上aop的命名空间以及DTD验证 --> <aop:aspectj-autoproxy/><!-- 打开aop对@Aspectj的注解支持 ,相当于为注解提供解析功能--> <bean id="myInterceptor" class="com.yangyang.aop.MyInterceptor"></bean> <bean id="personService" class="com.yangyang.service.impl.PersonServiceImpl">
</bean> </beans>
7.编写单元测试,来测试aop是否成功实现。代码:
@Test
public void testSpringInterceptor() {
ApplicationContext ctx=new ClassPathXmlApplicationContext("resources/beans.xml");
PersonService personService=(PersonService)ctx.getBean("personService");
personService.getNameById(1l);
System.out.println("----------------------------------");
personService.save("csy");
}
观察结果如下:
前置通知
环绕通知进入方法
我是getNameById()方法
后置通知:
最终通知
环绕通知退出方法
----------------------------------
前置通知
环绕通知进入方法
例外通知
最终通知
可以看出AOP编写成功了。
思考一个问题,如果我们希望获取在业务操作在使用aop的服务时得到相应的输入,返回值,以及异常信息,那么切面该怎么改呢:
只需要在各自通知的地方加入相应类型的参数即可:
package com.yangyang.aop; 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; //声明该类为一个切面
@Aspect
public class MyInterceptor {
//切入点要拦截的类
@Pointcut("execution (* com.yangyang.service..*.*(..))")
private void anyMethod(){} //声明一个切入点,切入点的名称其实是一个方法 //前置通知(获取输入参数)
@Before("anyMethod() && args(name)")//第一个参数为切入点的名称,第二个是测试获取输入参数,此处为string类型的,参数名称与方法中的名称相同,如果不获取输入参数,可以不要
public void doAccessCheck(String name){
System.out.println("前置通知:"+name);
} //后置通知(获取返回值)
@AfterReturning (pointcut="anyMethod()", returning="result")
public void doAfterReturning(String result){
System.out.println("后置通知:"+result);
} //例外通知(获取异常信息)
@AfterThrowing(pointcut="anyMethod()",throwing="e")
public void doAfterThrowing(Exception e){
System.out.println("例外通知:"+e);
} //最终通知
@After("anyMethod()")
public void doAfter(){
System.out.println("最终通知");
} //环绕通知(特别适合做权限系统)
@Around("anyMethod()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("环绕通知进入方法");
Object object=pjp.proceed();
System.out.println("环绕通知退出方法");
return object;
} }
同理执行单元测试,可以看到结果:
环绕通知进入方法
我是getNameById()方法
后置通知:csy
最终通知
环绕通知退出方法
----------------------------------
前置通知:csy
环绕通知进入方法
例外通知:java.lang.RuntimeException: 故意抛出了异常,仅供测试
最终通知
这样我们的功能就开发完了
一步一步深入spring(5)--使用基于注解的spring实现 AOP的更多相关文章
- 基于注解的Spring AOP的配置和使用
		
摘要: 基于注解的Spring AOP的配置和使用 AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不 ...
 - Spring7:基于注解的Spring MVC(下篇)
		
Model 上一篇文章<Spring6:基于注解的Spring MVC(上篇)>,讲了Spring MVC环境搭建.@RequestMapping以及参数绑定,这是Spring MVC中最 ...
 - Spring6:基于注解的Spring MVC(上篇)
		
什么是Spring MVC Spring MVC框架是一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC ...
 - 基于注解的Spring AOP示例
		
基于注解的Spring AOP示例 目录 在XML配置文件中开启 @AspectJ 支持 声明切面及切入点 声明通知 测试 结语 在XML配置文件中开启 @AspectJ 支持 要使用Spring的A ...
 - Spring MVC中基于注解的 Controller
		
终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响 ...
 - 使用 Spring 2.5 基于注解驱动的 Spring MVC
		
http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/ 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Sp ...
 - 使用 Spring 2.5 基于注解驱动的 Spring MVC--转
		
概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 ...
 - 基于注解的Spring多数据源配置和使用(非事务)
		
原文:基于注解的Spring多数据源配置和使用 1.创建DynamicDataSource类,继承AbstractRoutingDataSource package com.rps.dataSourc ...
 - Spring:基于注解的Spring MVC
		
什么是Spring MVC Spring MVC框架是一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC ...
 
随机推荐
- 所谓策略,我站在旁边看今天 神刻的样子O2O
			
雕爷.何许人也? 卖牛腩的大叔? 卖精油的大爷?还是卖烤肉的家伙? 事实上以上答案都是肯定的,他就是阿芙精油,雕爷牛腩创业神话的缔造者.那么雕爷是怎样取得这种创业成功的呢?前段时间我还不清楚雕爷的厉害 ...
 - Atitit.ALT+TAB没反应车and 点击任务栏程序闪烁可是不能切换
			
Atitit.ALT+TAB没反应车and 点击任务栏程序闪烁可是不能切换 1. 可能你的Alt+Tab键被别人禁用了,试下以下的方法: 1 2. 为什么要禁用Alt+Tab 1 3. ALT+TAB ...
 - CSS3 选择器读解
			
文章资料来自于W3Cfuns CSS3.0 四个基本的结构性伪类选择器:root 此选择器将绑定到页面的根元素中,所谓根元素,是指文档树中最顶层的元素,也就是<html>部 分. < ...
 - 关于Installshield里一些常见问题的解答—艾泽拉斯之海洋女神出品
			
原文:关于Installshield里一些常见问题的解答-艾泽拉斯之海洋女神出品 上一篇:一个完整的安装程序实例—艾泽拉斯之海洋女神出品(五) --补遗转载时请务必保留转载出处和由艾泽拉斯之海洋女神出 ...
 - navicat连接oracle一个错误:ORA-12737 Instant Client Light:unsupported server character set ZHS16GBK
			
今天使用Navicat连接Oracle数据库.它报告了以下错误:"ORA-12737 Instant Client Light:unsupported server character se ...
 - SQL点滴32—Excel中CONCATENATE函数生成SQL语句
			
原文:SQL点滴32-Excel中CONCATENATE函数生成SQL语句 当拿到一个Excel的时候需要将这里面的数据插入到数据库里面,该怎么办,除了使用SSIS数据导入之外还可以使用Excel中的 ...
 - 解决Ubuntu Adobe Reader 菜单栏空白
			
sudo gedit /usr/local/share/applications/AdobeReader.desktop将 ”Exec=acroread“ 用 ”Exec=env UBUNTU_ME ...
 - 在weblogic11g发布该项目时遇到错误(不支持web-app_3_0)
			
problem: cvc-enumeration-valid: string value '3.0' is not a valid enumeration value for web-app-vers ...
 - 【MS SQL】数据库维护计划之数据库备份(二)
			
原文:[MS SQL]数据库维护计划之数据库备份(二) 上篇[MS SQL]数据库维护计划之数据库备份(一) 说了数据库备份的一些概念后,这篇以HRP_KQYY数据库备份为例,进行备份计划设置. 考虑 ...
 - php-fpm介绍及配置
			
php-fpm是什么 全称是php fastcgi process manager即php fastcgi进程管理器,相比fastcgi静态的唤起cgi,fpm能根据访问的压力动态的唤起cgi进程和销 ...