之前是通过配置完成aop操作,如果自己写的话,太麻烦了,可以使用基于annotation的配置完成。

第一步:打开AOP的annotation支持

加上一句话:

    <context:annotation-config/>
<context:component-scan base-package="com.Spring"/>
  <aop:aspectj-autoproxy  proxy-target-class="true"/>    //使用了jdk的自动动态代理,需要加上这句话,否则报错
<aop:aspectj-autoproxy/>

随后需要在ServiceAspect类中编写所需要使用的annotation。

范例:修改serviceAspect类。

package com.Spring.aop;

import java.lang.reflect.Array;
import java.util.Arrays;
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.springframework.stereotype.Component; import com.Spring.Vo.Member; @Component  //用来取代在xml中配置bean初始化
@Aspect   //用来代替在xml中配置AOP操作
public class ServiceAspect {
@Before(value="execution(* com.Spring..*.*(..)))")
public void serviceBefore()
{
System.out.println("AOP切面执行日志记录操作");
}
@Before(value="execution(* com.Spring..*.*(..)) and args(param)))",argNames="param")
public void serviceBefore2(Object arg)
{
System.out.println("AOP切面执行增加前操作,参数=" +arg);
}
@After(value="execution(* com.Spring..*.*(..)))")
public void serviceAfter()
{
System.out.println("AOP切面执行事务处理操作");
}
@AfterReturning(value="execution(* com.Spring..*.*(..)))",argNames="ret",returning="ret")
public void serviceAfterReturn(Object val) //表示操作结果
{
System.out.println("AOP切面操作完成,返回结果:"+val);
}
@AfterThrowing(value="execution(* com.Spring..*.*(..)))",argNames="e",throwing="e")
public void serviceAfterThrow(Exception e) //表示操作结果
{
System.out.println("AOP切面操作出现异常:"+e);
}
@Around(value="execution(* com.Spring..*.*(..)))")
public Object serviceAround(ProceedingJoinPoint point) throws Throwable
{
System.out.println("AOP切面数据层方法调用之前,参数:"+Arrays.toString(point.getArgs()));
Member vo=new Member();
vo.setMid("TestAOP");
vo.setName("测试AOP");
Object retVal=point.proceed(new Object[]{ vo });
System.out.println("AOP切面数据层方法调用之后,返回值:"+retVal);
return true;
}
}

运行结果:

可以对照之前用注解的xml配置:

<context:annotation-config/>
<context:component-scan base-package="com.Spring"/>
<aop:aspectj-autoproxy proxy-target-class="true"/> <aop:config>
<!-- 定义程序的切入点 -->
<aop:pointcut expression="execution(* com.Spring..*.*(..)) and args(vo))" id="pointcut"/>
<!-- 这里ref的对象是通过annotation配置@Component出来的, -->
<!-- 定义面向方面的处理类 -->
<aop:aspect ref="serviceAspect">
<!--
<aop:before method="serviceBefore2" pointcut-ref="pointcut" arg-names="vo"/>
<aop:after method="serviceAfter" pointcut="execution(* com.Spring..*.*(..)))"/>
<aop:after-returning method="serviceAfterReturn" pointcut="execution(* com.Spring..*.*(..)))" returning="haha" arg-names="haha"/>
<aop:after-throwing method="serviceAfterThrow" pointcut="execution(* com.Spring..*.*(..)))" arg-names="e" throwing="abc"/>
-->
<aop:around method="serviceAround" pointcut="execution(* com.Spring..*.*(..)))" />
</aop:aspect>
</aop:config>

实际操作中,需要进行一些辅助性功能编写的时候(比如日志记录),建议使用annotation的配置操作,这样的代码是最简化的,也是最直观的。

18-spring学习-利用Annotation配置AOP的更多相关文章

  1. Spring学习记录(十二)---AOP理解和基于注解配置

    Spring核心之二:AOP(Aspect Oriented Programming) --- 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软 ...

  2. Spring学习笔记IOC与AOP实例

    Spring框架核心由两部分组成: 第一部分是反向控制(IOC),也叫依赖注入(DI); 控制反转(依赖注入)的主要内容是指:只描述程序中对象的被创建方式但不显示的创建对象.在以XML语言描述的配置文 ...

  3. Spring学习资料以及配置环境

    一.Spring4 1.介绍 新特性 SpringIDE 插件 IOC DI 在 Spring 中配置 Bean 自动装配 Bean 之间的关系(依赖.继承) Bean 的作用域 使用外部属性文件 S ...

  4. Spring学习之第一个AOP程序

    IOC和AOP是Spring的两大基石,AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对 ...

  5. Spring 学习(三)AOP

    (1)AOP概述 - AOP:面向切面编程,扩展功能不修改源代码实现 - AOP采取横向抽取机制,取代了传统的纵向继承体系重复性代码 (2)AOP底层原理 原始方法------->纵向继承体系 ...

  6. 【JavaEE】SSH+Spring Security基础上配置AOP+log4j

    Spring Oauth2大多数情况下还是用不到的,主要使用的还是Spring+SpringMVC+Hibernate,有时候加上SpringSecurity,因此,本文及以后的文章的example中 ...

  7. Spring学习(八)AOP详解

    文章更新时间:2020/04/06 一.一个例子 在上面的例子中,包租婆的核心业务就是签合同,收房租,那么这就够了,灰色框起来的部分都是重复且边缘的事,交给中介商就好了,这就是 AOP 的一个思想:让 ...

  8. Spring初学之annotation实现AOP前置通知、后置通知、返回通知、异常通知。

    实现两个整数的加减乘除.在执行每个方法之前打印日志. ArithmeticCalculator.java: package spring.aop.impl; public interface Arit ...

  9. Spring学习之旅(五)--AOP

    什么是 AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是 OOP(Object-Oriented Programing,面向对象编程)的补充和完善. OO ...

随机推荐

  1. ASP.NET获取文件的相关知识

    string filePath = FileUpload1.PostedFile.FileName;//获取上传文件的路径 string fileName = filePath.Substring(f ...

  2. HDU 4675 GCD of Sequence (2013多校7 1010题 数学题)

    GCD of Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)T ...

  3. 详解Java中的clone方法 -- 原型模式 及源码

    http://www.cnblogs.com/cq-home/p/6431426.html http://blog.csdn.net/zhangjg_blog/article/details/1836 ...

  4. erlang 大神

    http://blog.csdn.net/erlib/article/details/46655905

  5. 移动端 关于 键盘将input 框 顶上去的解决思路---个人见解

    在移动端,经常会遇到input获得焦点时候弹出的虚拟键盘将整体页面布局打乱的情况. 比如说是这种 输入框未获得焦点键盘未抬起的时候: 输入框获得焦点键盘抬起的时候 这种情况下,不管是上面的textar ...

  6. LINUX开启允许对外访问的网络端口命令

    LINUX通过下面的命令可以开启允许对外访问的网络端口: /sbin/iptables -I INPUT -p tcp --dport 8000 -j ACCEPT #开启8000端口 /etc/rc ...

  7. 根据url下载图片和页面

    需要将&tp=webp&wxfrom=5去掉,既可以在任何地方显示,也可以下载了 http://mmbiz.qpic.cn/mmbiz_jpg/bf8pC39RBhGFOH1ib9Ac ...

  8. node.js&pm2搭建node生产环境

    node.js下载地址https://nodejs.org/en/download/stable/ 下载截图 建议采用稳定编译过的版本,source code稍麻烦,编译过的直接可用,安装超级简单,红 ...

  9. Appium+python自动化14-查看webview上元素(DevTools)

    前言 app上webview的页面实际上是启用的chrome浏览器的内核加载的,如何把手机的网页加载到电脑上,电脑的chrome浏览器上有个开发模式DevTools,是可以方便调试的. 一.环境准备 ...

  10. N个富文本编辑器/基于Web的HTML编辑器

    转自:http://www.cnblogs.com/lingyuan/archive/2010/11/15/1877447.html 基于WEB的HTML 编辑器,WYSIWYG所见即所得的编辑器,或 ...