- 浏览: 328195 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (224)
- Java (34)
- Test (3)
- Linux/Unix (32)
- Windows (8)
- Oracle (78)
- Oracle Backup & Recovery (3)
- SqlServer (1)
- Database (3)
- Open Source (2)
- Server Management (1)
- Apache ActiveMQ (1)
- IBM WebSphere MQ (7)
- IBM WAS (15)
- 其它 (11)
- UML (1)
- Tools (1)
- Reference (0)
- Spring (11)
- Hibernate (5)
- VBScript (3)
- Network (1)
- Securities (2)
- Maven (6)
- logging (2)
- Web (1)
- AWS (3)
最新评论
概述
Spring 2.0引入了一个简单而强大的机制,使用基于模式和@AspectJ注记样式实现自定义方面。Spring当前仅支持方法执行连接点而不支持字段拦截。Spring AOP框架的目标并不是实现完整的AOP实现,主要目的是帮助IOC容器解决一些企业应用的常见问题。Spring AOP框架通常需要和Spring IOC容器一起使用,方面使用通常的Bean定义语法。如果需要一个全面的AOP解决方案,AspectJ是更好的选择。Spring AOP框架是基于代理的,Spring缺省使用JDK的动态代理,JDK代理可以代理任何接口。而CGLIB代理主要用来代理类,如果一个Bean没有实现一个接口,Spring将使用CGLIB进行代理。
基本概念
Aspect……横切多个对象的关注点。事务管理是J2EE应用的一个横切关注点的极好事例。
Join Point……程序执行中的一个点,例如一个方法的执行或者异常处理,Spring中连接点总是指方法执行。
Advice……方面在一个特定的连接点执行的动作,许多AOP框架,包括Spring都将advice模型为一个拦截器,基于一个连接点维持一个拦截器堆栈。
Pointcut……用来匹配连接点的语法。Advice和一个Pointcut关联,并且运行在Pointcut匹配的连接点处(比如具有指定名称的方法)。Spring使用AspectJ的Pointcut语法。
Introduction……针对某个类型声明额外的方法和字段,Spring AOP允许针对任何代理的对象引入新的接口。比如可以使用introduction让一个Bean实例实现IsModified接口。
Target Object……被方面拦截的对象,Spring AOP使用运行时代理实现方面拦截机制,因此这些对象都是代理对象。
Aop Proxy……AOP框架为了实现方面规约而创建的代理对象。Spring框架中,AOP代理是一个JDK动态代理或者CGLIB代理。
Weave……将方面和其他对象类型进行关联创建Advice的方式,织入可以在编译时,加载时或运行时进行,Spring AOP使用运行时织入的方式。
Advice类型
Before Advice……连接点之前执行,除非抛出异常将无法阻止执行连接点。
After Return Advice……在连接点正常返回后执行。
After throwing advice……连接点抛出异常后执行。
After (finally) advice……不管连接点正常退出还是抛出异常都会执行。
Around advice……在连接点之前和之后执行,可以在方法执行前后添加自定义逻辑,可以终止连接点的继续执行,返回值或抛出异常。
@AspectJ支持
启用AspectJ
启用@AspectJ方面时,如果Spring检测到一个实例需要被一个或多个代理拦截,Spring将自动为这个实例生成一个代理,拦截方法执行,启用AspectJ需要添加如下配置:
- <aop:aspectj-autoproxy/>
声明方面
AspectJ对方面的支持是使用Annotation实现的,Spring将自动检测使用过@Aspect注记的Bean实例,配置AOP代理。AspectJ的方面就是一个使用了@Aspect注记的类,和普通类一样,可以包含方法,字段,另外也可以包含pointcut,advice,introduction等。
声明Pointcut
Pointcut用来决定哪些方法需要应用方面,其声明包括两部分,一部分是返回值为void的方法签名,一部分是@Pointcut注记,@Pointcut注记的语法可以参见AspectJ参考指南。下面的示例定义了名称为anyOldTransfer的Pointcut,匹配任何方法名称为transfer:
- @Pointcut("execution(* transfer(..))")// the pointcut expression
- private void anyOldTransfer() {}// the pointcut signature
Spring的Pointcut支持如下形式的限定方式:
Within…..限制在指定的类型范围。
This……限制匹配的连接点所在的Bean实例的Spring AOP代理是指定的类型。
Target……限制匹配的连接点所在的Bean实例是指定的类型。
Args……限制匹配的连接点的参数是指定类型的实例。
@target……限制连接点所在的类有一个指定类型的注记。
@args……限制传递给连接点的参数的运行期类型有指定类型的注记。
@within……限制连接点在有特定注记的类型范围。
@annotation……限制连接点所在的Bean实例的Spring AOP代理有指定的注记。
Pointcut表达式可以使用&&,||,!进行组合,也可以使用名称引用pointcut表达式,使用名称引用时,适用通常的java可见性规则,下面是几个示例:
- @Pointcut("execution(public * *(..))")
- private void anyPublicOperation() {}
- @Pointcut("within(com.xyz.someapp.trading..*")
- private void inTrading() {}
- @Pointcut("anyPublicOperation() && inTrading()")
- private void tradingOperation() {}
声明Advice
Advice和一个Pointcut表达式关联,运行在Pointcut表达式匹配的方法执行前后。
针对几种不同类型的Advice,使用不同的注记来声明,比如使用@Before标记声明before advice。
任何Advice方法可以声明一个org.aspectj.lang.JoinPoint 类型的参数,从而获取拦截方法的信息。
可以在声明Advice时,将拦截方法的参数传递进来,下面的示例想拦截第一个参数为Account的方法,而且可以在advice方法内访问account对象。
- @Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation() &&" +
- "args(account,..)")
- public void validateAccount(Account account) {
- // ...
- }
代理对象,目标对象和注记也可以相同的方式访问,下面的示例拦截使用@Auditable
的方法,而且可以在advice方法内访问auditable对象。
- @Before("com.xyz.lib.Pointcuts.anyPublicMethod() && " +
- "@annotation(auditable)")
- public void audit(Auditable auditable) {
- AuditCode code = auditable.value();
- // ...
- }
Introduction
Introduction使用@DeclareParents注记声明,这个注记用来声明匹配pointcut的类将实现一个新的接口。下面的示例声明所有的服务接口将实现UsageTracked接口:
- @Aspect
- public class UsageTracking {
- @DeclareParents(value="com.xzy.myapp.service.*+",
- defaultImpl=DefaultUsageTracked.class)
- public static UsageTracked mixin;
- @Before("com.xyz.myapp.SystemArchitecture.businessService() &&" +
- "this(usageTracked)")
- public void recordUsage(UsageTracked usageTracked) {
- usageTracked.incrementUseCount();
- }
- }
Aspect实例模型
缺省情况应用上下文中每个方面只有一个单独的实例,Spring支持perthis和pertarget模型。
基于模式的AOP
如果不能使用JDK5,可以使用基于XML格式的配置,Spring通过使用aop标记提供对方面定义的支持。在Spring配置中,所有的方面和advisor元素都必须放在一个元素内。
在基于模式的AOP中,Spring仅支持单例模型。要使用AOP标记,必须在配置文件中引入相应的XSD文件如下:
- xsi:schemaLocation=" http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
声明方面
使用模式支持,一个方面只是Spring应用上下文中的一个Bean实例,状态和行为由这个Bean实例捕获,切入点和advice信息用XML描述。示例如下:
- <aop:config>
- <aop:aspect
- ...
- aop:aspect>
- aop:config>
- <bean id="
- ...
- bean>
声明Pointcut
Pointcut可以直接声明在方面内部,也可以直接声明在元素内,可以供多个方面使用。
- <aop:config>
- <aop:pointcut id="businessService"
- Aspect Oriented Programming with Spring
- Spring Framework (2.0.2) 118
- expression="execution(* com.xyz.myapp.service.*.*(..))"/>
- aop:config>
声明advice
下面的示例声明一个before类型的advice
- <aop:aspect id="beforeExample" ref="aBean">
- <aop:before
- pointcut-ref="dataAccessOperation"
- method="doAccessCheck"/>
- ...
- aop:aspect>
声明introduction
下面的示例声明一个introduction
- <aop:aspect id="usageTrackerAspect" ref="usageTracking">
- <aop:declare-parents
- types-matching="com.xzy.myapp.service.*+",
- implement-interface="UsageTracked"
- default-impl="com.xyz.myapp.service.tracking.DefaultUsageTracked"/>
- <aop:before
- pointcut="com.xyz.myapp.SystemArchitecture.businessService()
- and this(usageTracked)"
- method="recordUsage"/>
- aop:aspect>
Advisor
Advisor是Spring特有的概念,其实就是Pointcut和Advice的容器。
@AspectJ/XML
基于Schema的AOP定义比较清晰明了,而且很容易通过配置文件修改,也有两个缺点:
Schema方式中关于方面的信息由分布在XML文件和Bean实例中,而@Aspectj方式,所有关于方面的信息都集中在一个模块的所有Bean实例中。
Schema方式仅支持方面的单例模型,@Aspectj方式支持组合命名的Pointcut。
代理机制
Spring AOP缺省使用JDK的动态代理机制,只能针对接口代理,如果需要针对类代理,可以使用CGLIB代理,要在AOP中强制使用CGLIB代理,可以设置proxy-target-class属性如下:
- <aop:config proxy-target-class="true">
- <!-- other beans defined here... -->
- aop:config>
使用CGLIB代理的一个问题是final方法不能被代理,因为final方法不能重写。
Spring框架使用代理机制,会导致调用自身方法的方法不能被代理,下面这种情况下,foo方法就不能被代理。
发表评论
-
Set proxy with account/password for CloseableHttpClient
2018-07-04 22:32 573package com.hsbc.wealth.srbp; ... -
一篇文章全面解析大数据批处理框架Spring Batch
2017-12-18 23:47 585一篇文章全面解析大数据批处理框架Spring Bat ... -
HTTPS setup & keyManagers trustManagers
2017-08-03 01:24 523https://jingyan.baidu.com/arti ... -
Base64Encoder & Base64Decoder
2017-03-16 23:29 695import java.io.UnsupportedEnco ... -
Spring 三种 import 方式
2016-10-15 18:25 722Spring 三种 import 方式: <i ... -
Spring transaction manager example
2015-09-19 14:25 634ApplicationContext.xml < ... -
java.lang.ClassCastException: $Proxy8 incompatible with lin.dao.impl.ExchangeDao
2015-09-19 14:01 1216Spring transaction practice, ... -
Eclipse: Resolve Workspace projects
2015-09-01 22:21 1705When Import Maven project: & ... -
Junit4 Sample
2014-11-13 00:15 679package com.lin.MavenTest; ... -
Junit3 Sample
2014-11-12 23:22 686package com.lin.MavenTest; ... -
Spring related
2014-10-29 10:27 5301. 使用 Spring 自身的传统 API 方式 前置通 ... -
《Spring In action》学习笔记——AOP(面向切面编程)
2014-10-25 11:09 9151.AOP术语 通知(Advice): 切面的功能被称 ... -
Suspend validation
2014-10-20 20:46 896Build workspace 的时候,出现如下错误。 ... -
Spring head
2014-09-04 18:28 602<?xml version="1.0&quo ... -
Joda-Time
2014-09-04 16:59 776http://www.joda.org/joda-time/ ... -
J2EE的13种核心技术规范
2014-07-02 10:44 681J2EE主要用于创建可扩展的企业应用,包括13种核心技术规范 ... -
Quartz任务调度快速入门
2014-06-26 14:41 593概述 了解Quartz体系结构 Quart ... -
Spring 笔记
2014-06-25 20:43 5191. BeanFactory BeanFactor ... -
SpringBatch的领域概念
2014-06-25 11:58 1524谈到Spring Batch,会谈到很多的领域概念,Job ... -
EJB2.0 ejb-jar.xml配置文件详解
2014-05-07 18:24 1382<ejb-jar><!--EJB发布描述器 ...
相关推荐
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
droop(非线性负载),基于T型三电平逆变器的非线性负载下同步发电机控制,中点电位平衡控制,电压电流双闭环控制,基波提取算法。 1.droop,非线性负载 2.电压电流双闭环,基波提取算法 3.提供相关参考文献 支持simulink2022以下版本,联系跟我说什么版本,我给转成你需要的版本(默认发2016b)。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
人工智能大赛参赛获奖项目-基于Yolov5的电动车头盔佩戴识别系统(含源码+全部资料).zip 【资源说明】 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 6、欢迎下载,沟通交流,互相学习,共同进步!
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
比赛获奖项目-基于深度学习的管道巡检机器狗目标检测及语义分割部分-(含全部资料).zip 【资源说明】 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 6、欢迎下载,沟通交流,互相学习,共同进步!
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
课设项目基于Java+Springboot+Vue的个人理财规划管理系统(含源码与数据库+报告文档).zip 【资源说明】 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 6、欢迎下载,沟通交流,互相学习,共同进步!
毕设-PHP学生成绩查询(源代码+lw)18.zip
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
比赛优秀作品-基于人工智能技术的视障人士友好资讯辅助软件-(含全部参赛源码及资料).zip 【资源说明】 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 6、欢迎下载,沟通交流,互相学习,共同进步!
毕设-PHP-[整站程序]校内网代码站_xndm37.zip
多轴车辆动力学问题求解,多轴车辆动力学模型,simulink建模。 二自由度车辆模型,三自由度车辆模型。
20241215_190241.jpg
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;