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 ...
随机推荐
- 「10.14」小P的2048(模拟)·小P的单调数列(性质,DP)·小P的生成树(乱搞)
A. 小P的2048 模拟.....又没啥可说的,以后要认真打打模拟题了... B. 小P的单调数列 考场$n^2log(n)$的SB思路有人听吗 正解当然不是这样, 事实上我们每次选取的只有一段区间 ...
- 【模拟7.29】大佬(概率期望DP)
首先根据数据范围,可以判断基本上是n^2的复杂度 通过分析我们发现每一次都可以从m个数中任意选,既然任意选,那么此时的概率的分母就是不变的,然而题中涉及的是某一段的最大值,所以我们按套路假设 f[i] ...
- 支持向量机(SVM)之硬阈值
支持向量机 ( support vector machine, SVM ) 是使用超平面来对给定的 p 维向量进行分类的非概率二元线性分类器. 一.超平面 ( hyperplane ) 在一个p维的输 ...
- js(if else)分数等级查询
<!DOCTYPE html><html><head><meta charset="utf-8"><title>文档标题 ...
- 【LeetCode每日一题 Day 1】1. 两数之和
大家好,我是编程熊,今天是LeetCode每日一题的第一天,今天的你比昨天更加优秀啦! 题意 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target ...
- 15、修改sqldeveloper的JDK路径
15.1.说明: 1.第一次使用Oracle SQL Developer时会提示选择JDK路径(只会在第一次使用时提示), 如果选择了高版本的JDK(1.8)路径,可能会出现了如下两种情况: (1)s ...
- POJ 1279 Art Gallery 半平面交 多边形的核
题意:求多边形的核的面积 套模板即可 #include <iostream> #include <cstdio> #include <cmath> #define ...
- kmp算法 汇总
来源:http://blog.csdn.net/qq_34494458/article/details/75253466 KMP算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,其 ...
- CRM软件从哪些方面帮助企业更上一层楼
CRM顾客智能管理系统可以将"以顾客为管理中心"的管理模式与高新科技方式紧密结合,协助公司搭建优良的客户关系管理,改进顾客的消費感受,进而提升顾客的满意率,为公司产生大量的盈利.据 ...
- CentOS-Docker搭建Nextcloud
下载镜像 $ docker pull nextcloud 运行镜像 $ docker run -d --restart=unless-stopped --name nextcloud -v /home ...