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    }