Class BeanHelper
A helper class for creating bean instances that are defined in configuration files.
This class provides utility methods related to bean creation operations. These methods simplify such operations because a client need not deal with all involved interfaces. Usually, if a bean declaration has already been obtained, a single method call is necessary to create a new bean instance.
This class also supports the registration of custom bean factories. Implementations of the BeanFactory
interface can be registered under a symbolic name using the registerBeanFactory()
method. In the
configuration file the name of the bean factory can be specified in the bean declaration. Then this factory will be
used to create the bean.
In order to create beans using BeanHelper
, create and instance of this class and initialize it accordingly -
a default BeanFactory
can be passed to the constructor, and additional bean factories can be registered (see
above). Then this instance can be used to create beans from BeanDeclaration
objects. BeanHelper
is
thread-safe. So an instance can be passed around in an application and shared between multiple components.
- Since:
- 1.3
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate static final class
An implementation of theBeanCreationContext
interface used byBeanHelper
to communicate with aBeanFactory
. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final org.apache.commons.beanutils.BeanUtilsBean
A special instance ofBeanUtilsBean
which is used for all property set and copy operations.private final Map
<String, BeanFactory> Stores a map with the registered bean factories.private final BeanFactory
Stores the default bean factory, which is used if no other factory is provided in a bean declaration.static final BeanHelper
A default instance ofBeanHelper
which can be shared between arbitrary components. -
Constructor Summary
ConstructorsConstructorDescriptionConstructs a new instance ofBeanHelper
with the default instance ofDefaultBeanFactory
as defaultBeanFactory
.BeanHelper
(BeanFactory defaultBeanFactory) Constructs a new instance ofBeanHelper
and sets the specified defaultBeanFactory
. -
Method Summary
Modifier and TypeMethodDescriptionstatic void
copyProperties
(Object dest, Object orig) Copies matching properties from the source bean to the destination bean using a specially configuredPropertyUtilsBean
instance.createBean
(BeanDeclaration data) Creates a bean instance for the specified declaration.createBean
(BeanDeclaration data, Class<?> defaultClass) Creates a bean instance for the specified declaration.createBean
(BeanDeclaration data, Class<?> defaultClass, Object param) The main method for creating and initializing beans from a configuration.private BeanCreationContext
createBeanCreationContext
(BeanDeclaration data, Class<?> defaultClass, Object param, BeanFactory factory) Creates aBeanCreationContext
object for the creation of the specified bean.private static Collection
<Object> createPropertyCollection
(String propName, Class<?> propertyClass) Creates a concrete collection instance to populate a property of type collection.static org.apache.commons.beanutils.DynaBean
createWrapDynaBean
(Object bean) Creates aDynaBean
instance which wraps the passed in bean.deregisterBeanFactory
(String name) Deregisters the bean factory with the given name.private static Class
<?> fetchBeanClass
(BeanDeclaration data, Class<?> defaultClass, BeanFactory factory) Determines the class of the bean to be created.private BeanFactory
Obtains the bean factory to use for creating the specified bean.Gets the default bean factory.private static Class
<?> getDefaultClass
(Object bean, String propName) Gets the Class of the property if it can be determined.void
initBean
(Object bean, BeanDeclaration data) Initializes the passed in bean.static void
initBeanProperties
(Object bean, BeanDeclaration data) Initializes the beans properties.private static org.apache.commons.beanutils.BeanUtilsBean
Initializes the sharedBeanUtilsBean
instance.private static void
initProperty
(Object bean, String propName, Object value) Sets a property on the given bean using Common Beanutils.private static boolean
isPropertyWriteable
(Object bean, String propName) Tests whether the specified property of the given bean instance supports write access.(package private) static Class
<?> Loads aClass
object for the specified name.void
registerBeanFactory
(String name, BeanFactory factory) Registers a bean factory under a symbolic name.Gets a set with the names of all currently registered bean factories.static void
setProperty
(Object bean, String propName, Object value) Sets a property on the bean only if the property exists
-
Field Details
-
INSTANCE
A default instance ofBeanHelper
which can be shared between arbitrary components. If no special configuration is needed, this instance can be used throughout an application. Otherwise, new instances can be created with their own configuration. -
BEAN_UTILS_BEAN
private static final org.apache.commons.beanutils.BeanUtilsBean BEAN_UTILS_BEANA special instance ofBeanUtilsBean
which is used for all property set and copy operations. This instance was initialized withBeanIntrospector
objects which support fluent interfaces. This is required for handling builder parameter objects correctly. -
beanFactories
Stores a map with the registered bean factories. -
defaultBeanFactory
Stores the default bean factory, which is used if no other factory is provided in a bean declaration.
-
-
Constructor Details
-
BeanHelper
public BeanHelper()Constructs a new instance ofBeanHelper
with the default instance ofDefaultBeanFactory
as defaultBeanFactory
. -
BeanHelper
Constructs a new instance ofBeanHelper
and sets the specified defaultBeanFactory
.- Parameters:
defaultBeanFactory
- the defaultBeanFactory
(can be null, then a default instance is used)
-
-
Method Details
-
registerBeanFactory
Registers a bean factory under a symbolic name. This factory object can then be specified in bean declarations with the effect that this factory will be used to obtain an instance for the corresponding bean declaration.- Parameters:
name
- the name of the factoryfactory
- the factory to be registered
-
deregisterBeanFactory
Deregisters the bean factory with the given name. After that this factory cannot be used any longer.- Parameters:
name
- the name of the factory to be deregistered- Returns:
- the factory that was registered under this name; null if there was no such factory
-
registeredFactoryNames
Gets a set with the names of all currently registered bean factories.- Returns:
- a set with the names of the registered bean factories
-
getDefaultBeanFactory
Gets the default bean factory.- Returns:
- the default bean factory
-
initBean
Initializes the passed in bean. This method will obtain all the bean's properties that are defined in the passed in bean declaration. These properties will be set on the bean. If necessary, further beans will be created recursively.- Parameters:
bean
- the bean to be initializeddata
- the bean declaration- Throws:
ConfigurationRuntimeException
- if a property cannot be set
-
initBeanProperties
Initializes the beans properties.- Parameters:
bean
- the bean to be initializeddata
- the bean declaration- Throws:
ConfigurationRuntimeException
- if a property cannot be set
-
createWrapDynaBean
Creates aDynaBean
instance which wraps the passed in bean.- Parameters:
bean
- the bean to be wrapped (must not be null)- Returns:
- a
DynaBean
wrapping the passed in bean - Throws:
IllegalArgumentException
- if the bean is null- Since:
- 2.0
-
copyProperties
public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException Copies matching properties from the source bean to the destination bean using a specially configuredPropertyUtilsBean
instance. This method ensures that enhanced introspection is enabled when doing the copy operation.- Parameters:
dest
- the destination beanorig
- the source bean- Throws:
NoSuchMethodException
- exception thrown byPropertyUtilsBean
InvocationTargetException
- exception thrown byPropertyUtilsBean
IllegalAccessException
- exception thrown byPropertyUtilsBean
- Since:
- 2.0
-
getDefaultClass
Gets the Class of the property if it can be determined.- Parameters:
bean
- The bean containing the property.propName
- The name of the property.- Returns:
- The class associated with the property or null.
-
initProperty
Sets a property on the given bean using Common Beanutils.- Parameters:
bean
- the beanpropName
- the name of the propertyvalue
- the property's value- Throws:
ConfigurationRuntimeException
- if the property is not writable or an error occurred
-
createPropertyCollection
Creates a concrete collection instance to populate a property of type collection. This method tries to guess an appropriate collection type. Mostly the type of the property will be one of the collection interfaces rather than a concrete class; so we have to create a concrete equivalent.- Parameters:
propName
- the name of the collection propertypropertyClass
- the type of the property- Returns:
- the newly created collection
-
setProperty
Sets a property on the bean only if the property exists- Parameters:
bean
- the beanpropName
- the name of the propertyvalue
- the property's value- Throws:
ConfigurationRuntimeException
- if the property is not writable or an error occurred
-
createBean
The main method for creating and initializing beans from a configuration. This method will return an initialized instance of the bean class specified in the passed in bean declaration. If this declaration does not contain the class of the bean, the passed in default class will be used. From the bean declaration the factory to be used for creating the bean is queried. The declaration may here return null, then a default factory is used. This factory is then invoked to perform the create operation.- Parameters:
data
- the bean declarationdefaultClass
- the default class to useparam
- an additional parameter that will be passed to the bean factory; some factories may support parameters and behave different depending on the value passed in here- Returns:
- the new bean
- Throws:
ConfigurationRuntimeException
- if an error occurs
-
createBean
Creates a bean instance for the specified declaration. This method is a short cut forcreateBean(data, null, null);
.- Parameters:
data
- the bean declarationdefaultClass
- the class to be used when in the declaration no class is specified- Returns:
- the new bean
- Throws:
ConfigurationRuntimeException
- if an error occurs
-
createBean
Creates a bean instance for the specified declaration. This method is a short cut forcreateBean(data, null);
.- Parameters:
data
- the bean declaration- Returns:
- the new bean
- Throws:
ConfigurationRuntimeException
- if an error occurs
-
loadClass
Loads aClass
object for the specified name. Because class loading can be tricky in some environments the code for retrieving a class by its name was extracted into this helper method. So if changes are necessary, they can be made at a single place.- Parameters:
name
- the name of the class to be loaded- Returns:
- the class object for the specified name
- Throws:
ClassNotFoundException
- if the class cannot be loaded
-
isPropertyWriteable
Tests whether the specified property of the given bean instance supports write access.- Parameters:
bean
- the bean instancepropName
- the name of the property in question- Returns:
- true if this property can be written, false otherwise
-
fetchBeanClass
private static Class<?> fetchBeanClass(BeanDeclaration data, Class<?> defaultClass, BeanFactory factory) Determines the class of the bean to be created. If the bean declaration contains a class name, this class is used. Otherwise it is checked whether a default class is provided. If this is not the case, the factory's default class is used. If this class is undefined, too, an exception is thrown.- Parameters:
data
- the bean declarationdefaultClass
- the default classfactory
- the bean factory to use- Returns:
- the class of the bean to be created
- Throws:
ConfigurationRuntimeException
- if the class cannot be determined
-
fetchBeanFactory
Obtains the bean factory to use for creating the specified bean. This method will check whether a factory is specified in the bean declaration. If this is not the case, the default bean factory will be used.- Parameters:
data
- the bean declaration- Returns:
- the bean factory to use
- Throws:
ConfigurationRuntimeException
- if the factory cannot be determined
-
createBeanCreationContext
private BeanCreationContext createBeanCreationContext(BeanDeclaration data, Class<?> defaultClass, Object param, BeanFactory factory) Creates aBeanCreationContext
object for the creation of the specified bean.- Parameters:
data
- the bean declarationdefaultClass
- the default class to useparam
- an additional parameter that will be passed to the bean factory; some factories may support parameters and behave different depending on the value passed in herefactory
- the current bean factory- Returns:
- the
BeanCreationContext
- Throws:
ConfigurationRuntimeException
- if the bean class cannot be determined
-
initBeanUtilsBean
private static org.apache.commons.beanutils.BeanUtilsBean initBeanUtilsBean()Initializes the sharedBeanUtilsBean
instance. This method sets up custom bean introspection in a way that fluent parameter interfaces are supported.- Returns:
- the
BeanUtilsBean
instance to be used for all property set operations
-