Spring in Action学习笔记(2)
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实现。
- 切面的方法前使用注解:
@Before("切点表达式") 通知方法会在目标方法调用之前执行;
@After("切点表达式") 通知方法会在目标方法返回或抛出异常后调用;
@AfterReturning("切点表达式") 通知方法会在目标方法返回后调用;
@AfterThrowing("切点表达式") 通知方法会在目标方法抛出异常后调用;
@Around("切点表达式") 通知方法会将目标方法封装起来。 - @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的环境:
- 在https://www.eclipse.org/aspectj/downloads.php#ides 下载aspectj-1.x.x.jar;
- 使用java -jar aspectj-1.1.0.jar进行安装;
- 将 ${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)的更多相关文章
- spring in action学习笔记十五:配置DispatcherServlet和ContextLoaderListener的几种方式。
在spring in action中论述了:DispatcherServlet和ContextLoaderListener的关系,简言之就是DispatcherServlet是用于加载web层的组件的 ...
- spring in action 学习笔记十四:用纯注解的方式实现spring mvc
在讲用纯注解的方式实现springmvc之前先介绍一个类:AbstractAnnotationDispatcherServletInitializer.这个类的作用是:任何一个类继承AbstractA ...
- spring in action学习笔记一:DI(Dependency Injection)依赖注入之CI(Constructor Injection)构造器注入
一:这里先说一下DI(Dependency Injection)依赖注入有种表现形式:一种是CI(Constructor Injection)构造方法注入,另一种是SI(Set Injection) ...
- Spring in Action 学习笔记三-AOP
面向切面的Spring 2015年10月9日 11:30 屏幕剪辑的捕获时间: 2015-10-9 14:30 屏幕剪辑的捕获时间: 2015-10-9 ...
- Spring in Action 学习笔记二-DI
装配bean 2015年10月9日 9:49 Sprng中,对象无需自己负责查找或创建其关联的其他对象.相关,容器负责吧需要相互协作的对象引用赋予各个对象. 创建应用对象之间协 ...
- Spring in Action 学习笔记一
Spring 核心 Spring的主要特性仅仅是 依赖注入DI和面向切面编程AOP JavaBean 1996.12 Javav 规范针对Java定义了软件组件模型,是简单的J ...
- spring in action学习笔记十六:配置数据源的几种方式
第一种方式:JNDI的方式. 用xml配置的方式的代码如下: 1 <jee:jndi-lookup jndi-name="/jdbc/spittrDS" resource-r ...
- spring in action 学习笔记九:如何证明在scope为prototype时每次创建的对象不同。
spring 中scope的值有四个:分别是:singleton.prototype.session.request.其中session和request是在web应用中的. 下面证明当scope为pr ...
- spring in action学习笔记七:@Conditional注解的用法
@Profile注解是@Conditional注解的一个例子.即@Profile也是用@Conditional注解来实现的. 必须让条件实现Condition这个接口. 下面的案例讲如果环境中有mag ...
- spring in action 学习笔记五:@Autowired这个注解如何理解
@Autowired这个注解的意思就是自动装配.他把一个bean对象自动装配到另一个对象中.下面的案例证明了spring的自动装配. 定义一个Sixi类.代码如下: package com.qls.a ...
随机推荐
- Java安全之基于Tomcat实现内存马
Java安全之基于Tomcat实现内存马 0x00 前言 在近年来红队行动中,基本上除了非必要情况,一般会选择打入内存马,然后再去连接.而落地Jsp文件也任意被设备给检测到,从而得到攻击路径,删除we ...
- SpringBoot项目创建流程--SpringMVC
SpringBoot项目创建步骤 1. 创建SpringBoot工程 (1) File → New → Project → Spring Initilizr (2) Name:MySpringBoot ...
- Ubuntu 之 Esc and CapsLK
Ubuntu 更换 CapsLK 和 ESC 内容如下 // vim .xmodmap !! No Caps Lock clear lock !! Make Caps_lock an escape k ...
- uniapp 微信小程序 生成二维码
使用 tki-qrcode组件 生成二维码(https://www.npmjs.com/package/tki-qrcode) 1.引入 tki-qrcode 下载组件后引入 import tkiQr ...
- 利用ONT测序检测真核生物全基因组甲基化状态
摘要 甲基化在真核生物基因组序列中广泛存在,其中5mC最为普遍,在真核生物基因组中也有发现6mA.捕获基因组中的甲基化状态的常用技术是全基因组甲基化测序(WGBS)和简化甲基化测序(RRBS),而随着 ...
- promise的基本使用
// 什么情况下适用promise? // 一般情况下是有异步请求操作时,使用promise对这个异步操作进行封装 // new ->构造函数(1.保存了一些状态信息 2.执行传入的函数) // ...
- SpringBoot:Sqlite3+SpringBoot2.1.3+Mybatis-Puls整合项目
应公司要求完成sqlite3数据库的增改查小功能,特此记录一下. 1.建造项目 结构如下 因为是提供给前端调用所以做了接口. 2.Pom依赖文件 下面是这个项目所依赖的jar包. <parent ...
- 利用 FilesystemIterator 获取指定目录下的所有文件
/** * 获取指定目录下的所有文件 * @param null $path * @return array */ public function getFileByPath($path = null ...
- TransE 算法学习笔记
http://yaoleo.github.io/2017/10/27/TransE算法的理解/ tranE是在模型中嵌入知识图谱等三元组类的一个方法,就像是句子利用词典嵌入一样.
- windows服务器下MySQL配置字符集
这俩天公司使用.netcore微服务+mysql做项目,mysql在使用的时候总是出现一些字符集的问题,修改utf8或utf8mb4后mysql的服务就启动不了,这里做下记录如果把my.ini中的字符 ...