- 浏览: 1436913 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (409)
- Java (48)
- Spring (29)
- struts2 (17)
- hibernate (4)
- 设计模式 (24)
- jbpm (1)
- JavaScript (5)
- 统计报表 (7)
- ExtJS_3.0 (35)
- struts1 (1)
- 分析设计 (3)
- Flex3 (24)
- UML (2)
- 数据库 (18)
- PowerDesigner (2)
- 应用服务器 (3)
- WebService (5)
- ActiveMQ_5.3.2 (6)
- Java通信技术 (11)
- GWT (6)
- OSGi (15)
- android (11)
- liferay6.0.6 (13)
- jquery (13)
- Linux (3)
- java.util.concurrent (16)
- guava (9)
- 开发模式 (1)
- 大数据 (2)
- 互联网金融 (4)
- treegrid-3.0 (7)
- 分布式 (8)
- GO语言 (4)
- maven (1)
- 缓存技术 (6)
- 其他 (2)
- 前端页面 (1)
- heasy (1)
- spring cloud(F版) (21)
- springboot (12)
- springmvc (5)
- mybatis (3)
- dubbo (1)
- 物联网 (0)
最新评论
-
raymond.chen:
谢谢您的分享
使用Ngrok解决通过外网访问内网web应用 -
wangyudong:
速度有点慢,不过在也找到了一个开源的holer,配置一个key ...
使用Ngrok解决通过外网访问内网web应用 -
a1006458222:
...
Axis2的部署和应用 -
偷师来了:
不好意思 这样的博客我觉得就灭有必要分享出来了 命令大家都会看 ...
Consul框架介绍 -
lliiqiang:
怎么直接删除文件夹啊?固定的几个文件可以删除,不固定的呢?需要 ...
Flex AIR —— 文件读写
要启用基于@AspectJ风格的切面声明,需要进行以下的配置:
<!-- 启用@AspectJ风格的切面声明 --> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 通过注解定义bean。默认同时也通过注解自动注入 --> <context:component-scan base-package="com.cjm"/>
基于@AspectJ风格的切面声明的源码:
/** * 声明本类为一个切面 */ @Component @Aspect public class MyAspectJ { /** * 声明一个切入点(包括切入点表达式和切入点签名) */ @Pointcut("execution(* com.cjm.model..*.*(..))") public void pointcut1(){} /** * 声明一个前置通知 */ @Before("pointcut1()") public void beforeAdvide(JoinPoint point){ System.out.println("触发了前置通知!"); } /** * 声明一个后置通知 */ @After("pointcut1()") public void afterAdvie(JoinPoint point){ System.out.println("触发了后置通知,抛出异常也会被触发!"); } /** * 声明一个返回后通知 */ @AfterReturning(pointcut="pointcut1()", returning="ret") public void afterReturningAdvice(JoinPoint point, Object ret){ System.out.println("触发了返回后通知,抛出异常时不被触发,返回值为:" + ret); } /** * 声明一个异常通知 */ @AfterThrowing(pointcut="pointcut1()", throwing="throwing") public void afterThrowsAdvice(JoinPoint point, RuntimeException throwing){ System.out.println("触发了异常通知,抛出了RuntimeException异常!"); } /** * 声明一个环绕通知 */ @Around("pointcut1()") public Object aroundAdvice(ProceedingJoinPoint point)throws Throwable{ System.out.println("触发了环绕通知 开始"); Object o = point.proceed(); System.out.println("触发了环绕通知 结束"); return o; } }
1、切入点表达式的格式:execution([可见性] 返回类型 [声明类型].方法名(参数) [异常])
2、切入点表达式通配符:
*:匹配所有字符
..:一般用于匹配多个包,多个参数
+:表示类及其子类
3、切入点表达式支持逻辑运算符:&&、||、!
4、切入点表达式关键词:
1)execution:用于匹配子表达式。
//匹配com.cjm.model包及其子包中所有类中的所有方法,返回类型任意,方法参数任意
@Pointcut("execution(* com.cjm.model..*.*(..))")
public void before(){}
2)within:用于匹配连接点所在的Java类或者包。
//匹配Person类中的所有方法
@Pointcut("within(com.cjm.model.Person)")
public void before(){}
//匹配com.cjm包及其子包中所有类中的所有方法
@Pointcut("within(com.cjm..*)")
public void before(){}
3) this:用于向通知方法中传入代理对象的引用。
@Before("before() && this(proxy)")
public void beforeAdvide(JoinPoint point, Object proxy){
//处理逻辑
}
4)target:用于向通知方法中传入目标对象的引用。
@Before("before() && target(target)
public void beforeAdvide(JoinPoint point, Object proxy){
//处理逻辑
}
5)args:用于将参数传入到通知方法中。
@Before("before() && args(age,username)")
public void beforeAdvide(JoinPoint point, int age, String username){
//处理逻辑
}
6)@within:用于匹配在类一级使用了参数确定的注解的类,其所有方法都将被匹配。
@Pointcut("@within(com.cjm.annotation.AdviceAnnotation)") - 所有被@AdviceAnnotation标注的类都将匹配
public void before(){}
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) @Documented @Inherited public @interface AdviceAnnotation { }
7)@target:和@within的功能类似,但必须要指定注解接口的保留策略为RUNTIME。
@Pointcut("@target(com.cjm.annotation.AdviceAnnotation)")
public void before(){}
8)@args:传入连接点的对象对应的Java类必须被@args指定的Annotation注解标注。
@Before("@args(com.cjm.annotation.AdviceAnnotation)")
public void beforeAdvide(JoinPoint point){
//处理逻辑
}
public class Person { public void say(Address address){ //处理逻辑 } } @AdviceAnnotation public class Address { }
如果需要在Person类的say方法被调用时触发beforeAdvide通知,那么say方法的参数对应的Java类型Address类必须要被@AdviceAnnotation标注。
9)@annotation:匹配连接点被它参数指定的Annotation注解的方法。也就是说,所有被指定注解标注的方法都将匹配。
@Pointcut("@annotation(com.cjm.annotation.AdviceAnnotation)")
public void before(){}
public class Person { @AdviceAnnotation public void say(Address address){ //处理逻辑 } }
Person类的say方法被@AdviceAnnotation标注,所以它匹配。
10)bean:通过受管Bean的名字来限定连接点所在的Bean。该关键词是Spring2.5新增的。
@Pointcut("bean(person)")
public void before(){}
id为person的受管Bean中的所有方法都将匹配。
发表评论
-
自定义Spring命名空间
2019-02-19 20:12 5111、定义schema约束xsd文件 将xsd ... -
Spring表达式语言
2019-02-19 17:17 691Spring表达式语言(Spring Expression ... -
Spring AOP使用整理:常用的Pointcut和PointcutAdvisor
2019-02-17 23:07 2466Spring常用的PointcutAdviso ... -
Spring的拦截器
2019-02-17 16:11 2113Spring的拦截器主要分两种,一个是HandlerInt ... -
Spring的动态代理
2019-02-17 15:23 1011AOP是Spring的重要组成 ... -
spring retry框架的使用
2019-02-16 21:17 1068spring retry是从spring batch独立出 ... -
Spring BackOff退避算法
2019-02-15 22:21 3885Spring的util包提供了退避算法的实现,BackOff ... -
Spring事件驱动模型概念及使用范例
2016-12-01 16:49 2649一、概念: 二、使用要点: 事件对 ... -
自定义基于Spring的自动扫描器
2016-04-18 18:08 2193主要代码结构如下: //Ant模式通配符的Resourc ... -
资源查找器PathMatchingResourcePatternResolver的使用
2016-04-18 10:12 4336PathMatchingResourcePatternRe ... -
Spring常用的过滤器
2015-10-18 02:48 18871、CharacterEncodingFilter ... -
Spring常用的监听器
2015-10-18 02:38 46171、IntrospectorCleanupListen ... -
Spring+Hibernate环境下CLOB字段值的处理
2011-07-22 15:22 1573软件环境: Spring:2.5.4 ... -
Spring常用的接口和类(三)
2011-04-10 21:35 2855一、CustomEditorConfigurer ... -
AOP概念
2010-06-10 16:14 1502AOP (Aspect Oriented Programmi ... -
IoC原理
2010-06-10 15:31 1440IoC(Inversion of Control)就是由容器控 ... -
Spring注解类的整理
2009-08-23 01:58 1889二、Spring内置注解 1、@Compone ... -
自定义注解
2009-08-21 14:51 16451java内置注解 1、@Target: 表示该 ... -
Spring AOP使用整理:常用的AutoProxyCreator
2009-04-10 12:44 3712一、自动代理创建器 创建器是BeanPost ... -
Spring AOP使用整理:常用的Advice接口类
2009-04-10 11:45 11854一、基础接口和类 1、Person接口的源码 ...
相关推荐
例如,我们创建一个简单的日志记录切面: ```java @Aspect public class LoggingAspect { @Pointcut("execution(* com.example.service.*.*(..))") public void allServiceMethods() {} @Before(...
例如,下面的代码展示了如何使用@AspectJ定义一个简单的切面: ```java @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint...
@AspectJ是一种基于Java语言的AOP实现,允许在切面类上直接使用注解定义切点和通知。这种方式更加简洁和直观。例如: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* ...
在IT行业中,Spring框架是Java企业级应用开发的首选,而Spring AOP(面向切面编程)则是其核心特性之一,用于实现横切关注点的模块化,如日志、事务管理等。本实例将带你深入理解并实践Spring AOP与@AspectJ的结合...
为了使@AspectJ切面生效,需要在Spring配置中启用@AspectJ支持,并扫描包含切面的包。这通常在XML配置中完成: ```xml <aop:aspectj-autoproxy /> ``` 或者在Java配置中: ```java @Configuration @...
@AspectJ是Spring支持的一种AOP实现,它使用注解来定义切面,简化了配置过程。 创建一个Spring AOP应用的第一步是设置项目结构。在给定的压缩包文件中,我们可能看到一个名为"src"的目录,通常这个目录包含项目的源...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点从业务逻辑中分离出来,比如日志记录、事务管理、权限检查等。`@Aspect`是Spring AOP的核心注解,用于定义一个切面。下面我们将详细...
- 定义切面:创建一个类作为切面,定义通知方法,并使用注解@Aspect来标识。 - 配置通知:使用@Before、@After、@AfterReturning、@AfterThrowing、@Around注解来指定通知的执行时机。 - 配置切入点:使用@...
而基于 AspectJ 的方式则更为强大,它允许开发者使用 AspectJ 的语言特性(如 @Aspect、@Before、@After 等)来编写切面,提供了更直观和灵活的 AOP 解决方案。 本示例将重点介绍如何使用 AspectJ 进行 AOP 演示。...
Spring AOP支持AspectJ,可以通过引入AspectJ的库和配置,将AspectJ切面集成到Spring应用中。AspectJ提供了更丰富的语法,如`@Before`、`@After`、`@Around`等,使得切面的定义更加直观。 3. **注解驱动的切面** ...
AspectJ是一个强大的面向切面的编程库,它提供了与Spring AOP集成的能力,使我们可以编写更为灵活和模块化的代码。下面我们将详细探讨如何在Spring中创建和使用自定义切面,以及AspectJ的相关知识。 首先,让我们...
在"day39-Spring 06-Spring的AOP:带有切点的切面"这个主题中,我们将深入探讨如何在Spring中实现带有切点的切面,以及它们如何与源码和工具结合使用。 首先,理解AOP的基本概念非常重要。AOP的核心是切面(Aspect...
Spring 框架是Java开发中的一个核心组件,它提供了许多功能,其中之一就是面向切面编程(AOP)。AOP是一种编程范式,允许开发者将关注点从业务逻辑中分离出来,比如日志记录、事务管理等。在Spring中,我们可以使用...
4. **`aspectjweaver.jar`**:这个库是Spring与AspectJ集成的关键,它是一个类装载器代理,可以在Spring应用上下文中自动织入AspectJ切面。当你在Spring配置中启用`<aop:aspectj-autoproxy>`时,Spring会使用AspectJ...
1.1 `@AspectJ` 切面类 1.2 `@Pointcut` 创建切入点 1.3 通知 1.4 Spring AOP 和 AspectJ AOP 有什么区别? 2. 在 SpringBoot 中使用 Aop 功能 2.0 创建一个SpringBoot项目 2.1 引入 POM 依赖 2.1.1 引入springboot ...
Spring AOP是Spring框架的一个重要特性,它实现了面向切面编程,允许开发者定义“切面”,即关注点的模块化,比如日志记录、性能监控、安全控制等。切面通过通知(advises)来增强其他对象的行为。Spring支持多种...