如果只想拦截在某种情况下调用的方法,可以使用Spring AOP提供的ControlFlowPointcut来完成这个功能。比如,只有在MainTest类中的aaMethod方法中调用的目标类的方法才会被拦截,其它地方调用的目标类的方法将不会被拦截。
示例如下,应用上一篇日志的前置通知,不同就是这里应用ControlFlowPointcut,而上一篇日志应用了一个自定义的继承了NameMatchMethodPointcut的MyPointcut类。
本例相关的applicationContext.xml文件中的内容:
<!-- 定义前置通知 --> <bean id="beforeLogAdvice" class="com.aop.BeforeLogAdvice"></bean> <bean id="controlFlowPointcut" class="org.springframework.aop.support.ControlFlowPointcut"> <!-- 构造函数的参数 --> <constructor-arg index="0"> <value>com.test.MainTest</value> </constructor-arg> <constructor-arg index="1"> <value>aaMethod</value> </constructor-arg> </bean> <bean id="myAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor"> <property name="pointcut"> <ref local="controlFlowPointcut"/> </property> <property name="advice"> <ref local="beforeLogAdvice"/> </property> </bean>
beforeLogAdvice还是以前那个前置通知,DefaultPointcutAdvisor跟上一篇日志中的用法一样。controlFlowPointcut的bean里面,第一个构造函数参数就是拦截的目标类,第二个构造函数参数就是要拦截的方法名,也就的意思就是说只拦截com.test.MainTest下的aaMethod方法中调用的UserService类的所有方法。
MainTest测试类代码:
package com.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.service.IUserService; public class MainTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "applicationContext.xml"); IUserService userService = (IUserService) context.getBean("myProxy"); userService.addUser("ton", 56); //不会被拦截 userService.deleteUser("ton");//不会被拦截 aaMethod(userService); } public static void aaMethod(IUserService userService){ userService.addUser("ton2", 56);//被拦截 userService.deleteUser("Alex");//被拦截 } }
相关推荐
9. **spring-aop-3.2.0.RELEASE.jar**:AOP模块实现了面向切面编程,允许开发者定义方法拦截器和切入点表达式,以实现如日志、事务管理等跨切面关注点的分离。 10. **spring-tx-3.2.0.RELEASE.jar**:事务管理模块...
- **AOP** 通过定义切入点、通知和切面来实现横切关注点的分离。 #### 八、配置Bean - **配置形式**:通常使用XML文件来配置Bean,但在现代的Spring开发中,也广泛采用了基于注解的配置方式。 - **Bean的配置方式**...
2. **AOP(Aspect Oriented Programming)**:Spring的AOP模块实现了面向切面编程,允许开发者定义方法拦截器和切入点表达式,用于代码的解耦和增强。`org.springframework.aop`包下包含了AOP的核心实现,如`Advised...
通过定义切面、通知和切入点表达式,我们可以实现代码的模块化和可重用性。 在2.5.6.SEC01中,Spring的IoC(Inversion of Control)容器负责管理Bean的生命周期和装配。开发者可以通过XML配置或注解声明Bean,容器...
通过定义切面、切入点表达式和通知类型,可以灵活地实现代码的解耦和模块化。 三、MVC(Model-View-Controller)框架 Spring MVC是Spring提供的Web应用开发框架,它简化了构建RESTful服务的过程。在`org.spring...
它通过定义切入点和通知来实现切面。 3. **数据访问/集成(Data Access/Integration)**:Spring提供了JDBC抽象层,简化了数据库操作。它还支持ORM(对象关系映射)框架,如Hibernate、MyBatis等,以及JPA(Java ...
Spring 2.0.2提供了更多的通知类型和更灵活的切入点表达式,让AOP的使用更加得心应手。 再者,Spring 2.0.2对数据访问层进行了重大升级。JDBC抽象层提供了模板方法和DAO支持,使得数据库操作变得更加简洁和安全。...
5. **Spring AOP**:这个模块提供了 AOP 功能,允许开发者定义方法拦截器和切入点表达式,实现代码的横切关注点。 6. **Spring Aspects**:提供了与 AspectJ 集成的能力,使开发者能够利用强大的 AOP 语言特性。 7...
在Spring框架中,AspectJ被用来实现更细粒度的控制和更灵活的AOP功能,比如在没有源码的情况下对第三方库进行增强。 Spring Web MVC的核心组件包括DispatcherServlet、Controller、Model、View和ViewResolver。...
AOP通过定义切入点和通知来实现横切关注点的封装。 3. **Bean的生命周期** Spring bean有完整的生命周期管理,包括初始化、正常使用和销毁三个阶段。我们可以自定义初始化方法、销毁方法,还可以利用...
8. **Spring AOP的应用场景**:常见的使用AOP的场景包括事务管理、日志记录、性能监控、安全控制等。例如,可以在所有数据库操作前启动一个事务,在操作完成后提交或回滚,这样就可以确保数据一致性。 通过学习并...
面向切面编程是Spring的重要特性,5.3.0在AOP方面进行了增强,支持更多的切面定义方式,如注解、XML配置以及编程式切面,同时提供了更强大的切入点表达式。 6. **Instrumentation** 仪器化模块主要用于类加载器和...
2. **定义切入点**:使用`<aop:pointcut>`元素定义切入点表达式,该表达式指定了通知应用的连接点。例如,定义一个切入点,匹配所有在com.example.service包及其子包下的public方法: ```xml <aop:pointcut id=...
AOP通过定义切面、通知和切入点来实现代码的解耦。 4. **Spring容器**:Spring框架的核心是IoC容器,它负责创建、管理和装配对象。Spring容器根据配置文件或Java代码中的定义来实例化对象并管理其生命周期。 5. **...
- **ControlFlowPointcut**:基于控制流的切入点,允许基于代码的执行流程来确定是否应用通知。 ### 切入点的组合 除了单个的切入点,Spring还支持通过`Pointcuts.union`来组合多个切入点,这意味着可以将两个或更...
在IT行业中,Spring Boot是一个非常流行的Java开发框架,它简化了Spring应用的初始搭建以及开发过程。本笔记主要关注Spring Boot中的两个核心概念:事务管理和面向切面编程(AOP)。我们将深入探讨这两个主题,理解...
- **切入点**:匹配连接点的断言。 - **织入**:将切面代码插入到连接点的过程。 - **实现方式**:通过Spring的<aop:config>元素或@AspectJ注解实现。 #### 五、Spring MVC - **简介**:Spring MVC是Spring框架...
3. **Spring AOP**:这一部分将介绍如何创建切面、定义通知(advice)、切入点表达式(pointcut)等,以便实现事务管理、日志记录等跨切面功能。 4. **Spring JDBC** 和 **Spring Data JPA**:Spring 提供了对...