一、自动代理创建器
创建器是BeanPostProcessor的子类。
1、BeanNameAutoProxyCreator: 根据Bean名自动代理
通过Spring的ProxyFactory对目标bean进行代理,Advice自动包装成PointcutAdvisor。
@Bean public BeanNameAutoProxyCreator beanNameAutoProxyCreator(){ BeanNameAutoProxyCreator creator = new BeanNameAutoProxyCreator(); creator.setBeanNames("*Mapper"); creator.setInterceptorNames("customMethodInterceptor"); return creator; } @Bean public CustomMethodInterceptor customMethodInterceptor(){ CustomMethodInterceptor interceptor = new CustomMethodInterceptor(); return interceptor; }
2、DefaultAdvisorAutoProxyCreator
DefaultAdvisorAutoProxyCreator自动查找配置文件中定义的所有Advisor,并将它们作用于所有的Bean。
@Bean public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator(){ DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator(); creator.setProxyTargetClass(true); return creator; } @Bean public NameMatchMethodPointcutAdvisor getNameMatchMethodPointcutAdvisor() { NameMatchMethodPointcutAdvisor advisor = new NameMatchMethodPointcutAdvisor(); advisor.setAdvice(new CustomMethodInterceptor()); advisor.setMappedName("*show*"); advisor.addMethodName("show"); return advisor; }
3、AnnotationAwareAspectJAutoProxyCreator
具有DefaultAdvisorAutoProxyCreator的功能,即自动查找配置文件中定义的所有Advisor,并将它们作用于所有的Bean。
同时也支持自动将标注有@Aspect注解的切面类织入到目标bean中,等价于 <aop:aspectj-autoproxy />
//Aspect类 @Aspect public class MyAspect { @Pointcut("execution(* com.seasy.springboottest..*(..))") private void commonPointcut() {} @Before("commonPointcut()") public void beforeMethod(JoinPoint point) { String methodName = point.getSignature().getName(); System.out.println("-----------before-----------" + methodName); } @After("commonPointcut()") public void afterMethod(JoinPoint point){ String methodName = point.getSignature().getName(); System.out.println("-----------after-----------" + methodName); } @AfterReturning(value="execution(* com.seasy.springboottest..*(..))", returning="result") public void afterReturningMethod(JoinPoint point, Object result){ String methodName = point.getSignature().getName(); System.out.println("methodName=" + methodName + ", result=" + result); } @AfterThrowing(value="execution(* com.seasy.springboottest..*(..))", throwing="ex") public void afterThorwingMethod(JoinPoint point, Exception ex){ String methodName = point.getSignature().getName(); System.out.println("methodName=" + methodName + ", exception: " + ex); } @Around(value="execution(* com.seasy.springboottest..*(..))") public Object aroundMethod(ProceedingJoinPoint invocation) throws Throwable{ System.out.println("around start"); Object result = invocation.proceed(); System.out.println("around end"); return result; } } //配置类 @Configuration public class AnnotationAwareAspectJAutoProxyConfig { @Bean public CountryMapper countryMapper(){ CountryMapper countryMapper = new CountryMapperImpl(); return countryMapper; } @Bean public MyAspect myAspect(){ return new MyAspect(); } @Bean public AnnotationAwareAspectJAutoProxyCreator annotationAwareAspectJAutoProxyCreator(){ AnnotationAwareAspectJAutoProxyCreator creator = new AnnotationAwareAspectJAutoProxyCreator(); creator.setProxyTargetClass(true); return creator; } } //测试类 public class AnnotationAwareAspectJAutoProxyConfigTest { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AnnotationAwareAspectJAutoProxyConfig.class); CountryMapper countryMapper = applicationContext.getBean(CountryMapper.class); countryMapper.show(); } }
四、基于aop命名空间的AOP
1、切面类MyAspect的源码
public class MyAspect { public void BeforeAdvice(JoinPoint point){ PersonImpl p = (PersonImpl)point.getTarget(); } public void AfterAdvice(JoinPoint point){ PersonImpl p = (PersonImpl)point.getTarget(); } public void AfterReturningAdvice(Object retValue){ System.out.println(retValue); } public void AroundAdvice(ProceedingJoinPoint point)throws Throwable{ System.out.println("AroundAdvice >> 目标对象 前"); point.proceed(point.getArgs()); System.out.println("AroundAdvice >> 目标对象 后"); } public void ThrowingAdvice(Throwable throwing)throws Throwable{ System.out.println(throwing); } }
2、配置
<!-- 切面受管Bean --> <bean id="myAspect" class="com.cjm.aop.MyAspect"/> <aop:config proxy-target-class="true"> <!-- 声明一个切面 --> <aop:aspect ref="myAspect" order="0"> <!-- 声明一个切入点 --> <aop:pointcut id="pointcut1" expression="execution(* com.cjm.aop..*(..))"/> <!-- 声明通知 --> <aop:before pointcut-ref="pointcut1" method="BeforeAdvice"/> <aop:after pointcut-ref="pointcut1" method="AfterAdvice"/> <aop:after-returning pointcut-ref="pointcut1" method="AfterReturningAdvice" returning="retValue"/> <aop:around pointcut-ref="pointcut1" method="AroundAdvice"/> <aop:after-throwing pointcut-ref="pointcut1" method="ThrowingAdvice" throwing="throwing"/> </aop:aspect> </aop:config>
相关推荐
### Spring AOP 入门详解 #### 一、Spring AOP 概述 Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个关键特性,它为开发者提供了在运行时动态添加代码(即横切关注点或切面)到已有...
Maven坐标:org.springframework:spring-aop:5.0.10.RELEASE; 标签:spring、aop、springframework、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览...
**Spring AOP 使用实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它提供了一种在不修改原有代码的情况下,通过代理方式添加额外功能的技术。这种技术使得我们...
接下来,我们探讨如何在Spring中配置和使用AOP: 1. **注解驱动的AOP**:Spring 2.5引入了注解驱动的AOP,使得无需XML配置即可声明切面。例如,我们可以使用`@Aspect`定义一个切面,`@Before`、`@After`、`@Around`...
在项目中,我们通常会将这个jar包引入到类路径下,以便使用Spring AOP的功能。 总的来说,Spring AOP通过提供面向切面的编程能力,极大地提高了代码的可复用性和可维护性,降低了系统复杂度,特别是在处理共性问题...
4. **丰富的切入点表达式语言**:Spring AOP支持使用SpEL(Spring Expression Language)来定义复杂的切入点表达式,这让开发者能够更加灵活地控制通知的触发条件。 #### 四、Spring AOP的实现示例 接下来,我们...
<aop:aspect ref="loggingAspect"> <aop:before method="logBefore" pointcut="execution(* com.example.service.*.*(..))"/> </aop:aspect> </aop:config> ``` 3. **创建服务类**:定义一个被切面拦截的服务...
2. 解析 AOP 配置:在解析 Bean 定义文件时,Spring AOP 也会解析 AOP 配置文件,例如 `<aop:config>` 标签。在这个过程中,Spring AOP 使用 configBeanDefinitionParser 来解析 AOP 配置文件,并生成相应的 Bean ...
在三级缓存中,Spring使用ObjectFactory来存储bean的实例,而不是直接存储bean实例。这是因为三级缓存的存在意义是为了解决循环依赖问题,而不是简单地缓存bean实例。 在三级缓存中,ObjectFactory会将bean的实例...
Spring AOP,全称为Aspect Oriented Programming,是面向切面编程的一种编程范式,它是对传统的面向对象编程(OOP)的一种补充。在OOP中,核心是对象,而在AOP中,核心则是切面。切面是关注点的模块化,即程序中的...
- **XML配置**:在Spring的配置文件中,可以使用<aop:config>标签来定义切面,<aop:pointcut>定义切点,<aop:advisor>定义通知,<aop:aspect>将切点和通知关联起来。 - **注解配置**:Spring 2.5引入了基于注解的...
在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:Spring Bean容器的实现,提供了Bean的定义、实例化...
在提供的 `lib` 压缩包中,应包含 Spring AOP 和 Spring IOC 相关的 jar 包,如 `spring-aop-x.x.x.jar` 和 `spring-context-x.x.x.jar` 等,它们是使用这两个功能的基础。请确保引入正确的版本,并正确配置到项目的...
例如,可以通过以下XML配置启用Spring AOP: ```xml <aop:aspectj-autoproxy /> ``` 然后,我们可以定义切面、切点和通知,比如: ```xml <aop:config> <aop:aspect ref="loggingAspect"> <aop:before method...
在Spring XML配置中,我们可以使用`<aop:config>`元素来定义切点表达式,然后使用`<aop:aspect>`元素来声明切面,并将通知方法与切点关联起来。此外,还可以使用注解驱动的配置,通过`@EnableAspectJAutoProxy`注解...
XML配置通常在Spring的配置文件中完成,如`<aop:config>`标签用于开启AOP支持,`<aop:aspect>`定义切面,`<aop:pointcut>`定义切点,`<aop:advisor>`定义通知。注解方式则更简洁,可以使用`@Aspect`、`@Before`、`@...
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
3. **基于XML配置的AOP**:在Spring的配置文件中,可以通过`<aop:config>`、`<aop:advisor>`、`<aop:pointcut>`等标签定义切面、通知和切入点。 ### 三、Spring AOP实战 1. **经典代理模式**:通过JDK动态代理或...
- `<aop:before>`、`<aop:after>`、`<aop:around>`等:分别用于定义不同类型的通知。 **5. 示例** ```xml <aop:config> <aop:aspect ref="myAspect"> <aop:before method="beforeAdvice" pointcut="execution(* ...