前面的各种Aop编程,都是基于XML的,这篇文章讲的是把XML方式改为注解方式来做。

Spring注解开发和xml开发所需要的包是一样的,所以只要把xml开发方式的包复制到以注解为开发方式的包的项目下就可以了。

第一步:导入相应的jar包

第二步:需要在applicationContext.xml中引入aop的名称空间

开启注解自动代理:

<!-- 自动注解 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

第三步:AOP编程:

第(一)步.目标对象:

//编写目标类(真正被代理的)
public class UserDaoImpl implements UserDao { public int delete() {
System.out.println("删除了");
return 1; } }

第(二)步:编写切面类和Advice方法

//这个注解表明这个类就是切面类,在这个类里面可以写Advice(通知)方法。
@Aspect
public class Myspect {
//我们配置一个前置方法的Advice方法,这是一个Advice方法,当然要配置切点了。配了切点就表示在这个切点执行这个Advice方法。
@Before("execution(* com.guigu.shen.anotion.UserDaoImpl.*(..))")
public void before1(JoinPoint joinPoint)
{
System.out.print("this is 前置方法");
}
//后置通知,这是一个Advice方法,当然要配置切点了。配了切点就表示在这个切点执行这个Advice方法。
@AfterReturning(value="execution(* com.guigu.shen.anotion.UserDaoImpl.*(..))",returning="returnVal")
public void afterReturning(JoinPoint joinPoint,Object returnVal)
{
System.out.println("this is afterReturning 方法");
System.out.println(returnVal); } }

第四步:在Spring配置文件中配置目标Bean和切面Bean

<!-- xml配置目标bean和切面bean -->
<bean id="UserDao" class="com.guigu.shen.anotion.UserDaoImpl"></bean>
<bean id="Myspect" class="com.guigu.shen.anotion.Myspect"></bean>

接下来给出Aspect5种通知的注解形式的具体实例

前置通知@Before

//前置通知
@Before("execution(* com.guigu.shen.anotion.UserDaoImpl.*(..))")
public void before1(JoinPoint joinPoint)
{
System.out.print("this is 前置方法");
}

后置通知:

//后置通知
@AfterReturning(value="execution(* com.guigu.shen.anotion.UserDaoImpl.*(..))",returning="returnVal")
public void afterReturning(JoinPoint joinPoint,Object returnVal)
{
System.out.println("this is afterReturning 方法");
System.out.println(returnVal); }

环绕通知:

//环绕通知,在方法的前后执行,在工作中可以计算方法执行的时间,性能的监控,权限的设置,缓存的实行等
@Around("execution(* com.guigu.shen.anotion.UserDaoImpl.*(..))")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable
{
long begintime=System.currentTimeMillis();
Object result=proceedingJoinPoint.proceed();
long endtime=System.currentTimeMillis();
System.out.println("方法执行了"+(endtime-begintime)+"时间");
return result; }

异常通知:指的是当发生一些异常时会输出异常信息(如果方法没有异常的话,这个通知不会被执行的,比如如果.UserDaoImpl中的delete()方法会产生一个异常,

那么这个切点通知方法会执行,如果UserDaoImpl中的delete()方法没哟异常就不会执行这个方法)

@AfterThrowing(value="execution(* com.guigu.shen.anotion.UserDaoImpl.*(..))",throwing="e")
public void afterThrowing(JoinPoint joinPoint,Exception e)
{
System.out.print(joinPoint.toLongString()+"方法发生了异常"+e.getMessage());
}

情形一:

被代理类的方法:

//编写目标类(真正被代理的)
public class UserDaoImpl implements UserDao { public int delete() {
System.out.println("删除了");
//int a=1/0;
return 1; } }

测试方法:

@Test
public void deletetest()
{
userDao.delete();
}

结果:不会输出异常的信息。

情形二:

被代理类的方法:

//编写目标类(真正被代理的)
public class UserDaoImpl implements UserDao { public int delete() {
System.out.println("删除了");
int a=1/0;
return 1; } }

测试方法:

@Test
public void deletetest()
{
userDao.delete();
}

结果:execution(public abstract int com.guigu.shen.anotion.UserDao.delete())方法发生了异常/ by zero18:36:25,064  INFO GenericApplicationContext:1042 - Closing org.springframework.context.support.GenericApplicationContext@24f9fdc: startup date [Mon Aug 01 18:36:07 CST 2016]; root of context hierarchy

最终通知:

@After("execution(* com.guigu.shen.anotion.UserDaoImpl.*(..))")
public void after()
{
System.out.print("最终通知,释放资源"); }

结果:

this is 前置方法

删除了
方法执行了0时间
最终通知,释放资源

this is afterReturning 方法

下面给出整个案例的结构图以及代码

Myspect.java是切面类
//定义一个切面类。以及Advice方法
//这个注解表明这是切面类
@Aspect
public class Myspect {
//我们配置一个前置方法的Advice方法,这是一个Advice方法,当然要配置切点了
@Before("execution(* com.guigu.shen.anotion.UserDaoImpl.*(..))")
public void before1(JoinPoint joinPoint)
{
System.out.print("this is 前置方法");
}
//后置通知
@AfterReturning(value="execution(* com.guigu.shen.anotion.UserDaoImpl.*(..))",returning="returnVal")
public void afterReturning(JoinPoint joinPoint,Object returnVal)
{
System.out.println("this is afterReturning 方法");
System.out.println(returnVal); } //环绕通知,在方法的前后执行,在工作中可以计算方法执行的时间,性能的监控,权限的设置,缓存的实行等
@Around("execution(* com.guigu.shen.anotion.UserDaoImpl.*(..))")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable
{
long begintime=System.currentTimeMillis();
Object result=proceedingJoinPoint.proceed();
long endtime=System.currentTimeMillis();
System.out.println("方法执行了"+(endtime-begintime)+"时间");
return result; }
@AfterThrowing(value="execution(* com.guigu.shen.anotion.UserDaoImpl.*(..))",throwing="e")
public void afterThrowing(JoinPoint joinPoint,Exception e)
{
System.out.print(joinPoint.toLongString()+"方法发生了异常"+e.getMessage());
}
@After("execution(* com.guigu.shen.anotion.UserDaoImpl.*(..))")
public void after()
{
System.out.print("最终通知,释放资源"); } }

UserDao接口类:

public interface UserDao {
public int delete();
}

UserDao接口的实现类:

//编写目标类(真正被代理的)
public class UserDaoImpl implements UserDao { public int delete() {
System.out.println("删除了");
//int a=1/0;
return 1; } }

Junit测试类:

//JUnit与Spring的整合 (用注解)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml") public class TestMyspect {
@Autowired
private UserDao userDao; @Test
public void deletetest()
{
userDao.delete();
}
public void aroundTest()
{ userDao.delete();
}
}

ApplicationContext.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-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/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- AspectJ AOP --> <!-- 自动注解 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<!-- xml配置目标bean和切面bean -->
<bean id="UserDao" class="com.guigu.shen.anotion.UserDaoImpl"></bean>
<bean id="Myspect" class="com.guigu.shen.anotion.Myspect"></bean> <!--
流程解释:
xml配置目标bean和切面bean,这样一来bean就会被加载,对象就创建好了,然后我们在之前不是配置了一个<aop:aspectj-autoproxy></aop:aspectj-autoproxy>了吗
这样就能给我们创建的UserDao和Myspect对象做代理了
--> </beans>

17Spring_AOP编程(AspectJ)_AspectJ的注解编程的更多相关文章

  1. 18Spring_AOP编程(AspectJ)_AspectJ的各种通知总结

    小结: 前置通知(权限控制). 后置通知 ---- 不怎么用 环绕通知(权限控制. 性能监控. 缓存技术 ) 异常通知 (发生异常后, 记录错误日志 ) 最终通知 (释放资源 ) 环绕通知 是取代任何 ...

  2. Spring 注解(一)Spring 注解编程模型

    Spring 注解(一)Spring 注解编程模型 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 注解系列 ...

  3. Spring 注解编程之注解属性别名与覆盖

    前两篇文章咱聊了深入了解了 Spring 注解编程一些原理,这篇文章我们关注注解属性方法,聊聊 Spring 为注解的带来的功能,属性别名与覆盖. 注解属性方法 在进入了解 Spring 注解属性功能 ...

  4. 理解 Spring 注解编程模型

    理解 Spring 注解编程模型 Spring 中有一个概念叫「元注解」(Meta-Annotation),通过元注解,实现注解的「派生性」,官方的说法是「Annotation Hierarchy」. ...

  5. 跟Evan学Sprign编程思想 | Spring注解编程模式【译】

    Spring注解编程模式 概况 多年来,Spring Framework不断发展对注解.元注解和组合注解的支持. 本文档旨在帮助开发人员(Spring的最终用户以及Spring Framework和S ...

  6. [.net 面向对象编程基础] (2) 关于面向对象编程

    [.net 面向对象编程基础]  (2)  关于面向对象编程 首先是,面向对象编程英文 Object-Oriented Programming 简称 OOP 通俗来说,就是 针对对象编程的意思 那么问 ...

  7. 5天玩转C#并行和多线程编程 —— 第五天 多线程编程大总结

    5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...

  8. AspectJ获取方法注解的信息

    在使用Aspectj获取方法注解信息的时候,可以使用下面的代码片段: /** * Get value of annotated method parameter */ private <T ex ...

  9. linux tcp/ip编程和windows tcp/ip编程差别以及windows socket编程详解

    最近要涉及对接现有应用visual c++开发的tcp客户端,花时间了解了下windows下tcp开发和linux的差别,从开发的角度而言,最大的差别是头文件(早期为了推广尽可能兼容,后面越来越扩展, ...

随机推荐

  1. Win10安装framework3.5

    .NET少不了framewrok,其版本也比较多,默认情况下win7及上版本没有安装framework3.5,但有些软件又需要它,比如arcgis软件在安装时会检测是否存在3.5,如果没有,将不会正常 ...

  2. iOS设计模式之命令模式

    命令模式 基本理解 命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化:对请求队列或记录请求日志,以及支持客可撤离的操作. 苹果的Target-Action ...

  3. iOS开发笔记8:Remote Notification远程消息推送处理

    远程消息推送处理场景有三种:分别是app还没有运行.app在前台运行以及app在后台运行,下面介绍相关流程及三种场景下处理步骤 1.流程 (1)注册通知 首先是在注册远程消息推送,需要注意的是iOS8 ...

  4. Android开发者的Git&GitHub(二)

     将代码托管到GitHub上 点击右上角New repository按钮来创建一个版本库 命名后选择添加一个Android项目类型的.gitignore文件,并选择开源协议(例如:Apache v2 ...

  5. MongoDb的bin目录下文件mongod,mongo,mongostat命令的说明及使用

    MongoDB的下载地址:http://www.mongodb.org/downloads. 下载好直接解压安装包,即可使用. bin目录下的几个文件说明: mongo 客户端程序,连接MongoDB ...

  6. windows下使用tomcat部署网站

    一.配置过程: 1.  配置java环境(之前已装过,跳过此步骤) 2.  下载tomcat (1)找到支持此java版本的tomcat版本: (2)下载与当前系统对应的安装文件 http://tom ...

  7. Web Service中的几个重要术语

    WSDL:web service definition language 直译:WebService定义语言 1.对应一种该类型的文件.WSDL 2.定义了Web Service的服务器与客户端应用交 ...

  8. 超链接的那些事(三): 属性target

    a标签的属性之一 target 1. 定义     规定在何处打开链接文档. 如果a标签中有target属性,浏览器将会载入和显示用这个标签的 href 属性命名的.名称与这个目标吻合的框架或者窗口中 ...

  9. 面向对象and类

    类和对象: 1.什么叫类:类是一种数据结构,就好比一个模型,该模型用来表述一类事物(事物即数据和动作的结合体),用它来生产真实的物体(实例). 2.什么叫对象:睁开眼,你看到的一切的事物都是一个个的对 ...

  10. (三)openwrt主Makefile解析

    本周成胖子每周一博到了第四周^_^ 前言 主Makefile结构 顶层 第二层 尾记 前言 前一篇,我们大概描述了整个镜像文件的生成过程.本周我们来解析主Makefile,看看主要编译过程是怎么产生的 ...