FactoryBean implementation that takes an interface which must have one or more
methods with the signatures MyType xxx() or MyType xxx(MyIdType id)
(typically, MyService getService() or MyService getService(String id))
and creates a dynamic proxy which implements that interface, delegating to an
underlying org.springframework.beans.factory.BeanFactory .
Such service locators permit the decoupling of calling code from
the org. API, by using an
appropriate custom locator interface. They will typically be used for
prototype beans, i.e. for factory methods that are supposed to
return a new instance for each call. The client receives a reference to the
service locator via setter or constructor injection, to be able to invoke
the locator's factory methods on demand. For singleton beans, direct
setter or constructor injection of the target bean is preferable.
On invocation of the no-arg factory method, or the single-arg factory
method with a String id of null or empty String, if exactly
one bean in the factory matches the return type of the factory
method, that bean is returned, otherwise a
org.
is thrown.
On invocation of the single-arg factory method with a non-null (and
non-empty) argument, the proxy returns the result of a
org. call,
using a stringified version of the passed-in id as bean name.
A factory method argument will usually be a String, but can also be an
int or a custom enumeration type, for example, stringified via
toString. The resulting String can be used as bean name as-is,
provided that corresponding beans are defined in the bean factory.
Alternatively, a custom
mapping between service IDs and bean names can be defined.
By way of an example, consider the following service locator interface. Note that this interface is not dependent on any Spring APIs.
package a.b.c;
public interface ServiceFactory {
public MyService getService();
}
A sample config in an XML-based
org. might look as follows:
<beans>
<!-- Prototype bean since we have state -->
<bean id="myService" class="a.b.c.MyService" singleton="false"/>
<!-- will lookup the above 'myService' bean by *TYPE* -->
<bean id="myServiceFactory"
class="org.springframework.beans.factory.config.ServiceLocatorFactoryBean">
<property name="serviceLocatorInterface" value="a.b.c.ServiceFactory"/>
</bean>
<bean id="clientBean" class="a.b.c.MyClientBean">
<property name="myServiceFactory" ref="myServiceFactory"/>
</bean>
</beans>
The attendant MyClientBean class implementation might then
look something like this:
package a.b.c;
public class MyClientBean {
private ServiceFactory myServiceFactory;
// actual implementation provided by the Spring container
public void setServiceFactory(ServiceFactory myServiceFactory) {
this.myServiceFactory = myServiceFactory;
}
public void someBusinessMethod() {
// get a 'fresh', brand new MyService instance
MyService service = this.myServiceFactory.getService();
// use the service object to effect the business logic...
}
}
By way of an example that looks up a bean by name, consider the following service locator interface. Again, note that this interface is not dependent on any Spring APIs.
package a.b.c;
public interface ServiceFactory {
public MyService getService (String serviceName);
}
A sample config in an XML-based
org. might look as follows:
<beans>
<!-- Prototype beans since we have state (both extend MyService) -->
<bean id="specialService" class="a.b.c.SpecialService" singleton="false"/>
<bean id="anotherService" class="a.b.c.AnotherService" singleton="false"/>
<bean id="myServiceFactory"
class="org.springframework.beans.factory.config.ServiceLocatorFactoryBean">
<property name="serviceLocatorInterface" value="a.b.c.ServiceFactory"/>
</bean>
<bean id="clientBean" class="a.b.c.MyClientBean">
<property name="myServiceFactory" ref="myServiceFactory"/>
</bean>
</beans>
The attendant MyClientBean class implementation might then
look something like this:
package a.b.c;
public class MyClientBean {
private ServiceFactory myServiceFactory;
// actual implementation provided by the Spring container
public void setServiceFactory(ServiceFactory myServiceFactory) {
this.myServiceFactory = myServiceFactory;
}
public void someBusinessMethod() {
// get a 'fresh', brand new MyService instance
MyService service = this.myServiceFactory.getService("specialService");
// use the service object to effect the business logic...
}
public void anotherBusinessMethod() {
// get a 'fresh', brand new MyService instance
MyService service = this.myServiceFactory.getService("anotherService");
// use the service object to effect the business logic...
}
}
See ObjectFactoryCreatingFactoryBean for an alternate approach.
setServiceLocatorInterface, setServiceMappings, ObjectFactoryCreatingFactoryBean
| Modifier and Type | Class and Description |
|---|---|
| private class | ServiceLocatorFactoryBean.ServiceLocatorInvocationHandler
Invocation handler that delegates service locator calls to the bean factory. |
| Modifier and Type | Field and Description |
|---|---|
| private ListableBeanFactory | |
| private Object | |
| private Constructor | |
| private Class | |
| private Properties |
| Access | Constructor and Description |
|---|---|
| public |
| Modifier and Type | Method and Description |
|---|---|
| public void | afterPropertiesSet()
Implements org. BeanFactory after it has set all bean properties
and satisfied BeanFactoryAware, ApplicationContextAware etc.
This method allows the bean instance to perform validation of its overall configuration and final initialization when all bean properties have been set. |
| protected Exception | Returns: the service locator exception to throwthe constructor to use exceptionConstructor, BeansException the cause of the service lookup failure cause)Create a service locator exception for the given cause. |
| protected Constructor | Returns: the constructor to usethe exception class exceptionClass)Determine the constructor to use for the given service locator exception class. |
| public Object | getObject()
Implements org. |
| public Class | getObjectType()
Implements org. null if not known in advance.
|
| public boolean | isSingleton()
Overrides default org. |
| public void | setBeanFactory(BeanFactory
owning BeanFactory (never beanFactory)null).
The bean can immediately call methods on the factory.Implements org. |
| public void | setServiceLocatorExceptionClass(Class<? extends Exception> serviceLocatorExceptionClass)
Set the exception class that the service locator should throw if service lookup failed. |
| public void | setServiceLocatorInterface(Class<?> interfaceType)
Set the service locator interface to use, which must have one or more methods with
the signatures |
| public void | setServiceMappings(Properties
mappings between service ids and bean names,
with service ids as keys as bean names as values serviceMappings)Set mappings between service ids (passed into the service locator) and bean names (in the bean factory). |
| beanFactory | back to summary |
|---|---|
| private ListableBeanFactory beanFactory
| |
| proxy | back to summary |
|---|---|
| private Object proxy
| |
| serviceLocatorExceptionConstructor | back to summary |
|---|---|
| private Constructor<Exception> serviceLocatorExceptionConstructor
| |
| serviceLocatorInterface | back to summary |
|---|---|
| private Class<?> serviceLocatorInterface
| |
| serviceMappings | back to summary |
|---|---|
| private Properties serviceMappings
| |
| ServiceLocatorFactoryBean | back to summary |
|---|---|
| public ServiceLocatorFactoryBean() | |
| afterPropertiesSet | back to summary |
|---|---|
| public void afterPropertiesSet() Implements org. Doc from org. Invoked by the containing This method allows the bean instance to perform validation of its overall configuration and final initialization when all bean properties have been set.
| |
| createServiceLocatorException | back to summary |
|---|---|
| protected Exception createServiceLocatorException(Constructor<Exception> exceptionConstructor, BeansException cause) Create a service locator exception for the given cause. Only called in case of a custom service locator exception. The default implementation can handle all variations of message and exception arguments.
| |
| determineServiceLocatorExceptionConstructor | back to summary |
|---|---|
| protected Constructor Determine the constructor to use for the given service locator exception class. Only called in case of a custom service locator exception. The default implementation looks for a constructor with one of the
following parameter types:
| |
| getObject | back to summary |
|---|---|
| public Object getObject() Implements org. Doc from org. Return an instance (possibly shared or independent) of the object managed by this factory. As with a If this FactoryBean is not fully initialized yet at the time of
the call (for example because it is involved in a circular reference),
throw a corresponding As of Spring 2.0, FactoryBeans are allowed to return | |
| getObjectType | back to summary |
|---|---|
| public Class Implements org. Doc from org. Return the type of object that this FactoryBean creates,
or This allows one to check for specific types of beans without instantiating objects, for example on autowiring. In the case of implementations that are creating a singleton object, this method should try to avoid singleton creation as far as possible; it should rather estimate the type in advance. For prototypes, returning a meaningful type here is advisable too. This method can be called before this FactoryBean has been fully initialized. It must not rely on state created during initialization; of course, it can still use such state if available. Note Autowiring will simply ignore FactoryBeans that return
| |
| isSingleton | back to summary |
|---|---|
| public boolean isSingleton() Overrides default org. Doc from org. Is the object managed by this factory a singleton? That is,
will Note If a FactoryBean indicates to hold a singleton object,
the object returned from The singleton status of the FactoryBean itself will generally be provided by the owning BeanFactory; usually, it has to be defined as singleton there. Note This method returning The default implementation returns
| |
| setBeanFactory | back to summary |
|---|---|
| public void setBeanFactory(BeanFactory beanFactory) throws BeansException Implements org. Doc from org. Callback that supplies the owning factory to a bean instance. Invoked after the population of normal bean properties
but before an initialization callback such as
| |
| setServiceLocatorExceptionClass | back to summary |
|---|---|
| public void setServiceLocatorExceptionClass(Class<? extends Exception> serviceLocatorExceptionClass) Set the exception class that the service locator should throw if service
lookup failed. The specified exception class must have a constructor
with one of the following parameter types: If not specified, subclasses of Spring's BeansException will be thrown, for example NoSuchBeanDefinitionException. As those are unchecked, the caller does not need to handle them, so it might be acceptable that Spring exceptions get thrown as long as they are just handled generically. | |
| setServiceLocatorInterface | back to summary |
|---|---|
| public void setServiceLocatorInterface(Class<?> interfaceType) Set the service locator interface to use, which must have one or more methods with
the signatures | |
| setServiceMappings | back to summary |
|---|---|
| public void setServiceMappings(Properties serviceMappings) Set mappings between service ids (passed into the service locator) and bean names (in the bean factory). Service ids that are not defined here will be treated as bean names as-is. The empty string as service id key defines the mapping for
| |
| Access | Constructor and Description |
|---|---|
| private |
| Modifier and Type | Method and Description |
|---|---|
| private Class | |
| public Object | invoke(Object
the proxy instance that the method was invoked on proxy, Method the method, Object[] Method instance corresponding to
the interface method invoked on the proxy instance. The declaring
class of the Method object will be the interface that
the method was declared in, which may be a superinterface of the
proxy interface that the proxy class inherits the method through.an array of objects containing the values of the
arguments passed in the method invocation on the proxy instance,
or args)null if interface method takes no arguments.
Arguments of primitive types are wrapped in instances of the
appropriate primitive wrapper class, such as
java.lang.Integer or java.lang.Boolean.Implements java. |
| private Object | |
| private String |
| ServiceLocatorInvocationHandler | back to summary |
|---|---|
| private ServiceLocatorInvocationHandler() | |
| getServiceLocatorMethodReturnType | back to summary |
|---|---|
| private Class | |
| invoke | back to summary |
|---|---|
| public Object invoke(Object proxy, Method method, Object[] args) throws Throwable Implements java. Doc from java. Processes a method invocation on a proxy instance and returns the result. This method will be invoked on an invocation handler when a method is invoked on a proxy instance that it is associated with.
| |
| invokeServiceLocatorMethod | back to summary |
|---|---|
| private Object invokeServiceLocatorMethod(Method method, Object[] args) throws Exception | |
| tryGetBeanName | back to summary |
|---|---|
| private String tryGetBeanName(Object[] args) Check whether a service id was passed in. | |