Antes de leer este post, te recomiendo los anteriores para un mejor entendimiento:

Otras Configuraciones

Spring se adapta a nuestros objetos permitiendo configuraciones especificas.

Instanciando con Static Factory Method

En algunos casos tenemos clases que tiene el constructor privado y usamos un metodo static para obtener la instancia de dicha clase:

1
2
3
4
5
6
7
8
9
10
11
12
public class ClientService {
   
   private static ClientService clientService = new ClientService();
   
   //Constructor privado
   private ClientService() {}

   //Metodo static para instanciar la clase
   public static ClientService createInstance() {
      return clientService;
   }
}      
1
<bean id="clientService" class="examples.ClientService" factory-method="createInstance"/>


Instanciando con Instance Factory Method

Otro caso cuando tenemos un bean que instancia otros beans:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Bean para instanciar otros beans
public class DefaultServiceLocator {
   
   private static ClientService clientService = new ClientServiceImpl();

   //Constructor privado
   private DefaultServiceLocator() {}

   //Metodo de instancia para instanciar
   public ClientService createClientService() {
      return clientService;
   }
}
      
1
2
3
4
5
6
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
  <!-- cualqueir dependencia requirida -->
</bean>

<!-- El bean a crear via factory bean -->
<bean id="clientService" factory-bean="serviceLocator" factory-method="createClientService"/>


Factory Method con Argumentos

Aqui podemos pasar argumentos al método factory:

1
2
3
4
5
6
7
8
9
10
public class ExampleBean {

  private ExampleBean(...) { //... }

  public static ExampleBean createInstance (BeanUno beanUno, BeanDos beanDos, int i) {
      ExampleBean eb = new ExampleBean (...);
      // some other operations...
      return eb;
  }
}
1
2
3
4
5
6
7
8
<bean id="exampleBean" class="examples.ExampleBean" factory-method="createInstance">
    <constructor-arg ref="beanUno"/>
    <constructor-arg ref="beanDos"/>
    <constructor-arg value="1"/>
</bean>

<bean id="beanUno" class="examples.BeanUno"/>
<bean id="beanDos" class="examples.BeanDos"/>


Dependencias Indirectas

Algunas veces necesitamos que un bean se instancie después de otro aunque estos no sean dependencias directas. Por alguna razón queremos un orden específico de inicialización. Aquí usamos el atributo depends-on.

1
2
3
4
5
6
7
8
9
<bean id="beanOne" class="ExampleBean" depends-on="manager"/>
<bean id="manager" class="ManagerBean" />

<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao">
    <property name="manager" ref="manager" />
</bean>

<bean id="manager" class="ManagerBean" />
<bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />


Inicialización Lazy

Por defecto los bean se inician todos al levantar el contenedor. Es posible iniciar un bean solo cuando sea llamado. Aunque si un bean lazy es necesitado por uno eager(que se crea al levantar el contendor), el bean lazy será pre-inicializado.

1
2
<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>
<bean name="not.lazy" class="com.foo.AnotherBean"/>



Franky Villadiego

Volando hacia el desarrollo productivo!