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. 安装linux 报错(initramfs) Unable to find a medium containing a live file system

    如题,linux 安装报错:(initramfs) Unable to find a medium containing a live file system 我是用UItraISO做的启动盘遇到这个 ...

  2. jwt-在asp.net core中的使用jwt

    JWT学习文章: 第一篇:JWT原理 第二篇:JWT原理实现代码 第三篇:在asp.net core中的使用JWT 前两篇文章中我写了jwt的原理,并且也用原理实现了jwt的验证.如果要看前两篇文章, ...

  3. Sai学习笔记

    颜色模块的功能介绍 色轮 RGB滑块 HSV滑块(常用) H:色相 S:纯度 V:明度 中间色条,主要用来混色 颜料盒 调色板 选择工具的使用 选择框 快捷键:Ctrl+D 套索 魔棒 图文工具使用 ...

  4. error C3646: 未知重写说明符

    记录一个报错 error C3646: 未知重写说明符 ①循环引用 在项目文件变多时,由于组织不当,很容易出现头文件的循环引用 有时候虽然没有出现循环引用,但是头文件多处被include :适当的使用 ...

  5. 26、linux下安装MongoDB

    26.1.MongoDB介绍: 1.什么是MongoDB: MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能. Mo ...

  6. [Usaco2018 Dec]Teamwork 题解

    题目描述 题目描述 在Farmer John最喜欢的节日里,他想要给他的朋友们赠送一些礼物.由于他并不擅长包装礼物,他想要获得他的 奶牛们的帮助.你可能能够想到,奶牛们本身也不是很擅长包装礼物,而Fa ...

  7. Pandas高级教程之:plot画图详解

    目录 简介 基础画图 其他图像 bar stacked bar barh Histograms box Area Scatter Hexagonal bin Pie 在画图中处理NaN数据 其他作图工 ...

  8. JS replace 替换全部数据

    (1)使用具有全局标志g的正则表达式 var str = "dogdogdog"; var str2 = str.replace(/dog/g,"cat");/ ...

  9. MyBatis框架的使用解析!数据库相关API的基本介绍

    动态SQL if 根据条件包含where子句的一部分 <select id="findActiveBlogLike" resultType="Blog"& ...

  10. Local dimming algorithm in matlab plus 1

    (续)LED局部背光算法MATLAB仿真 在上一篇博客<Local dimming algorithm in matlab>中,我们实现了对一篇论文的算法用matlab仿真.在本篇论文中, ...