@Aspect实现 Spring AOP源码追踪

本文深入探讨了Spring AOP中@Aspect注解的使用,详细介绍了如何开启AspectJ自动代理,并分析了AspectJAutoProxyBeanDefinitionParser类在解析过程中的作用。通过AnnotationAwareAspectJAutoProxyCreator,我们了解了AOP逻辑的启动点,特别是getAdvicesAndAdvisorsForBean方法如何获取和增强@Aspect注解的类。文章还讨论了CGLIB代理的实现原理,包括CGLIB库和ASM库在字节码层面的角色,以及对final方法的限制。
摘要由CSDN通过智能技术生成

1:@Aspect切面类注解属于2.0以后定义的一直表示aop的自定义标签注解;并在spring ApplicationContext.xml中以aop:aspectj-autoproxy/方式开启;通过代码追踪,在AopNamespaceHandler中找到了对这个标签的解析器AspectJAutoProxyBeanDefinitionParser类。

2:AspectJAutoProxyBeanDefinitionParser中的parse方法对aop标签进行解析工作:

@Override
    public BeanDefinition parse(Element element, ParserContext parserContext) {
        AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(parserContext, element);
        extendBeanDefinition(element, parserContext);
        return null;
    }


public static void registerAspectJAnnotationAutoProxyCreatorIfNecessary(
			ParserContext parserContext, Element sourceElement) {

		BeanDefinition beanDefinition = AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(
				parserContext.getRegistry(), parserContext.extractSource(sourceElement));
		useClassProxyingIfNecessary(parserContext.getRegistry(), sourceElement);
		registerComponentIfNecessary(beanDefinition, parserContext);
	}

在以上的registerAspectJAnnotationAutoProxyCreatorIfNecessary中完成自动代理器AnnotationAwareAspectJAutoProxyCreator的注册;

public static void registerAspectJAnnotationAutoProxyCreatorIfNecessary(
			ParserContext parserContext, Element sourceElement) {

		BeanDefinition beanDefinition = AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(
				parserContext.getRegistry(), parserContext.extractSource(sourceElement));
		//对proxy-target-class以及expose-proxy属性的处理
         useClassProxyingIfNecessary(parserContext.getRegistry(), sourceElement);
		registerComponentIfNecessary(beanDefinition, parserContext);
	}

public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry, Object source) {
		return registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source);
	}


private static BeanDefinition registerOrEscalateApcAsRequired(Class<?> cls, BeanDefinitionRegistry registry, Object source) {
		Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
		if (registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)) {
			BeanDefinition apcDefinition = registry.getBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME);
			if (!cls.getName().equals(apcDefinition.getBeanClassName())) {
				int currentPriority = findPriorityForClass(apcDefinition.getBeanClassName());
				int requiredPriority = findPriorityForClass(cls);
				if (currentPriority < requiredPriority) {
					apcDefinition.setBeanClassName(cls.getName());
				}
			}
			return null;
		}
		RootBeanDefinition beanDefinition = new RootBeanDefinition(cls);  //封装一个代理器;
		beanDefinition.setSource(source);
		beanDefinition.getPropertyValues().add("order", Ordered.HIGHEST_PRECEDENCE);
		beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
		registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition);
		return beanDefinition;
	}

经过以上处理AnnotationAwareAspectJAutoProxyCreator类就被创建处理了,而这个类的功能就是完成aop的;这个类继承了父类AbstractAutoProxyCreator;而其父类实现了BeanPostProcessor接口,而实现该接口后,spring加载bean时会在其实例化前调用其postProcessBeforeInstantiation方法,而我们的aop逻辑就是从这里开始;

@Override
	public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
		Object cacheKey =
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值