面向切面的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. CF 1051F

    题意:给定一张n个点,m条边的无向联通图,其中m-n<=20,共q次询问,每次询问求给定两点u,v间的最短路长度 第一眼看见这题的时候,以为有什么神奇的全图最短路算法,满心欢喜的去翻了题解,发现 ...

  2. String 类的实现(2)引用计数与写时拷贝

    1.引用计数 我们知道在C++中动态开辟空间时是用字符new和delete的.其中使用new test[N]方式开辟空间时实际上是开辟了(N*sizeof(test)+4)字节的空间.如图示其中保存N ...

  3. httpstatus类的状态有哪些

    HTTP Status Code 常见的状态码: HTTP: Status 200 – 服务器成功返回网页HTTP: Status 404 – 请求的网页不存在HTTP: Status 503 – 服 ...

  4. 20165323 学习基础和C语言基础调查

    20165323 学习基础和C语言基础调查 一.技能学习心得 1.你有什么技能比大多人更好? 我觉得我羽毛球打的还行,不能说打得比大多数人好,但是对于一些打羽毛球的要领还是掌握的. 2.针对这个技能的 ...

  5. C/C++遍历二维数组,列优先(column-major)比行优先(row-major)慢,why?

    C/C++遍历二维数组,列优先(column-major)比行优先(row-major)慢,why? 简单粗暴的答案:存在Cache机制! 稍微啰嗦一点:CPU访问内存(读/写,遍历数组的话主要是读) ...

  6. C#正则Groups高级使用方法

    正则表达式号称开发者得瑞士军刀,使用好正则表达式尤其重要. 拆分多个正则: public static string[] SplitByManyRegex(string text, string[] ...

  7. python的学习和使用

    1.python的官网:https://www.python.org/ Python简介: .Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. .Python 的设计具有 ...

  8. CentOS安装CAS 5.3.4服务端

    1.安装jdk1.8 https://www.cnblogs.com/kgdxpr/p/6824093.html 2.安装tomcat8 3.安装maven https://www.cnblogs.c ...

  9. Delphi Setlength 内存释放总结

    https://blog.csdn.net/lotusyangjun/article/details/8203521 一.在Setlength 被调用次数不多时,可直接使用以下代码进行释放var aa ...

  10. 标准C语言实现基于TCP/IP协议的文件传输

    TCP/IP编程实现远程文件传输在LUNIX中一般都采用套接字(socket)系统调用. 采用客户/服务器模式,其程序编写步骤如下:  1.Socket系统调用  为了进行网络I/O,服务器和客户机两 ...