zoukankan      html  css  js  c++  java
  • Spring AOP原理

    @EnableAspectJAutoProxy 

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Import(AspectJAutoProxyRegistrar.class)
    public @interface EnableAspectJAutoProxy {
        boolean proxyTargetClass() default false;
        boolean exposeProxy() default false;
    }
    

    AspectJAutoProxyRegistrar  

    AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
    

      创建Bean(AnnotationAwareAspectJAutoProxyCreator)的定义

    RootBeanDefinition beanDefinition = new RootBeanDefinition(cls);
    beanDefinition.setSource(source);
    beanDefinition.getPropertyValues().add("order", Ordered.HIGHEST_PRECEDENCE);
    beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
    // AUTO_PROXY_CREATOR_BEAN_NAME=org.springframework.aop.config.internalAutoProxyCreator
    registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition);
    return beanDefinition;

    AnnotationAwareAspectJAutoProxyCreator 

       实现setBeanFactory方法  

    @Override
    public void setBeanFactory(BeanFactory beanFactory) {
    	super.setBeanFactory(beanFactory);
    	if (!(beanFactory instanceof ConfigurableListableBeanFactory)) {
    		throw new IllegalArgumentException(
    				"AdvisorAutoProxyCreator requires a ConfigurableListableBeanFactory: " + beanFactory);
    	}
    	initBeanFactory((ConfigurableListableBeanFactory) beanFactory);
    }
    

      重写initBeanFactory方法

    @Override
    protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    	super.initBeanFactory(beanFactory);
    	if (this.aspectJAdvisorFactory == null) {
    		this.aspectJAdvisorFactory = new ReflectiveAspectJAdvisorFactory(beanFactory);
    	}
    	this.aspectJAdvisorsBuilder =
    			new BeanFactoryAspectJAdvisorsBuilderAdapter(beanFactory, this.aspectJAdvisorFactory);
    }
    

      流程  

      1)、传入配置类,创建IOC容器

    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TxConfig.class);
    		
    

      2)、注册配置类调用refresh方法刷新容器

    public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
    	this();
    	register(annotatedClasses);
    	refresh();
    }
    

      3)、注册Bean的后置处理器

    // Register bean processors that intercept bean creation.
    // 注册拦截bean创建的bean后置处理器
    registerBeanPostProcessors(beanFactory);
    

      3.1)、获取IOC容器中已有的BeanPostProcessor的定义Bean

    String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

      3.2)、添加一些其他的BeanPostProcessor

    beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
    

      3.3)、分离实现了PriorityOrdered接口、实现了Ordered接口、普通的BeanPostProcessor,并创建对象

    // Separate between BeanPostProcessors that implement PriorityOrdered,Ordered, and the rest.
    BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);

      参见创建Bean实例的步骤

      3.4)、注册BeanPostProcessor

    private static void registerBeanPostProcessors(
    		ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {
    
    	for (BeanPostProcessor postProcessor : postProcessors) {
    		beanFactory.addBeanPostProcessor(postProcessor);
    	}
    }  

    创建Bean实例的步骤  

      1)、ConfigurableListableBeanFactory

    <T> T getBean(String name, Class<T> requiredType) throws BeansException;

      2)、AbstractBeanFactory

    @Override
    public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
    	return doGetBean(name, requiredType, null, false);
    }
    

      3)、AbstractBeanFactory的doGetBean方法获取单例对象

    // Create bean instance.
    if (mbd.isSingleton()) {
    	sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
    		@Override
    		public Object getObject() throws BeansException {
    			try {
    				return createBean(beanName, mbd, args);
    			}
    			catch (BeansException ex) {
    				// Explicitly remove instance from singleton cache: It might have been put there
    				// eagerly by the creation process, to allow for circular reference resolution.
    				// Also remove any beans that received a temporary reference to the bean.
    				destroySingleton(beanName);
    				throw ex;
    			}
    		}
    	});
    	bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
    }
    

      4)、AbstractAutowireCapableBeanFactory的creatBean方法,在IOC容器中未找到Bean则创建Bean实例

    // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
    // 给BeanPostProcessors一个机会去创建代理对象代替Bean实例,参见
    Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
    if (bean != null) {
    	return bean;
    }
    Object beanInstance = doCreateBean(beanName, mbdToUse, args);
    return beanInstance;
    

      5)、AbstractAutowireCapableBeanFactory的doCreateBean方法

    // 实例化Bean,创建Bean对象
    if (instanceWrapper == null) {
    	instanceWrapper = createBeanInstance(beanName, mbd, args);
    }
    // 为Bean对象的属性赋初始值
    populateBean(beanName, mbd, instanceWrapper);
    // 初始化Bean,可能调用类的init方法或afterPropertiesSet方法
    if (exposedObject != null) {
    	exposedObject = initializeBean(beanName, exposedObject, mbd);
    }
    

      6)、AbstractAutowireCapableBeanFactory的initializeBean方法

    protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
    	if (System.getSecurityManager() != null) {
    		AccessController.doPrivileged(new PrivilegedAction<Object>() {
    			@Override
    			public Object run() {
    				invokeAwareMethods(beanName, bean);
    				return null;
    			}
    		}, getAccessControlContext());
    	}
    	else {
    		// 如果Bean实现了xxxAware接口的话则调用setXXX方法注入相应对象
    		invokeAwareMethods(beanName, bean);
    	}
    
    	Object wrappedBean = bean;
    	if (mbd == null || !mbd.isSynthetic()) {
    		// 执行初始化的前置操作
    		wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    	}
    
    	try {
    		// 如果bean实现了InitializingBean接口则调用afterPropertiesSet方法
    		invokeInitMethods(beanName, wrappedBean, mbd);
    	}
    	catch (Throwable ex) {
    		throw new BeanCreationException(
    				(mbd != null ? mbd.getResourceDescription() : null),
    				beanName, "Invocation of init method failed", ex);
    	}
    
    	if (mbd == null || !mbd.isSynthetic()) {
    		// 执行初始化的后置操作
    		wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    	}
    	return wrappedBean;
    }
    

    创建Bean实例的代理对象步骤

      1)、AbstractAutowireCapableBeanFactory的resolveBeforeInstantiation方法

    protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
    	Object bean = null;
    	if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
    		// Make sure bean class is actually resolved at this point.
    		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    			Class<?> targetType = determineTargetType(beanName, mbd);
    			if (targetType != null) {
    				// 执行Bean初始化的前置操作
    				bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
    				if (bean != null) {
    					// 执行Bean初始化的后置操作
    					bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
    				}
    			}
    		}
    		mbd.beforeInstantiationResolved = (bean != null);
    	}
    	return bean;
    }
    

      2)、AbstractAutowireCapableBeanFactory的applyBeanPostProcessorsBeforeInstantiation方法

        BeanPostProcessor是在创建Bean对象完成后,初始化Bean前后进行拦截

        InstantiationAwareBeanPostProcessor是在创建Bean对象之前,先尝试用后置处理器返回代理对象

    protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
    	for (BeanPostProcessor bp : getBeanPostProcessors()) {
    		if (bp instanceof InstantiationAwareBeanPostProcessor) {
    			InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
    			Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
    			if (result != null) {
    				return result;
    			}
    		}
    	}
    	return null;
    }
    

      4)、AbstractAutoProxyCreator的postProcessBeforeInstantiation方法

    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
    	Object cacheKey = getCacheKey(beanClass, beanName);
    
    	if (beanName == null || !this.targetSourcedBeans.contains(beanName)) {
    		if (this.advisedBeans.containsKey(cacheKey)) {
    			return null;
    		}
    		// 判断是否需要跳过
    		if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) {
    			this.advisedBeans.put(cacheKey, Boolean.FALSE);
    			return null;
    		}
    	}
    
    	// Create proxy here if we have a custom TargetSource.
    	// Suppresses unnecessary default instantiation of the target bean:
    	// The TargetSource will handle target instances in a custom fashion.
    	if (beanName != null) {
    		// 判断是否有自定义的目标资源,有的话才创建代理对象
    		TargetSource targetSource = getCustomTargetSource(beanClass, beanName);
    		if (targetSource != null) {
    			this.targetSourcedBeans.add(beanName);
    			Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource);
    			Object proxy = createProxy(beanClass, beanName, specificInterceptors, targetSource);
    			this.proxyTypes.put(cacheKey, proxy.getClass());
    			return proxy;
    		}
    	}
    
    	return null;
    }

      5)、AbstractAutowireCapableBeanFactory的applyBeanPostProcessorsAfterInitialization方法  

    @Override
    public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
    		throws BeansException {
    
    	Object result = existingBean;
    	for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
    		result = beanProcessor.postProcessAfterInitialization(result, beanName);
    		if (result == null) {
    			return result;
    		}
    	}
    	return result;
    }

      6)、AbstractAutoProxyCreator的postProcessAfterInitialization方法

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    	if (bean != null) {
    		Object cacheKey = getCacheKey(bean.getClass(), beanName);
    		if (!this.earlyProxyReferences.contains(cacheKey)) {
    			return wrapIfNecessary(bean, beanName, cacheKey);
    		}
    	}
    	return bean;
    }
    

      7)、AbstractAutoProxyCreator的wrapIfNecessary方法

    protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
    	if (beanName != null && this.targetSourcedBeans.contains(beanName)) {
    		return bean;
    	}
    	if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
    		return bean;
    	}
    	// 判断是否需要跳过,如果需要跳过返回原bean对象
    	if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
    		this.advisedBeans.put(cacheKey, Boolean.FALSE);
    		return bean;
    	}
    
    	// Create proxy if we have advice.
    	// 如果当前bean匹配横切点表达式则创建代理对象
    	Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
    	if (specificInterceptors != DO_NOT_PROXY) {
    		this.advisedBeans.put(cacheKey, Boolean.TRUE);
    		// 创建代理对象,JDK、CGLIB方式
    		Object proxy = createProxy(
    				bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
    		this.proxyTypes.put(cacheKey, proxy.getClass());
    		return proxy;
    	}
    
    	this.advisedBeans.put(cacheKey, Boolean.FALSE);
    	return bean;
    }
    

      

       

  • 相关阅读:
    mac命令
    缓存穿透、缓存击穿、缓存雪崩区别
    计算属性 和 方法的区别
    Docker笔记
    使用excel 生成多个 sql语句
    开发分支操作步骤
    Python3.8中使用pymysql连接数据报错__init__() takes 1 positional argument but 5 were given解决方案
    测试时间评估
    js map() 函数的使用 --待补充
    左联后再内联的2种写法
  • 原文地址:https://www.cnblogs.com/BINGJJFLY/p/12252569.html
Copyright © 2011-2022 走看看