001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.commons.configuration.beanutils; 018 019 /** 020 * <p> 021 * The default implementation of the {@code BeanFactory} interface. 022 * </p> 023 * <p> 024 * This class creates beans of arbitrary types using reflection. Each time the 025 * {@code createBean()} method is invoked, a new bean instance is 026 * created. A default bean class is not supported. 027 * </p> 028 * <p> 029 * An instance of this factory class will be set as the default bean factory for 030 * the {@link BeanHelper} class. This means that if not bean 031 * factory is specified in a {@link BeanDeclaration}, this 032 * default instance will be used. 033 * </p> 034 * 035 * @since 1.3 036 * @author <a 037 * href="http://commons.apache.org/configuration/team-list.html">Commons 038 * Configuration team</a> 039 * @version $Id: DefaultBeanFactory.java 1208758 2011-11-30 20:38:59Z oheger $ 040 */ 041 public class DefaultBeanFactory implements BeanFactory 042 { 043 /** Stores the default instance of this class. */ 044 public static final DefaultBeanFactory INSTANCE = new DefaultBeanFactory(); 045 046 /** 047 * Creates a new bean instance. This implementation delegates to the 048 * protected methods {@code createBeanInstance()} and 049 * {@code initBeanInstance()} for creating and initializing the bean. 050 * This makes it easier for derived classes that need to change specific 051 * functionality of the base class. 052 * 053 * @param beanClass the class of the bean, from which an instance is to be 054 * created 055 * @param data the bean declaration object 056 * @param parameter an additional parameter (ignored by this implementation) 057 * @return the new bean instance 058 * @throws Exception if an error occurs 059 */ 060 public Object createBean(Class<?> beanClass, BeanDeclaration data, 061 Object parameter) throws Exception 062 { 063 Object result = createBeanInstance(beanClass, data); 064 initBeanInstance(result, data); 065 return result; 066 } 067 068 /** 069 * Returns the default bean class used by this factory. This is always 070 * <b>null</b> for this implementation. 071 * 072 * @return the default bean class 073 */ 074 public Class<?> getDefaultBeanClass() 075 { 076 return null; 077 } 078 079 /** 080 * Creates the bean instance. This method is called by 081 * {@code createBean()}. It uses reflection to create a new instance 082 * of the specified class. 083 * 084 * @param beanClass the class of the bean to be created 085 * @param data the bean declaration 086 * @return the new bean instance 087 * @throws Exception if an error occurs 088 */ 089 protected Object createBeanInstance(Class<?> beanClass, BeanDeclaration data) 090 throws Exception 091 { 092 return beanClass.newInstance(); 093 } 094 095 /** 096 * Initializes the newly created bean instance. This method is called by 097 * {@code createBean()}. It calls the 098 * {@link BeanHelper#initBean(Object, BeanDeclaration) initBean()} 099 * of {@link BeanHelper} for performing the initialization. 100 * 101 * @param bean the newly created bean instance 102 * @param data the bean declaration object 103 * @throws Exception if an error occurs 104 */ 105 protected void initBeanInstance(Object bean, BeanDeclaration data) 106 throws Exception 107 { 108 BeanHelper.initBean(bean, data); 109 } 110 }