Spring基础

AOP 面向切面编程

通知、连接点、切点、切面

Spring提供 4 种类型的AOP支持:

  • 基于代理的经典SpringAOP:使用ProxyFactoryBean。
  • 纯POJO切面:使用XML配置;
  • @ASpectJ注解驱动的切面;
  • 注入式AspectJ切面。

前三种都属于SpringAOP,基于代理(JDK动态代理和Cglib)。第四种属于AspectJ。

通过切点来选择连接点

切点表达式:

execution(* a.b.c.method(...)) && bean('some')

execution(* soundSystem.CompactDisc.playTrack(int)) && args(trackNumber)

1. 使用注解创建切面

@Aspect 注解 表明类是一个切面

Spring使用了 AspectJ库的注解并且使用 AspectJ库对切点表达式进行解析和匹配(需要aspectjweaver.jar),但AOP运行时并不使用 AspectJ的编译器和织入,仍然是使用纯粹的SpringAOP实现。

  1. 切面的方法前使用注解:

    @Before("切点表达式") 通知方法会在目标方法调用之前执行;

    @After("切点表达式") 通知方法会在目标方法返回或抛出异常后调用;

    @AfterReturning("切点表达式") 通知方法会在目标方法返回后调用;

    @AfterThrowing("切点表达式") 通知方法会在目标方法抛出异常后调用;

    @Around("切点表达式") 通知方法会将目标方法封装起来。
  2. @Pointcut("切点表达式") 注解方法,定义一个切点

该切面类需要装配为Spring中的bean,并且需要在配置类前使用@EnableAspectJAutoProxy 注解启用自动代理。

环绕通知:

@Aspect
public class Audience{ @Pointcut("execution(** concert.Performance.perform(..))")
public void performance(){} @Around("performance()")
public void watchPerformance(ProceedingJoinPoint jp){
try{
//Before前置通知
jp.proceed(); //调用被通知的方法,可以不调用以阻塞,也可以多次调用
//AfterReturning后置通知
}catch(Throwable e){
//AfterThrowing后置通知
}
}
}

通过注解引入新功能:

@Aspect
public class EncoreableIntroducer{ //定义切面
@DeclareParents(valule = "concert.Performance+", //哪种类型的bean要引入该接口
deafultImpl = DefaultEncoreable.class) //为引入接口提供实现的类
public static Encoreable encoreable; //要引入的接口
}

上述类需要被声明为一个bean

2. 在XML中声明切面

如果你需要声明切面,但是又不能为通知类切面类添加注解的时候(没有源码),那么就必须转向XML配置了

  • [ ] TODO

3. 注入AspectJ切面

首先配置AspectJ的环境:

  1. 在https://www.eclipse.org/aspectj/downloads.php#ides 下载aspectj-1.x.x.jar;
  2. 使用java -jar aspectj-1.1.0.jar进行安装;
  3. 将 ${aspect_path}/lib/aspectjrt.jar加入项目的依赖;

    在IDE中将编译器设置为Ajc,路径为${aspect_path}/bin/aspectjtools.jar;
文件 CriticAspect.aj:

package concert;

public aspect CriticAspect {    //定义切面,需在XML中配置为bean

    pointcut performance():execution(* concert.Performance.perform(..));    //定义切点

    after():performance(){  //定义通知
System.out.println(criticismEngine.getCriticism());
} private CriticismEngine criticismEngine; //将被注入bean
// 通过属性的setter()函数实现注入
public void setCriticismEngine(CriticismEngine criticismEngine) {
this.criticismEngine = criticismEngine;
}
}

Spring in Action学习笔记(2)的更多相关文章

  1. spring in action学习笔记十五:配置DispatcherServlet和ContextLoaderListener的几种方式。

    在spring in action中论述了:DispatcherServlet和ContextLoaderListener的关系,简言之就是DispatcherServlet是用于加载web层的组件的 ...

  2. spring in action 学习笔记十四:用纯注解的方式实现spring mvc

    在讲用纯注解的方式实现springmvc之前先介绍一个类:AbstractAnnotationDispatcherServletInitializer.这个类的作用是:任何一个类继承AbstractA ...

  3. spring in action学习笔记一:DI(Dependency Injection)依赖注入之CI(Constructor Injection)构造器注入

    一:这里先说一下DI(Dependency Injection)依赖注入有种表现形式:一种是CI(Constructor Injection)构造方法注入,另一种是SI(Set Injection) ...

  4. Spring in Action 学习笔记三-AOP

    面向切面的Spring 2015年10月9日 11:30             屏幕剪辑的捕获时间: 2015-10-9 14:30             屏幕剪辑的捕获时间: 2015-10-9 ...

  5. Spring in Action 学习笔记二-DI

    装配bean 2015年10月9日 9:49             Sprng中,对象无需自己负责查找或创建其关联的其他对象.相关,容器负责吧需要相互协作的对象引用赋予各个对象. 创建应用对象之间协 ...

  6. Spring in Action 学习笔记一

    Spring 核心       Spring的主要特性仅仅是 依赖注入DI和面向切面编程AOP       JavaBean 1996.12 Javav 规范针对Java定义了软件组件模型,是简单的J ...

  7. spring in action学习笔记十六:配置数据源的几种方式

    第一种方式:JNDI的方式. 用xml配置的方式的代码如下: 1 <jee:jndi-lookup jndi-name="/jdbc/spittrDS" resource-r ...

  8. spring in action 学习笔记九:如何证明在scope为prototype时每次创建的对象不同。

    spring 中scope的值有四个:分别是:singleton.prototype.session.request.其中session和request是在web应用中的. 下面证明当scope为pr ...

  9. spring in action学习笔记七:@Conditional注解的用法

    @Profile注解是@Conditional注解的一个例子.即@Profile也是用@Conditional注解来实现的. 必须让条件实现Condition这个接口. 下面的案例讲如果环境中有mag ...

  10. spring in action 学习笔记五:@Autowired这个注解如何理解

    @Autowired这个注解的意思就是自动装配.他把一个bean对象自动装配到另一个对象中.下面的案例证明了spring的自动装配. 定义一个Sixi类.代码如下: package com.qls.a ...

随机推荐

  1. C#串口通信——DtrEnable 和RtsEnable 两个属性

    转自 http://www.cnblogs.com/hengbo/archive/2011/12/19/2293272.html 在开发中有些串口设备需要串口供电(本人在开发门禁系统时,对起落杆进行控 ...

  2. 『无为则无心』Python基础 — 6、Python的注释

    目录 1.注释的作用 2.注释的分类 单行注释 多行注释 3.注释的注意事项 4.什么时候需要使用注释 5.总结 提示:完成了前面的准备工作,之后的文章开始介绍Python的基本语法了. Python ...

  3. 初学springboot

    现在总是与数据库和前端打交道,让我觉得好厌烦,还是喜欢敲代码.最近问了几个朋友,都说潮流要学springCloud,然后学springCloud又要先学springboot,所以这段时间我会慢慢把sp ...

  4. golang 模板语法使不解析html标签及特殊字符

    场景 有时候需要使用go的模板语法,比如说用go 去渲染html页面的时候,再比如说用go的模板搞代码生成的时候.这时候可能会遇到一个麻烦,不想转译的特殊字符被转译了. 我遇到的情况是写代码生成器的时 ...

  5. 详解 CDN 加速

    背景 本来是为了深入了解 CDN 的,结果发现前置知识:IP.域名.DNS 都还不算特别熟,所以先写了他们 现在终于来聊一聊 CDN 啦 本文素材均出自:https://www.bilibili.co ...

  6. el-upload上传列表实现 展开 收起

    # el-upload上传列表实现 展开 收起 #### 无图言*,所以先上最终效果图(想参考代码的可以直接滑到最后) ### 具体实现思路 注意: 每个人的项目环境以及需求,都不尽相同,所以这里仅仅 ...

  7. Kubernetes网络的iptables模式和ipvs模式支持ping分析

    1.iptables模式无法ping通原因分析 iptables模式下,无法ping通任何svc,包括clusterip.所有ns下,下面来分析原因: 查看kubernetes的网络模式 curl 1 ...

  8. Elasticsearch中的Term查询和全文查询

    目录 前言 Term 查询 exists 查询 fuzzy 查询 ids 查询 prefix 查询 range 查询 regexp 查询 term 查询 terms 查询 terms_set 查询 t ...

  9. 31、DNS介绍

    [root@centos6 ~]# dig @8.8.8.8 www.baidu.com +trace ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.3 ...

  10. Web 前端开发规范手册

    一.规范目的 Web 前端开发规范手册 1.1 概述 ......................................................................... ...