- 浏览: 852038 次
文章分类
- 全部博客 (365)
- java (124)
- spring mvc (21)
- spring (22)
- struts2 (6)
- jquery (27)
- javascript (24)
- mybatis/ibatis (8)
- hibernate (7)
- compass (11)
- lucene (26)
- flex (0)
- actionscript (0)
- webservice (8)
- rabbitMQ/Socket (15)
- jsp/freemaker (5)
- 数据库 (27)
- 应用服务器 (21)
- Hadoop (1)
- PowerDesigner (3)
- EJB (0)
- JPA (0)
- PHP (2)
- C# (0)
- .NET (0)
- html (2)
- xml (5)
- android (7)
- flume (1)
- zookeeper (0)
- 证书加密 (2)
- maven (1)
- redis (2)
- cas (11)
最新评论
-
zuxianghuang:
通过pom上传报错 Artifact upload faile ...
nexus上传了jar包.通过maven引用当前jar,不能取得jar的依赖 -
流年末年:
百度网盘的挂了吧???
SSO单点登录系列3:cas-server端配置认证方式实践(数据源+自定义java类认证) -
953434367:
UfgovDBUtil 是什么类
Java发HTTP POST请求(内容为xml格式) -
smilease:
帮大忙了,非常感谢
freemaker自动生成源代码 -
syd505:
十分感谢作者无私的分享,仔细阅读后很多地方得以解惑。
Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
.
处理参数
我们之前提过我们将会讨论如何编写一个带参数的的proceed()调用, 使得在Spring AOP和AspectJ中都能正常工作。解决方法是仅仅确保通知签名按顺序绑定方法参数。例如:
@Around("execution(List<Account> find*(..)) &&" + "com.xyz.myapp.SystemArchitecture.inDataAccessLayer() && " + "args(accountHolderNamePattern)") public Object preProcessQueryPattern(ProceedingJoinPoint pjp, Object accountHolderNamePattern) throws Throwable {; return pjp.proceed(new Object[] {
accountHolderNamePattern});
}
大多数情况下你都会这样绑定(就像上面的例子那样)。
通知顺序
如果有多个通知想要在同一连接点运行会发生什么?Spring AOP遵循跟AspectJ一样的优先规则来确定通知执行的顺序。 在“进入”连接点的情况下,最高优先级的通知会先执行(所以给定的两个前置通知中,优先级高的那个会先执行)。 在“退出”连接点的情况下,最高优先级的通知会最后执行。(所以给定的两个后置通知中, 优先级高的那个会第二个执行)。
当定义在不同的切面里的两个通知都需要在一个相同的连接点中运行, 那么除非你指定,否则执行的顺序是未知的。你可以通过指定优先级来控制执行顺序。 在标准的Spring方法中可以在切面类中实现org.springframework.core.Ordered
接口或者用Order
注解做到这一点。在两个切面中, Ordered.getValue()
方法返回值(或者注解值)较低的那个有更高的优先级。
当定义在相同的切面里的两个通知都需要在一个相同的连接点中运行, 执行的顺序是未知的(因为这里没有方法通过反射javac编译的类来获取声明顺序)。 考虑在每个切面类中按连接点压缩这些通知方法到一个通知方法,或者重构通知的片段到各自的切面类中 - 它能在切面级别进行排序。
引入(Introduction)
引入(在AspectJ中被称为inter-type声明)使得一个切面可以定义被通知对象实现给定的接口, 并且可以为那些对象提供具体的实现。
使用@DeclareParents
注解来定义引入。这个注解用来定义匹配的类型 拥有一个新的父类(所以有了这个名字)。比如,给定一个接口UsageTracked
, 和接口的具体实现DefaultUsageTracked
类, 接下来的切面声明了所有的service接口的实现都实现了UsageTracked
接口。 (比如为了通过JMX输出统计信息)。
@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(); } }
实现的接口通过被注解的字段类型来决定。@DeclareParents
注解的 value
属性是一个AspectJ的类型模式:- 任何匹配类型的bean都会实现 UsageTracked
接口。请注意,在上面的前置通知的例子中,service beans 可以直接用作UsageTracked
接口的实现。如果需要编程式的来访问一个bean, 你可以这样写:
UsageTracked usageTracked = (UsageTracked) context.getBean("myService");
切面实例化模型
默认情况下,在application context中每一个切面都会有一个实例。AspectJ把这个叫做单例化模型。 也可以用其他的生命周期来定义切面:Spring支持AspectJ的
perthis
和pertarget
实例化模型(现在还不支持percflow、percflowbelow
和pertypewithin
)。一个"perthis" 切面通过在
@Aspect
注解中指定perthis
子句来声明。让我们先来看一个例子,然后解释它是如何运作的:@Aspect("perthis(com.xyz.myapp.SystemArchitecture.businessService())") public class MyAspect { private int someState; @Before(com.xyz.myapp.SystemArchitecture.businessService()) public void recordServiceUsage() { // ... } }
这个
'perthis'
子句的效果是每个独立的service对象执行一个业务时都会 创建一个切面实例(切入点表达式所匹配的连接点上的每一个独立的对象都会绑定到'this'上)。 在service对象上第一次调用方法的时候,切面实例将被创建。切面在service对象失效的同时失效。 在切面实例被创建前,所有的通知都不会被执行,一旦切面对象创建完成, 定义的通知将会在匹配的连接点上执行,但是只有当service对象是和切面关联的才可以。 请参阅 AspectJ 编程指南了解更多关于per-clauses的信息。
'pertarget'
实例模型的跟“perthis”完全一样,只不过是为每个匹配于连接点
发表评论
-
Spring事务的传播行为和隔离级别
2015-01-23 09:15 599Spring事务的传播行为和隔离级别[transaction ... -
Spring3.2.8+Mybatis3.2.6+Maven 整合配置
2015-01-06 14:01 1439 -
采用AOP+log4j记录项目日志
2014-10-28 16:39 488关于AOP,我之前对AOP ... -
Spring Security3.1实践
2014-05-07 14:45 1009说明下: 本篇博客时间久远,数 ... -
SpringMVC3.0+MyIbatis3.0(分页示例)
2013-10-30 17:24 2221参考资料 1 ibatis2.x与mybatis ... -
网上的一篇spring security详解教程,觉得不错,转过来了
2013-07-30 22:16 1351先来谈一谈Acegi的基础知识,Acegi的架构比较复杂,但 ... -
Spring Security3配置使用
2013-07-30 16:48 3493使用Spring Security3的 ... -
SSH项目中加入spring security(二)--加入自定义数据表
2013-07-30 13:32 1024上一篇中基本的spring security已经加入到项 ... -
SSH项目中加入spring security(一)
2013-07-30 13:30 1570很久没有写过博客了,最近项目中 ... -
Spring定时任务的几种实现
2013-01-22 18:27 853近日项目开发中需要执行一些定时任务,比如需要在 ... -
spring security权限管理手册升级至spring security-3.1.3
2012-12-08 12:57 1962企业应用 费了半天劲,终于把原来基于spri ... -
在Spring、Hibernate中使用Ehcache缓存
2012-11-02 21:49 923前一篇http://www.blogjava.n ... -
不重复配置——利用Spring通用化配置
2012-10-17 09:40 977还记得 如下这种配置吗: 1、struts2作用域 ... -
Ehcache 整合Spring 使用页面、对象缓存
2012-10-16 09:44 786Ehcache在很多项目中都出现过,用法也比较简单。一般的 ... -
Spring Security3十五日研究
2012-09-12 10:22 1952前言 南朝《述 ... -
spring2.5 的 security 权限验证
2012-09-09 08:12 935package com.hd.security.se ... -
Spring MVC和Struts2的区别
2012-09-08 08:59 10371. 机制:spring mvc的入口是servlet,而st ... -
跟我学spring3.0 电子书
2012-08-30 13:13 1226好东西 收藏!学习! -
Spring Bean Scope 有状态的Bean 无状态的Bean
2012-08-30 08:58 2481在Spring的Bean配置中 ... -
Spring的初始化过程
2012-06-14 13:54 1203Spring 的几个接口 1.InitializingB ...
相关推荐
在Spring AOP中,切面由通知(Advice)和切点(Pointcut)定义。 2. **通知(Advice)**:通知是在特定连接点(Join Point)执行的代码,例如方法调用前、后或者异常发生时。Spring AOP支持五种类型的通知:前置...
Spring AOP中有五种不同类型的的通知(Advice): 1. 前置通知(Before Advice):在方法执行前执行,使用`@Before`注解。 2. 返回后通知(After Returning Advice):在方法正常返回后执行,使用`@AfterReturning`...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...
通过阅读`Test`类,你可以看到如何设置测试场景并触发AOP通知。 总结一下,Spring AOP提供了一种优雅的方式来处理系统的横切关注点,如日志记录、事务管理或性能监控。通过定义切点、创建切面和配置通知,我们可以...
现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...
在Spring AOP中,我们使用`@Before`注解来定义一个前置通知。这个注解需要与一个方法关联,该方法将在目标方法执行前被调用。例如: ```java @Aspect public class LoggingAspect { @Before("execution(* ...
在通知中,我们可以使用`JoinPoint`接口来获取方法的信息,包括方法名、参数等。通过`MethodSignature`,我们可以获取到方法的`Method`对象,从而可以通过反射获取方法的局部变量。 EL的使用需要`...
在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...
根据通知执行的时机不同,Spring AOP 支持多种类型的通知: - **前置通知 (Before Advice)**:在目标方法执行前触发。 - **后置通知 (After Returning Advice)**:在目标方法成功返回后触发。 - **最终通知 ...
3. **灵活的通知模型**:Spring AOP提供了多种类型的通知,包括around、before、after returning、after throwing等,使得开发者可以根据实际需求选择最适合的通知类型。 4. **丰富的切入点表达式语言**:Spring ...
在Spring AOP中,我们无需深入到每个方法的实现细节,而是可以定义“切面”,在合适的时机(如方法调用前、后、异常发生时等)执行特定的逻辑。这样,业务代码和关注点(如日志、事务管理等)得以分离,提高了代码的...
- 如果目标对象没有实现任何接口,Spring会使用CGLIB库创建一个目标对象的子类,并在子类中插入通知代码。 - CGLIB是通过字节码生成技术动态创建子类,因此无需目标对象实现接口。 ### 3. 自定义类加载器 在某些...
在`springAop1`这个压缩包中,可能包含了一个简单的应用示例,展示了如何定义一个切面类,以及如何在该类中定义通知方法。例如,我们可能会看到一个名为`LoggingAspect`的类,其中包含了`@Before`注解的方法,用于在...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理等。在Java应用中,AOP通过代理模式实现了切面编程,使得我们可以将业务逻辑...
**Spring AOP XML方式配置通知** 在Java世界中,Spring框架是广泛应用的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。AOP允许开发者定义“方面”,这些方面可以封装关注点,如日志、事务...
在提供的 `lib` 压缩包中,应包含 Spring AOP 和 Spring IOC 相关的 jar 包,如 `spring-aop-x.x.x.jar` 和 `spring-context-x.x.x.jar` 等,它们是使用这两个功能的基础。请确保引入正确的版本,并正确配置到项目的...
在Spring AOP中,切面由两个主要部分组成:通知(advice)和切点(pointcut)。 2. **通知(Advice)**:通知是在特定的连接点(join point)执行的代码,它可以是前置通知(before advice)、后置通知(after ...
在给出的XML配置中,`<aop:config>`元素开启AOP支持,而`<aop:aspect>`元素用于定义切面,其内部通过`<aop:pointcut>`定义切点,并通过`<aop:before>`和`<aop:after>`指定通知。 为了使用这些配置,我们需要在代码...
Spring框架中的AOP模块使用了动态代理来实现AOP概念。Spring AOP允许开发者定义切面,并在这些切面中指定拦截的方法。Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,...
Spring AOP和其他AOP框架(如AspectJ)都实现了这些接口,以实现方法拦截和通知机制。 2. aspectjweaver-1.7.0.jar:这是AspectJ的织入器,负责在运行时动态地将切面(aspect)织入到目标类中。AspectJ提供了一种...