| 
 | ||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||
java.lang.Objectorg.springframework.beans.factory.config.ServiceLocatorFactoryBean
public class ServiceLocatorFactoryBean
A 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 BeanFactory.
 
Such service locators permit the decoupling of calling code from
 the BeanFactory 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
 NoSuchBeanDefinitionException
 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
 BeanFactory.getBean(String) 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 dependant on any Spring APIs.
package a.b.c;
public interface ServiceFactory {
    public MyService getService ();
}
 A sample config in an XML-based
 BeanFactory 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 dependant on any Spring APIs.
package a.b.c;
public interface ServiceFactory {
    public MyService getService (String serviceName);
}
 A sample config in an XML-based
 BeanFactory 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(java.lang.Class), 
setServiceMappings(java.util.Properties), 
ObjectFactoryCreatingFactoryBean| Constructor Summary | |
|---|---|
| ServiceLocatorFactoryBean() | |
| Method Summary | |
|---|---|
|  void | afterPropertiesSet()Invoked by a BeanFactory after it has set all bean properties supplied (and satisfied BeanFactoryAware and ApplicationContextAware). | 
| protected  Exception | createServiceLocatorException(Constructor exceptionConstructor,
                              BeansException cause)Create a service locator exception for the given cause. | 
| protected  Constructor | determineServiceLocatorExceptionConstructor(Class exceptionClass)Determine the constructor to use for the given service locator exception class. | 
|  Object | getObject()Return an instance (possibly shared or independent) of the object managed by this factory. | 
|  Class | getObjectType()Return the type of object that this FactoryBean creates, or nullif not known in advance. | 
|  boolean | isSingleton()Is the object managed by this factory a singleton? | 
|  void | setBeanFactory(BeanFactory beanFactory)Callback that supplies the owning factory to a bean instance. | 
|  void | setServiceLocatorExceptionClass(Class serviceLocatorExceptionClass)Set the exception class that the service locator should throw if service lookup failed. | 
|  void | setServiceLocatorInterface(Class interfaceType)Set the service locator interface to use, which must have one or more methods with the signatures MyType xxx()orMyType xxx(MyIdType id)(typically,MyService getService()orMyService getService(String id)). | 
|  void | setServiceMappings(Properties serviceMappings)Set mappings between service ids (passed into the service locator) and bean names (in the bean factory). | 
| Methods inherited from class java.lang.Object | 
|---|
| clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | 
| Constructor Detail | 
|---|
public ServiceLocatorFactoryBean()
| Method Detail | 
|---|
public void setServiceLocatorInterface(Class interfaceType)
MyType xxx() or MyType xxx(MyIdType id)
 (typically, MyService getService() or MyService getService(String id)).
 See the class-level Javadoc for
 information on the semantics of such methods.
public void setServiceLocatorExceptionClass(Class serviceLocatorExceptionClass)
(String, Throwable)
 or (Throwable) or (String).
 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.
determineServiceLocatorExceptionConstructor(java.lang.Class), 
createServiceLocatorException(java.lang.reflect.Constructor, org.springframework.beans.BeansException)public void setServiceMappings(Properties serviceMappings)
The empty string as service id key defines the mapping for null and
 empty string, and for factory methods without parameter. If not defined,
 a single matching bean will be retrieved from the bean factory.
serviceMappings - mappings between service ids and bean names,
 with service ids as keys as bean names as values
public void setBeanFactory(BeanFactory beanFactory)
                    throws BeansException
BeanFactoryAwareInvoked after the population of normal bean properties
 but before an initialization callback such as
 InitializingBean.afterPropertiesSet() or a custom init-method.
setBeanFactory in interface BeanFactoryAwarebeanFactory - owning BeanFactory (never null).
 The bean can immediately call methods on the factory.
BeansException - in case of initialization errorsBeanInitializationExceptionpublic void afterPropertiesSet()
InitializingBeanThis method allows the bean instance to perform initialization only possible when all bean properties have been set and to throw an exception in the event of misconfiguration.
afterPropertiesSet in interface InitializingBeanprotected Constructor determineServiceLocatorExceptionConstructor(Class exceptionClass)
The default implementation looks for a constructor with one of the
 following parameter types: (String, Throwable)
 or (Throwable) or (String).
exceptionClass - the exception class
setServiceLocatorExceptionClass(java.lang.Class)
protected Exception createServiceLocatorException(Constructor exceptionConstructor,
                                                  BeansException cause)
The default implementation can handle all variations of message and exception arguments.
exceptionConstructor - the constructor to usecause - the cause of the service lookup failure
setServiceLocatorExceptionClass(java.lang.Class)public Object getObject()
FactoryBeanAs with a BeanFactory, this allows support for both the
 Singleton and Prototype design pattern.
 
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 FactoryBeanNotInitializedException.
 
As of Spring 2.0, FactoryBeans are allowed to return null
 objects. The factory will consider this as normal value to be used; it
 will not throw a FactoryBeanNotInitializedException in this case anymore.
 FactoryBean implementations are encouraged to throw
 FactoryBeanNotInitializedException themselves now, as appropriate.
getObject in interface FactoryBeannull)FactoryBeanNotInitializedExceptionpublic Class getObjectType()
FactoryBeannull if not known in advance.
 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
 null here. Therefore it is highly recommended to implement
 this method properly, using the current state of the FactoryBean.
getObjectType in interface FactoryBeannull if not known at the time of the callListableBeanFactory.getBeansOfType(java.lang.Class)public boolean isSingleton()
FactoryBeanFactoryBean.getObject() always return the same object
 (a reference that can be cached)?
 NOTE: If a FactoryBean indicates to hold a singleton object,
 the object returned from getObject() might get cached
 by the owning BeanFactory. Hence, do not return true
 unless the FactoryBean always exposes the same reference.
 
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 false does not
 necessarily indicate that returned objects are independent instances.
 An implementation of the extended SmartFactoryBean interface
 may explicitly indicate independent instances through its
 SmartFactoryBean.isPrototype() method. Plain FactoryBean
 implementations which do not implement this extended interface are
 simply assumed to always return independent instances if the
 isSingleton() implementation returns false.
isSingleton in interface FactoryBeanFactoryBean.getObject(), 
SmartFactoryBean.isPrototype()| 
 | ||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||