/* * Copyright (c) 2002-2012 Alibaba Group Holding Limited. * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.citrus.service.pull.support; import static com.alibaba.citrus.springext.util.SpringExtUtil.*; import static com.alibaba.citrus.util.Assert.*; import static com.alibaba.citrus.util.StringUtil.*; import com.alibaba.citrus.service.pull.ToolFactory; import com.alibaba.citrus.springext.support.BeanSupport; import com.alibaba.citrus.springext.support.parser.AbstractSingleBeanDefinitionParser; import net.sf.cglib.reflect.FastClass; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.w3c.dom.Element; /** * 创建一个简单bean的tool factory。 * * @author Michael Zhou */ public class BeanTool extends BeanSupport implements ToolFactory, ApplicationContextAware { protected final static boolean DEFAULT_SINGLETON = true; private ApplicationContext beanFactory; private boolean singleton = DEFAULT_SINGLETON; private Class<?> beanClass; private boolean autowire; private FastClass fc; public boolean isSingleton() { return singleton; } public void setSingleton(boolean singleton) { this.singleton = singleton; } public void setBeanFactory(ApplicationContext beanFactory) { this.beanFactory = beanFactory; } public Class<?> getBeanClass() { return beanClass; } public void setBeanClass(Class<?> beanClass) { this.beanClass = beanClass; } public boolean isAutowire() { return autowire; } public void setAutowire(boolean autowire) { this.autowire = autowire; } public ApplicationContext getBeanFactory() { return beanFactory; } public void setApplicationContext(ApplicationContext beanFactory) { this.beanFactory = beanFactory; } @Override protected void init() throws Exception { assertNotNull(beanFactory, "no beanFactory specified"); assertNotNull(beanClass, "no tool class specified"); fc = FastClass.create(beanClass); } public Object createTool() throws Exception { Object tool = fc.newInstance(); AutowireCapableBeanFactory factory = beanFactory.getAutowireCapableBeanFactory(); if (autowire) { factory.autowireBeanProperties(tool, AbstractBeanDefinition.AUTOWIRE_NO, false); } factory.initializeBean(tool, getBeanName()); return tool; } @Override public String toString() { return getClass().getSimpleName() + "[" + beanClass + "]"; } /** * 子类可以调用该方法来解析参数。 * <ul> * <li>参数:<code>scope="request|global"</code>,默认为<code>global</code>。</li> * </ul> */ protected static final boolean parseBeanToolScope(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { String scopeValue = trimToNull(element.getAttribute("scope")); boolean singleton = DEFAULT_SINGLETON; if (scopeValue != null) { if ("request".equals(scopeValue)) { singleton = false; } else if ("global".equals(scopeValue)) { singleton = true; } else { throw new IllegalArgumentException("unknown scope: " + scopeValue); } builder.addPropertyValue("singleton", singleton); } return singleton; } /** * 子类可以调用该方法来解析参数。 * <ul> * <li>参数:<code>class="..."</code>。</li> * </ul> */ protected static final String parseBeanToolClass(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { String beanClass = trimToNull(element.getAttribute("class")); if (beanClass != null) { builder.addPropertyValue("beanClass", beanClass); } return beanClass; } /** * 子类可以调用该方法来解析参数。 * <ul> * <li>参数:<code>autowire="true|false"</code>,默认为<code>false</code>。</li> * </ul> */ protected static final void parseBeanToolAutowire(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { attributesToProperties(element, builder, "autowire"); } public static class DefinitionParser extends AbstractSingleBeanDefinitionParser<BeanTool> { @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { parseBeanToolScope(element, parserContext, builder); parseBeanToolClass(element, parserContext, builder); parseBeanToolAutowire(element, parserContext, builder); } } }