Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (c) 1997-2013, www.tinygroup.org (luo_guo@icloud.com). Licensed under the GPL, Version 3.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.gnu.org/licenses/gpl.html 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 org.tinygroup.factory.impl;
 
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
功能说明: 工厂类的默认实现

开发人员: renhui
开发时间: 2013-2-25

 
 public class SimpleFactory implements Factory {
 	private static final String BY_TYPE = "byType";
 	private static final String BY_NAME = "byName";
 	private static final String SINGLETON = "singleton";
 	private static Logger logger = LoggerFactory.getLogger(SimpleFactory.class);
 	private Map<StringObjectidMap = new HashMap<StringObject>();
 	private Map<StringObjectnameMap = new HashMap<StringObject>();
 	private Map<StringObjectnameClassMap = new HashMap<StringObject>();
 	private Map<Class<?>, ObjectclassMap = new HashMap<Class<?>, Object>();
 	private List<BeansbeansList = new ArrayList<Beans>();
 	private Map<ObjectBeanobjectBeanMap = new HashMap<ObjectBean>();
 	private Map<ObjectBooleanreadyMap = new HashMap<ObjectBoolean>();
 
 	public void clean() {
 	}
 
 	private void addBean(Bean beanObject object) {
 		addBeanWithId(beanobject);
 		addBeanWithName(beanobject);
 		addBeanWithClass(beanobject);
 		addBeanWithNameClass(beanobject);
 	}
 
 	private void addBeanWithNameClass(Bean beanObject object) {
 				String.format("%s|%s"bean.getName(), bean.getType()), object);
 	}
 
 	private void addBeanWithClass(Bean beanObject object) {
 		try {
 			.put(Class.forName(bean.getType()), object);
 		} catch (ClassNotFoundException e) {
 			.errorMessage("查找[{0}]类失败, 原因:{0}"ee.getMessage());
 		}
 	}
 
 	private void addBeanWithName(Bean beanObject object) {
 		if (bean.getName() != null && bean.getName().length() > 0) {
 			String[] names = bean.getName().split(",");
 			for (String name : names) {
 				if (name.length() > 0) {
 					// 如果名字有重复的就被覆盖了
 					.put(nameobject);
				}
			}
		}
	}
	private void addBeanWithId(Bean beanObject object) {
		if (bean.getId() != null && bean.getId().length() > 0) {
			Bean oldBean = .get(bean.getId());
			if (oldBean != null) {
						"[{}] 类型 bean id [{}] 已经存在,类型为[{},原有Bean将被覆盖]!",
						bean.getClassName(), bean.getId(),
						oldBean.getClassName());
			}
			.put(objectbean);
			.put(bean.getId(), object);
		}
	}
	@SuppressWarnings("unchecked")
	public <T> T getBean(String name) {
		Object object = getObject(name);
		if (object != null) {
			return checkScope((T) object);
		}
		throw new BeanFactoryRuntimeException(String.format("找不到名字是[%s]的Bean.",
				name));
	}
	private Object getObject(String name) {
		Object object = .get(name);
		if (object == null) {
			object = .get(name);
		}
		if (object != null) {
			Boolean ready = .get(object);
			if (ready == null) {
				assembleBean(object);
			}
		}
		return object;
	}
	@SuppressWarnings("unchecked")
	private <T> T checkScope(T object) {
		try {
			if (object != null) {
				Bean bean = .get(object);
				String scope = bean.getScope();
				if (scope.equals()) {
					return object;
else if (scope.equals("prototype")) {
newObject = (T) retriveClass(bean.getClassName())
					BeanUtils.copyProperties(newObjectobject);// 如果属性是Prototype是不是也创建一个新的?
					return newObject;
				}
			}
			throw new BeanFactoryRuntimeException(String.format("Bean不存在。"));
catch (Exception e) {
		}
	}
	private void assembleBean(Object object) {
		if (.get(object) == null || .get(object).equals(false)) {
		}
	}
	private void autoAssembleBean(Bean beanDefineObject newInstance) {
		for (PropertyDescriptor propertyDescriptor : PropertyUtils
				.getPropertyDescriptors(newInstance)) {
			try {
				if (propertyDescriptor.getPropertyType().equals(Class.class)) {
					continue;
				}
				if (beanDefine.getAutowire().equalsIgnoreCase()) {
					Object bean = getBean(propertyDescriptor.getName());
					if (bean != null
							&& propertyDescriptor.getPropertyType().isInstance(
									bean)) {
						BeanUtils.setProperty(newInstance,
								propertyDescriptor.getName(), bean);
					}
else if (beanDefine.getAutowire().equalsIgnoreCase()) {
					Object bean = getBean(propertyDescriptor.getPropertyType());
					if (bean != null) {
						BeanUtils.setProperty(newInstance,
								propertyDescriptor.getName(), bean);
					}
				}
catch (Exception e) {
				.errorMessage("为属性{0}赋值时出现异常"e,
						propertyDescriptor.getName());
			}
		}
	}
	private void loadProperties(Object object) {
		Bean bean = .get(object);
		try {
			if (bean.getAutowire() != null) {
				autoAssembleBean(beanobject);
				return;// 如果是自动装配,做完直接返回
			}
			if (bean.getProperties() != null) {
				for (Property property : bean.getProperties()) {
					if (property.getValue() != null) {
						BeanUtils.setProperty(objectproperty.getName(),
								property.getValue());
else if (property.getRef() != null) {
						BeanUtils.setProperty(objectproperty.getName(),
								getObject(property.getRef()));
else if (property.getList() != null) {
						loadListProperty(objectproperty);
else if (property.getMap() != null) {
						loadMapProperty(objectproperty);
					}
				}
			}
			.put(objecttrue);
catch (Exception e) {
			.put(objectfalse);
		}
	}
	private void loadMapProperty(Object objectProperty property)
		Map<StringObjectvalueMap = new HashMap<StringObject>();
		for (Entry entry : property.getMap().getEntry()) {
			if (entry.getValue() != null) {
				valueMap.put(entry.getKey(), entry.getValue());
else if (entry.getValueRef() != null) {
				valueMap.put(entry.getKey(), getObject(entry.getValueRef()));
			}
		}
		BeanUtils.setProperty(objectproperty.getName(), valueMap);
	}
	private void loadListProperty(Object objectProperty property)
		List<ObjectvalueList = new ArrayList<Object>();
		for (Ref ref : property.getList()) {
			valueList.add(getObject(ref));
		}
		if (PropertyUtils.getPropertyDescriptor(objectproperty.getName())
			BeanUtils.setProperty(objectproperty.getName(), valueList);
else if (PropertyUtils
				.getPropertyDescriptor(objectproperty.getName())
			Set<Objectset = new HashSet<Object>();
			set.addAll(valueList);
			BeanUtils.setProperty(objectproperty.getName(), set);
		}
	}
	private Object getObject(Ref ref) {
		if (ref.getId() != null) {
			return getBean(ref.getId());// 20130130 getObject修改为getBean
else if (ref.getName() != null) {
			return getBean(ref.getName());
else if (ref.getClassName() != null) {
			return getBean(getType(ref.getClassName()));
		}
		return null;
	}
	@SuppressWarnings("unchecked")
	public <T> T getBean(String nameClass<T> clazz) {
		Object object = .get(String.format("%s|%s"name,
				clazz.getName()));
		if (object != null && .get(object)) {
			return checkScope((T) object);
		}
		throw new BeanFactoryRuntimeException(String.format("找不到类[%s]对应的Bean.",
				clazz.getName()));
	}
	@SuppressWarnings("unchecked")
	public <T> T getBean(Class<T> clazz) {
		Object object = .get(clazz);
		if (object != null) {
			Boolean ready = .get(object);
			if (ready == null) {
				assembleBean(object);
			}
			ready = .get(object);
			if (ready) {
				return checkScope((T) object);
			}
		}
		throw new BeanFactoryRuntimeException(String.format("找不到类[%s]对应的Bean.",
				clazz.getName()));
	}
	public boolean containsBean(String name) {
		return .containsKey(name);
	}
	public Class<?> getType(String name) {
		try {
			return retriveClass(name);
catch (ClassNotFoundException e) {
		}
	}
	private Class<?> retriveClass(String namethrows ClassNotFoundException {
		return Class.forName(name);
	}
	public void init() {
		// 初始化时把Bean创建好
		for (Beans beans : ) {
			loadBeas(beans);
		}
		for (Object object : .keySet()) {
			assembleBean(object);
		}
	}
	private void loadBeas(Beans beans) {
		if (beans.getBeanList() != null) {
			for (Bean bean : beans.getBeanList()) {
				loadBean(bean);
			}
		}
	}
	private void loadBean(Bean bean) {
		try {
			if (.values().contains(bean)) {
				return;
			}
			Object object = Class.forName(bean.getClassName()).newInstance();
			if (object instanceof FactoryAware) {
				FactoryAware factoryAware = (FactoryAwareobject;
				factoryAware.setFactory(this);
			}
			addBean(beanobject);
catch (Exception e) {
			.errorMessage("初始化[{0}]类失败, 原因:{1}"ebean.getType(),
		}
	}
	public void addBeans(Beans beans) {
		// 如果packageName不为空,则先判断该beans是否已被添加过,若添加过则删除旧的
		if (beans.getPackageName() != null) {
			for (Beans b : ) {
				if (b.getPackageName() != null
					break;
				}
			}
		}
		.add(beans);
	}
	@SuppressWarnings("unchecked")
	public <T> T createBean(String className) {
		try {
			return (T) getType(className).newInstance();
catch (Exception e) {
		}
	}
	public void removeBeans(Beans beans) {
		for (Bean bean : beans.getBeanList()) {
		}
		// 从benasList中删除
		if (beans.getPackageName() != null) {
			for (Beans b : ) {
				if (b.getPackageName() != null
							"从beansList移除Beans[package-name:{0}]",
					break;
				}
			}
		}
	}
	private void removeBean(Bean bean) {
	}
	private void removeBeanWithNameClass(Bean bean) {
		.remove(String.format("%s|%s"bean.getName(),
				bean.getType()));
	}
	private void removeBeanWithClass(Bean bean) {
	}
	private void removeBeanWithName(Bean bean) {
		if (bean.getName() != null && bean.getName().length() > 0) {
			String[] names = bean.getName().split(",");
			for (String name : names) {
				if (name.length() > 0) {
					// 如果名字有重复的就被覆盖了
				}
			}
		}
	}
	private void removeBeanWithId(Bean bean) {
		if (bean.getId() != null && bean.getId().length() > 0) {
			Object object = .remove(bean.getId());
		}
	}
	@SuppressWarnings("unchecked")
	public <T> T createBean(Class<?> clazz) {
		try {
			return (T) clazz.newInstance();
catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
New to GrepCode? Check out our FAQ X