`
raymond.chen
  • 浏览: 1437460 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring AOP使用整理:常用的AutoProxyCreator

阅读更多

一、自动代理创建器

      创建器是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 概述 Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个关键特性,它为开发者提供了在运行时动态添加代码(即横切关注点或切面)到已有...

    spring-aop-5.0.10.RELEASE-API文档-中文版.zip

    Maven坐标:org.springframework:spring-aop:5.0.10.RELEASE; 标签:spring、aop、springframework、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览...

    Spring Aop使用实例

    **Spring AOP 使用实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它提供了一种在不修改原有代码的情况下,通过代理方式添加额外功能的技术。这种技术使得我们...

    JavaEE Spring AOP使用

    接下来,我们探讨如何在Spring中配置和使用AOP: 1. **注解驱动的AOP**:Spring 2.5引入了注解驱动的AOP,使得无需XML配置即可声明切面。例如,我们可以使用`@Aspect`定义一个切面,`@Before`、`@After`、`@Around`...

    spring aop jar 包

    在项目中,我们通常会将这个jar包引入到类路径下,以便使用Spring AOP的功能。 总的来说,Spring AOP通过提供面向切面的编程能力,极大地提高了代码的可复用性和可维护性,降低了系统复杂度,特别是在处理共性问题...

    Spring AOP面向方面编程原理:AOP概念

    4. **丰富的切入点表达式语言**:Spring AOP支持使用SpEL(Spring Expression Language)来定义复杂的切入点表达式,这让开发者能够更加灵活地控制通知的触发条件。 #### 四、Spring AOP的实现示例 接下来,我们...

    简单spring aop 例子

    &lt;aop:aspect ref="loggingAspect"&gt; &lt;aop:before method="logBefore" pointcut="execution(* com.example.service.*.*(..))"/&gt; &lt;/aop:aspect&gt; &lt;/aop:config&gt; ``` 3. **创建服务类**:定义一个被切面拦截的服务...

    spring源码--AOP流程--笔记.docx

    2. 解析 AOP 配置:在解析 Bean 定义文件时,Spring AOP 也会解析 AOP 配置文件,例如 `&lt;aop:config&gt;` 标签。在这个过程中,Spring AOP 使用 configBeanDefinitionParser 来解析 AOP 配置文件,并生成相应的 Bean ...

    Spring源码最难问题:当Spring AOP遇上循环依赖.docx

    在三级缓存中,Spring使用ObjectFactory来存储bean的实例,而不是直接存储bean实例。这是因为三级缓存的存在意义是为了解决循环依赖问题,而不是简单地缓存bean实例。 在三级缓存中,ObjectFactory会将bean的实例...

    Spring AOP 16道面试题及答案.docx

    Spring AOP,全称为Aspect Oriented Programming,是面向切面编程的一种编程范式,它是对传统的面向对象编程(OOP)的一种补充。在OOP中,核心是对象,而在AOP中,核心则是切面。切面是关注点的模块化,即程序中的...

    Spring基础:Spring AOP简单使用

    - **XML配置**:在Spring的配置文件中,可以使用&lt;aop:config&gt;标签来定义切面,&lt;aop:pointcut&gt;定义切点,&lt;aop:advisor&gt;定义通知,&lt;aop:aspect&gt;将切点和通知关联起来。 - **注解配置**:Spring 2.5引入了基于注解的...

    spring aop依赖jar包

    在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:Spring Bean容器的实现,提供了Bean的定义、实例化...

    spring AOP 引入jar包,spring IOC 引入Jar包

    在提供的 `lib` 压缩包中,应包含 Spring AOP 和 Spring IOC 相关的 jar 包,如 `spring-aop-x.x.x.jar` 和 `spring-context-x.x.x.jar` 等,它们是使用这两个功能的基础。请确保引入正确的版本,并正确配置到项目的...

    Spring Aop四个依赖的Jar包

    例如,可以通过以下XML配置启用Spring AOP: ```xml &lt;aop:aspectj-autoproxy /&gt; ``` 然后,我们可以定义切面、切点和通知,比如: ```xml &lt;aop:config&gt; &lt;aop:aspect ref="loggingAspect"&gt; &lt;aop:before method...

    Spring AOP完整例子

    在Spring XML配置中,我们可以使用`&lt;aop:config&gt;`元素来定义切点表达式,然后使用`&lt;aop:aspect&gt;`元素来声明切面,并将通知方法与切点关联起来。此外,还可以使用注解驱动的配置,通过`@EnableAspectJAutoProxy`注解...

    springAOP所需jar包

    XML配置通常在Spring的配置文件中完成,如`&lt;aop:config&gt;`标签用于开启AOP支持,`&lt;aop:aspect&gt;`定义切面,`&lt;aop:pointcut&gt;`定义切点,`&lt;aop:advisor&gt;`定义通知。注解方式则更简洁,可以使用`@Aspect`、`@Before`、`@...

    spring-aop.jar各个版本

    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-...

    SpringAop学习笔记以及实现Demo

    3. **基于XML配置的AOP**:在Spring的配置文件中,可以通过`&lt;aop:config&gt;`、`&lt;aop:advisor&gt;`、`&lt;aop:pointcut&gt;`等标签定义切面、通知和切入点。 ### 三、Spring AOP实战 1. **经典代理模式**:通过JDK动态代理或...

    springAop的配置实现

    - `&lt;aop:before&gt;`、`&lt;aop:after&gt;`、`&lt;aop:around&gt;`等:分别用于定义不同类型的通知。 **5. 示例** ```xml &lt;aop:config&gt; &lt;aop:aspect ref="myAspect"&gt; &lt;aop:before method="beforeAdvice" pointcut="execution(* ...

Global site tag (gtag.js) - Google Analytics