sping AOP一 动态代理对象创建时机

SomeBusiness.java 

package com.springl.aop;

public class SomeBusiness {
    public void dealSomeBusiness(Long userId){
        System.out.println("userId"+userId+"--access------>SomeBusiness------>dealSomeBusiness");
    }
}

LogAspect.java 

package com.springl.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;

import java.util.Arrays;

@Aspect
public class LogAspect {

    @Pointcut("execution(public void com.springl.aop.SomeBusiness.dealSomeBusiness(..))")
    public void point(){};

    @Before(value = "point()")
    public void logStart(JoinPoint joinPoint){
        Object[] args = joinPoint.getArgs();
        System.out.println("@Before------>"+joinPoint.getSignature().getName()+"------>params:{"+ Arrays.asList(args)+"}");
    }

    @After(value = "point()")
    public void logEnd(JoinPoint joinPoint){
        System.out.println("@After------>"+joinPoint.getSignature().getName());
    }

    //JoinPoint一定要出现在参数表的第一位
    @AfterReturning(value="point()",returning = "result")
    public void logReturn(JoinPoint joinPoint,Object result){
        System.out.println("@AfterReturning"+joinPoint.getSignature().getName()+"------>result:{"+result+"}");
    }

}

AopTestConfig.java 

package com.springl.aop;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@EnableAspectJAutoProxy
@Configuration
public class AopTestConfig {

    @Bean
    public SomeBusiness someBusiness(){
        return new SomeBusiness();
    }

    @Bean
    LogAspect logAspect(){
        return new LogAspect();
    }
}

AopTest.java 

package com.springl.test;


import com.springl.aop.AopTestConfig;
import com.springl.aop.SomeBusiness;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AopTest {

    @Test
    public void testBean(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AopTestConfig.class);
        SomeBusiness someBusiness = applicationContext.getBean(SomeBusiness.class);
        someBusiness.dealSomeBusiness(10L);
        applicationContext.close();
    }
}

运行结果

@Before------>dealSomeBusiness------>params:{[10]}
userId10--access------>SomeBusiness------>dealSomeBusiness
@After------>dealSomeBusiness
@AfterReturningdealSomeBusiness------>result:{null}


直接看SomeBusiness对象的创建,在AbstractAutowireCapableBeanFactory.doCreateBean()方法打断点

上图中可以发现,此时的bean依旧是SomeBusiness类的对象。然后继续debug

直到执行过exposedObject = initializeBean(beanName, exposedObject, mbd);之后。exposedObject变成了一个代理类

这样的话就要看下initializeBean()了,之前讲过:initializeBean()执行BeanPostProcessor中的两个方法以及init方法。

 

通过debug发现是在执行BeanPostProcessor.postProcessAfterInitialization()之后变成代理类的对象。


在上图中,也可以看到是AnnotationAwareAspectJAutoProxyCreator来作代理对象创建工作的

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值