Spring中AOP切面编程学习笔记

注解方式实现aop我们主要分为如下几个步骤:
  1.在切面类(为切点服务的类)前用@Aspect注释修饰,声明为一个切面类。
  2.用@Pointcut注释声明一个切点,目的是为了告诉切面,谁是它的服务对象。(此注释修饰的方法的方法体为空,不需要写功能比如 public void say(){};就可以了,方法名可以被候命的具体服务功能所以引用,它可以被理解为切点对象的一个代理对象方法)
  3.在对应的方法前用对应的通知类型注释修饰,将对应的方法声明称一个切面功能,为了切点而服务
  4.在spring配置文件中开启aop注释自动代理。如:<aop:aspectj-autoproxy/>

通知注解类型如下:

 

切点方法:

 

package aopdemo;import org.springframework.stereotype.Component;/*** @author coco.xu* @Date 2019-03-25*/
@Component("sayName")
public class SayName {public void saying() {System.out.println("我是coco...(切点方法)");}
}

 

 切面类:

package aopdemo;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
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;/*** @author coco.xu* @Date 2019-03-25*//*** 注解方式声明aop* 1.用@Aspect注解将类声明为切面(如果用@Component("")注解注释为一个bean对象,那么就要在spring配置文件中开启注解扫描,* <context:component-scan base-package="aopdemo"/>* 否则要在spring配置文件中声明一个bean对象) * 2.在切面需要实现相应方法的前面加上相应的注释,也就是通知类型。* 3.此处有环绕通知,环绕通知方法一定要有ProceedingJoinPoint类型的参数传入,然后执行对应的proceed()方法,环绕才能实现。*/
@Component("annotationTest")
@Aspect
public class AnnotationTest {// 定义切点@Pointcut("execution(* *.saying(..))")public void sayings() {}/*** 前置通知(注解中的sayings()方法,其实就是上面定义pointcut切点注解所修饰的方法名,那只是个代理对象,不需要写具体方法,* 相当于xml声明切面的id名,如下,相当于id="embark",用于供其他通知类型引用)* <aop:config> <aop:aspect ref="mistrel"> <!-- 定义切点 -->* <aop:pointcut expression="execution(* *.saying(..))" id="embark"/> <!--* 声明前置通知 (在切点方法被执行前调用) -->* <aop:before method="beforSay" pointcut-ref="embark"/> <!-- 声明后置通知* (在切点方法被执行后调用) -->* <aop:after method="afterSay" pointcut-ref="embark"/> </aop:aspect>* </aop:config>*/@Before("sayings()")public void sayHello() {System.out.println("注解类型前置通知");}// 后置通知@After("sayings()")public void sayGoodbey() {System.out.println("注解类型后置通知");}// 环绕通知。注意要有ProceedingJoinPoint参数传入。@Around("sayings()")public void sayAround(ProceedingJoinPoint pjp) throws Throwable {System.out.println("注解类型环绕通知..环绕前");pjp.proceed();// 执行方法System.out.println("注解类型环绕通知..环绕后");}
}

 

 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.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"><!-- 开启注解扫描 --><context:component-scan base-package="aopdemo"/><!-- 开启aop注解方式,此步骤不能少,这样java类中的aop注解才会生效 --><aop:aspectj-autoproxy/>
</beans>

 

测试类:

package aopdemo;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** * @author coco.xu* @Date 2019-03-25*/
public class AopTest {public static void main(String[] args) {ApplicationContext ac = new ClassPathXmlApplicationContext("aopdemo/beans.xml");SayName sn = (SayName) ac.getBean("sayName");sn.saying();}
}

 

执行测试类,执行结果如下:

 

转载于:https://www.cnblogs.com/cocoxu1992/p/10593154.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Good Web

Good Web http://www.jxue.com/job/resume/ Englishhttp://www.jxue.com/zt/06zt/resume/http://www.cnrencai.com/ Jobposted on 2007-04-10 00:18 Steveson 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/Steveson/archive/2007/04/10/706450.h…

asp.net 生命周期中的时间流程

一、初始化 当页面被提交请求第一个方法永远是构造函数。您可以在构造函数里面初始一些自定义属性或对象&#xff0c;不过这时候因为页面还没有被完全初始化所以多少会有些限制。特别地&#xff0c;您需要使用HttpContext对象。当前可以使用的对象包括QueryString, Form以及Coo…

[vue] 怎么配置使vue2.0+支持TypeScript写法?

[vue] 怎么配置使vue2.0支持TypeScript写法&#xff1f; 配置ts-loader&#xff0c;tsconfig增加类型扩展&#xff0c;让ts识别vue文件vue文件中script里面换成ts写法&#xff0c; 需要增加几个ts扩展的package&#xff0c; 比如vue-property-decorator个人简介 我是歌谣&…

PHP迸发,PHP 开发 「十宗罪」

前言本文翻译自 10 Things Not To Do In PHP 7。全文列出了十条我们在 PHP7 开发中应注意避免的 反模式&#xff0c;觉得很有参考意义故翻译成中文供大家学习借鉴。1. 不要使用 mysql_ 函数在 PHP7 中&#xff0c;mysql_ 系列函数已经完全从核心代码中移除&#xff0c;你应该用…

元组、字典、集合的常用方法

一、元组类型 1、定义 t1 () print(t1, type(t1)) # 参数为for可以循环的对象(可迭代对象) t2 tuple("123") print(t2, type(t2)) t3 tuple([1, 2, 3]) print(t3, type(t3)) t4 tuple((7, 8, 9)) print(t4, type(t4)) # 思考:如何定义一个只有一个值的元组 # &qu…

(转)看盘ABC:看盘七大指标

(转&#xff09;看盘ABC&#xff1a;看盘七大指标 投资大师巴菲特说过一句话&#xff1a;投资是一场马拉松赛&#xff0c;获得冠军的前提是要跑完全程。在这场马拉松赛中&#xff0c;您能跑完全程吗&#xff1f;以往无数股民的经历表明&#xff0c;中途惨败出局者不计其数。为…

[vue] 说说组件的命名规范

[vue] 说说组件的命名规范 定义组件名有两种方式&#xff1a; 1.kebab-case&#xff08;短横线分隔命名&#xff09;&#xff0c;引用时必须也采用kebab-case&#xff1b; 2.PascalCase&#xff08;首字母大写命名&#xff09;&#xff0c;引用时既可以采用PascalCase也可以使…

php梯度区间计算,快速计算梯度的魔法--反向传播算法

2.1 计算梯度的数值方法第一次实验我留的一个课后作业里问你是否能够想出一个求解梯度的办法&#xff0c;其实不难想到一种简单的办法就是使用“数值法”计算梯度。办法很简单&#xff0c;就是对于损失函数中的一个初始取值为a0的参数a,先计算当前的损失函数值J0,再保持其他参数…

SpringCloud的学习记录(1)

最近一段时间重新学习一边SpringCloud&#xff0c;这里简单记录一下。 我用的是IntelliJ IDEA开发工具, SpringBoot的版本是2.1.3.RELEASE。 1. 构建Maven项目 整个的SpringCloud的项目是在Maven项目中的&#xff0c;这个Maven只做容纳其他项目使用, 比如后面Fegin/Config/Zipk…

[转]URLRewriter使用通配符

网上有很多写这个组件使用的文章&#xff0c;如何使用我就不细述了&#xff0c;有关在 ASP.NET 中执行 URL 重写的文章请看下面链接:http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx?mfrtrue 我这里要说的是其中几个很容易被忽视的小细节…

[vue] 在vue中使用this应该注意哪些问题?

[vue] 在vue中使用this应该注意哪些问题&#xff1f; vue中使用匿名函数&#xff0c;会出现this指针改变。 解决方法 1.使用箭头函数 2.定义变量绑定this至vue对象个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大…

oracle逻辑备份和物理备份,Oracle备份与恢复介绍(物理备份与逻辑备份)

3、逻辑备份之EXP/IMP&#xff1a;EXP和IMP是客户端工具程序&#xff0c;它们既可以在客户端使用&#xff0c;也可以在服务端使用。EXPDP和IMPDP是服务端的工具程序&#xff0c;他们只能在ORACLE服务端使用&#xff0c;不能在客户端使用。IMP只适用于EXP导出的文件&#xff0c;…

作业-python常用库类 numpy+pandas

# -*- coding:utf-8 -*-# 1,一个四维的数组,以后两维度为单位,计算它们的和,比如一个1*2*3*4的数组,合并后两列,输出合并后的轴的sum# 实例,输入:[[[[2 7 9 7] [6 6 8 2] [0 0 9 3]][[5 4 1 4][5 7 9 7] [8 4 1 4]] ]] 输出[[59 59]]# import numpy as np# anp.array([[[[2,…

ICE专题:ICE起步

ICE初步 最早开始接触ICE是在2005,3月份,当时一个朋友向另一个正打算研究corba的朋友强烈的推荐了ICE. 参考:http://www.zeroc.com/ 1.什么是ICE? ICE(internet communications engine)是适用于异种环境的面向对象中间件平台。 那么什么是中间件呢? 比较流行的定义是:中间件是…

[vue] 你有使用做过vue与原生app交互吗?说说vue与ap交互的方法

[vue] 你有使用做过vue与原生app交互吗&#xff1f;说说vue与ap交互的方法[vue] 你有使用做过vue与原生app交互吗&#xff1f;说说vue与ap交互的方法 我的做法就是让app在webview把app的方法暴露在window上让前端调用、反之app调用前端的方法也需要前端把方法暴露在window上(w…

[vue] 使用vue写一个tab切换

[vue] 使用vue写一个tab切换 v-for循环&#xff0c;利用下标和v-show显示<div id"app"><ul class"tabs"><li class"li-tab" v-for"(item,index) in tabsParam" click"toggleTabs(index)" :class"index…

subversion安装与配置备忘录

subversion安装与配置备忘录 前两天给公司安subversion,总是出问题,今天总结一下整个过程,以备将来遗忘.下边是我对在网上的一些文章的添加和补充基础上写的. 我是安装windows版本的subversion,所以先把linux下的简介一下: 1.下载httpd-2.0.*.tar.gz(http://www.apache.org)源代…

html5 拖拽上传文件时,屏蔽浏览器默认打开文件

参考&#xff1a; https://www.cnblogs.com/kingsm/p/9849339.html 转载于:https://www.cnblogs.com/cwxwdm/p/10605529.html

[vue] vue中什么是递归组件?举个例子说明下?

[vue] vue中什么是递归组件&#xff1f;举个例子说明下&#xff1f; 组件自己调用自己&#xff0c;场景有用于生成树形结构菜单个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通…

oracle仲裁磁盘是一块磁盘吗,基于ASM冗余设计的架构,仲裁磁盘组应该如何去规划?...

ASM使用独特的镜像算法&#xff1a;不镜像磁盘&#xff0c;而是镜像盘区。作为结果&#xff0c;为了在产生故障时提供连续的保护&#xff0c;只需要磁盘组中的空间容量&#xff0c;而不需要预备一个热备(hot spare)磁盘。不建议用户创建不同尺寸的故障组&#xff0c;因为这将会…