zoukankan      html  css  js  c++  java
  • ProxyFactoryBean与AopProxy介绍

    1、ProxyFactoryBean的典型配置

    2、进入getObject方法

    	/**
    	 * Return a proxy. Invoked when clients obtain beans from this factory bean.
    	 * Create an instance of the AOP proxy to be returned by this factory.
    	 * The instance will be cached for a singleton, and create on each call to
    	 * <code>getObject()</code> for a proxy.
    	 * @return a fresh AOP proxy reflecting the current state of this factory
    	 */
    	public Object getObject() throws BeansException {
    		initializeAdvisorChain();
    		if (isSingleton()) {
    			return getSingletonInstance();
    		}
    		else {
    			if (this.targetName == null) {
    				logger.warn("Using non-singleton proxies with singleton targets is often undesirable. " +
    						"Enable prototype proxies by setting the 'targetName' property.");
    			}
    			return newPrototypeInstance();
    		}
    	}
    

      

    3、初始化Advisor链方法 initializeAdvisorChain

    	/**
    	 * Create the advisor (interceptor) chain. Aadvisors that are sourced
    	 * from a BeanFactory will be refreshed each time a new prototype instance
    	 * is added. Interceptors added programmatically through the factory API
    	 * are unaffected by such changes.
    	 */
    	private synchronized void initializeAdvisorChain() throws AopConfigException, BeansException {
    		if (this.advisorChainInitialized) {
    			return;
    		}
    
    		if (!ObjectUtils.isEmpty(this.interceptorNames)) {
    			if (this.beanFactory == null) {
    				throw new IllegalStateException("No BeanFactory available anymore (probably due to serialization) " +
    						"- cannot resolve interceptor names " + Arrays.asList(this.interceptorNames));
    			}
    
    			// Globals can't be last unless we specified a targetSource using the property...
    			if (this.interceptorNames[this.interceptorNames.length - 1].endsWith(GLOBAL_SUFFIX) &&
    					this.targetName == null && this.targetSource == EMPTY_TARGET_SOURCE) {
    				throw new AopConfigException("Target required after globals");
    			}
    
    			// Materialize interceptor chain from bean names.
    			for (String name : this.interceptorNames) {
    				if (logger.isTraceEnabled()) {
    					logger.trace("Configuring advisor or advice '" + name + "'");
    				}
    
    				if (name.endsWith(GLOBAL_SUFFIX)) {
    					if (!(this.beanFactory instanceof ListableBeanFactory)) {
    						throw new AopConfigException(
    								"Can only use global advisors or interceptors with a ListableBeanFactory");
    					}
    					addGlobalAdvisor((ListableBeanFactory) this.beanFactory,
    							name.substring(0, name.length() - GLOBAL_SUFFIX.length()));
    				}
    
    				else {
    					// If we get here, we need to add a named interceptor.
    					// We must check if it's a singleton or prototype.
    					Object advice;
    					if (this.singleton || this.beanFactory.isSingleton(name)) {
    						// Add the real Advisor/Advice to the chain.
    						advice = this.beanFactory.getBean(name);
    					}
    					else {
    						// It's a prototype Advice or Advisor: replace with a prototype.
    						// Avoid unnecessary creation of prototype bean just for advisor chain initialization.
    						advice = new PrototypePlaceholderAdvisor(name);
    					}
    					addAdvisorOnChainCreation(advice, name);
    				}
    			}
    		}
    
    		this.advisorChainInitialized = true;
    	}
    

      

    4、获得代理对象方法  getSingletonInstance

    	/**
    	 * Return the singleton instance of this class's proxy object,
    	 * lazily creating it if it hasn't been created already.
    	 * @return the shared singleton proxy
    	 */
    	private synchronized Object getSingletonInstance() {
    		if (this.singletonInstance == null) {
    			this.targetSource = freshTargetSource();
    			if (this.autodetectInterfaces && getProxiedInterfaces().length == 0 && !isProxyTargetClass()) {
    				// Rely on AOP infrastructure to tell us what interfaces to proxy.
    				Class targetClass = getTargetClass();
    				if (targetClass == null) {
    					throw new FactoryBeanNotInitializedException("Cannot determine target class for proxy");
    				}
    				setInterfaces(ClassUtils.getAllInterfacesForClass(targetClass, this.proxyClassLoader));
    			}
    			// Initialize the shared singleton instance.
    			super.setFrozen(this.freezeProxy);
    			this.singletonInstance = getProxy(createAopProxy());
    		}
    		return this.singletonInstance;
    	}
    

      

    5、this.singletonInstance = getProxy(createAopProxy());

    1) createAopProxy方法

    	protected final synchronized AopProxy createAopProxy() {
    		if (!this.active) {
    			activate();
    		}
    		return getAopProxyFactory().createAopProxy(this);
    	}
    

      

    createAopProxy方法实现

  • 相关阅读:
    PHP使用http_build_query()构造URL字符串的方法
    php将一个二维数组按照某个字段值合并成一维数组,如果有重复则将重复的合并成二维数组
    资金管理
    偏爱粉色,我的儿子会不会娘娘腔?
    中文期刊有哪些?
    超声胎儿图像分割
    加州wonders教材扫盲
    美国小学1-5年级教学大纲
    A股回归牛市?
    深入研究股票涨停
  • 原文地址:https://www.cnblogs.com/linlf03/p/11185686.html
Copyright © 2011-2022 走看看