面向切面的Spring

一、面向切面的概念

在软件开发中,散布于应用多处的功能被称为横切关注点(cross-cutting concern)。

通常来讲这些横切关注带点从概念上来讲是与应用逻辑相分离的(但是往往会直接嵌入到应用的业务逻辑中)。

把这些横切关注点与业务逻辑相互分离正是面向切面编程(AOP)所要解决的问题。

切面所适用的场景:日志、声明式事务、安全和缓存。

横切关注点可以被模块化特殊的类,这些类被称为切面。

1.相关术语

1)通知(advice):描述了切面的工作及如何工作。通知的类型:

前置通知(Before)

后置通知(After)

返回通知(After-returning)

异常通知(After-throwing)

环绕通知(方法调用前后都执行)

2)连接点(join-point):应用执行时可以插入的一个点,如方法调用时,异常抛出时。

3)切点(cut-point):切点的定义会匹配通知所要植入的一个或者多个链接点。

4)切面(Aspect):切面是通知和切点的结合,通知和切点共同定义切面的全部内容----

它是什么及何时何地完成其内容。

5)引入(Introduction):

6)织入(Weaving):把切面应用到目标对象,并创建新的代理的过程。

2.Spring对AOP的支持

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

1.基于代理的经典SpingAOP

2.纯POJO切面

3.@AspectJ注解驱动的切面

4.注入式AspectJ切面

前三个都是Spring AOP实现的变体,Spring AOP构建在动态代理的基础上,

因此,Spring对AOP的支持仅仅限于方法层面。

1.示例使用JavaConfig: 

public interface Performance {
void performance();
}
public class Actor implements Performance{
public void performance() {
System.out.println("An actor is on the stage!!!~!!");
}
}
@Aspect
public class Audience {
//定义命名的切点
@Pointcut("execution(* entity.Actor.performance(..))")
public void performance() {} @Before("performance()")
public void silence() {
System.out.println("Silence please!");
} @Before("performance()")
public void takeSeats() {
System.out.println("Take seats please!");
} @AfterReturning("performance()")
public void performanceOver() {
System.out.println("Performance Over!");
} @AfterThrowing("performance()")
public void wrong() {
System.out.println("Something wrong with the show!");
} /*
* 在一个通知方法中同时编写前置和后置通知
* */
@Around("performance()")
public void around(ProceedingJoinPoint pjp) {
System.out.println("Around!! before");
try {
pjp.proceed(); //必须调用该方法,如果不调用会阻塞除了
// AfterReturning以外的其他方法
System.out.println("Around!! after");
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Aconfig.class)
public class TestAll {
@Autowired
private Performance actor;
@Test
public void ts() {
actor.performance();
/*Around!! before
Silence please!
Take seats please!
An actor is on the stage!!!~!!
Around!! after
Performance Over!*/
}
}
@Configuration
@EnableAspectJAutoProxy //启用自动代理功能
public class Aconfig {
@Bean
public Audience audience() {
return new Audience();
} @Bean
public Performance actor() {
return new Actor();
}
}

2.示例通过XML:

@Aspect
public class Audience {
public void silence() {
System.out.println("Silence please!");
}
public void takeSeats() {
System.out.println("Take seats please!");
}
public void performanceOver() {
System.out.println("Performance Over!");
}
public void wrong() {
System.out.println("Something wrong with the show!");
}
/*
* 在一个通知方法中同时编写前置和后置通知
* */
public void around(ProceedingJoinPoint pjp) {
System.out.println("Around!! before");
try {
pjp.proceed(); //必须调用该方法,如果不调用会阻塞除了
// AfterReturning以外的其他方法
System.out.println("Around!! after");
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--目标对象-->
<bean id="actor" class="entity.Actor" />
<!--切面对象-->
<bean id="audience" class="entity.Audience"/>
<!--切面-->
<aop:config>
<!--定义命名的切点-->
<aop:pointcut expression="execution(* entity.Actor.performance(..))" id="cutRef"/>
<aop:aspect ref="audience">
<aop:before method="silence" pointcut-ref="cutRef"/>
<aop:before method="takeSeats" pointcut-ref="cutRef"/>
<aop:after-returning method="performanceOver" pointcut-ref="cutRef"/>
<aop:after-throwing method="wrong" pointcut-ref="cutRef"/>
<aop:around method="around" pointcut-ref="cutRef"/>
</aop:aspect>
</aop:config>
<aop:aspectj-autoproxy/><!--启用自动代理-->
</beans>
@Autowired
private Performance actor;
@Test
public void ts() {
actor.performance();
/*Silence please!
Take seats please!
Around!! before
An actor is on the stage!!!~!!
Around!! after
Performance Over!*/
}

3.处理通知中的参数 

Spring使用笔记(四) 面向切面的Spring的更多相关文章

  1. Spring学习(四)--面向切面的Spring

    一.Spring--面向切面 在软件开发中,散布于应用中多处的功能被称为横切关注点(cross- cutting concern).通常来讲,这些横切关注点从概念上是与应用的业 务逻辑相分离的(但是往 ...

  2. Spring系列(四) 面向切面的Spring

    除了IOC外, AOP是Spring的另一个核心. Spring利用AOP解决应用横切关注点(cross-cutting concern)与业务逻辑的分离, 目的是解耦合. 横切关注点是指散布于代码多 ...

  3. Spring实战第四章学习笔记————面向切面的Spring

    Spring实战第四章学习笔记----面向切面的Spring 什么是面向切面的编程 我们把影响应用多处的功能描述为横切关注点.比如安全就是一个横切关注点,应用中许多方法都会涉及安全规则.而切面可以帮我 ...

  4. 第04章-面向切面的Spring

    1. 什么是面向切面编程 AOP是什么 切面帮助我们模块化横切关注点. 横切关注点可被描述为影响应用[多处的]功能.如安全,应用许多方法会涉及安全规则. 继承与委托是最常见的实现重用 通用功能 的面向 ...

  5. 五、面向切面的spring(1)

    spring的依赖注入看完了,接下来是spring中与DI一并重要的AOP了,开始吧,GO. 在软件开发中,散布于应用中多处的功能被称为横切发关注点,通常来讲,这些横切关注点从概念上市与应用的业务逻辑 ...

  6. 面向切面的Spring

    在软件开发中,发布于应用中多处的功能被称为横切关注点.通常,这些横切关注点从概念上是与应用的业务逻辑相分离的(但往往直接嵌入到应用的业务逻辑之中).将横切关注点与业务逻辑相分离是AOP所要解决的. 一 ...

  7. Spring AOP 面向切面的Spring

    定义AOP术语 描述切面的常用术语有: 通知 (advice) 切点 (pointcut) 连接点 (joinpoint) 下图展示了这些概念是如何关联的 Spring 对AOP的支持 Spring提 ...

  8. Spring学习笔记(三):面向切面的Spring

    Spring之面向切面编程 一.理解何为面向切面编程 对于这个的理解,我觉得Spring实战中的例子讲得很明白: 假设我现在是一个小区用户,每个月小区都要收电费,这时候就会来人查看电表,算出来这个月电 ...

  9. 2015年12月13日 spring初级知识讲解(四)面向切面的Spring

    2015年12月13日 具体内容待补充...

随机推荐

  1. Java+selenium之WebDriver定位页面元素(二)

    Selenium-Webdriver 提供了强大的元素定位方法,支持以下三种方法: 单个对象的定位方法,多个对象的定位方法和层级定位 1. 定位单个元素 // 对于元素的属性包含 id 的情况适用,推 ...

  2. echo的运行

    例子:编译.链接examples中的echo. 编译: g++ -c -I ~/build/release-install-cpp11/include echo.cc -std=c++11 g++ - ...

  3. 腾讯应用宝Android 应用加固(乐固)操作说明(转)

    此处引用腾讯云对加固的优点说明如下: 为什么应用需要加固? 若应用不做任何安全防护,极易被病毒植入.广告替换.支付渠道篡改.钓鱼.信息劫持等,严重侵害开发者的利益. 应用进行安全防护,防止应用分发后, ...

  4. Multi-Fiber Networks for Video Recognition (MFNet)

    Motivation:减少时空网络的计算量,保持视频分类精度的基础上,使速度尽可能接近对应网络的2D版本. 为此提出 Multi-Fiber 网络,将复杂网络拆分成轻量网络的集成,利用 fibers ...

  5. angular 2+ 变化检测系列一(基础概念)

    什么是变化检测? 变化检测的基本功能就是获取应用程序的内部状态(state),并且是将这种状态对用户界面保持可见.状态可以是javascript中的任何的数据结构,比如对象,数组,(数字,布尔,字符串 ...

  6. mysql binary

    mysql在比较字符串的时候是忽略大些写的 比如有用户叫ABC和abc select * from `sys_user` where username = 'abc' 会出来两条记录 select * ...

  7. python之https爬虫出现 SSL: CERTIFICATE_VERIFY_FAILED (同时打开fiddler就会出现)

    1.参考 Py 坑之 CERTIFICATE_VERIFY_FAILED Python 升级到 2.7.9 之后引入了一个新特性,当你urllib.urlopen一个 https 的时候,会验证一次 ...

  8. grails2.3.3发布了-【grails】

    grails2.3.3发布了,在grails2.3.2中默认方式fork模式下无法运行的BUG也解决了. 需要做的相关修改为修改BuildConfig.groovy: build ':tomcat:7 ...

  9. Kudu的集群安装(1.6.0-cdh5.14.0)

    kudu的架构体系 下图显示了一个具有三个 master 和多个 tablet server 的 Kudu 集群,每个服务器都支持多个 tablet.它说明了如何使用 Raft 共识来允许 maste ...

  10. js,JQuery实现,带筛选,搜索的select

    代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title& ...