Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
con Spring
2. Contenedor IoC
Introduccin
Creacin de objetos
Inyeccin de dependencias.
Paquetes
org.springframework.beans
org.springframework.context
BeanFactory
Framework de configuracin
Funcionalidad Bsica
ApplicationContext
Funcionalidad Empresarial
Integracion AOP
Internacionalizacin
Eventos
Contextos especficos (WebApplicationContext)
Application Context
StandAlone
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
Aplicaciones Web
No es necesario normalmente escribir cdigo
Se escribe en el web.xml
Vista bsica
Configuracin
Ficheros XML
Anotaciones JAVA
Cdigo JAVA
Ficheros XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
</beans>
Crear Contexto StandAlone
ApplicationContext context =
new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});
Terminar Contexto StandAlone
ctx.registerShutdownHook();
Importar Metadatos
<beans>
<import resource="services.xml"/>
<import resource="resources/messageSource.xml"/>
<import resource="/resources/themeSource.xml"/>
</beans>
Mtodo getBean()
// create and configure beans
ApplicationContext context =
new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});
<bean id="clientService"
class="examples.ClientService"
factory-method="createInstance"/>
<!-- the factory bean, which contains a method called createInstance() -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- inject any dependencies required by this locator bean -->
</bean>
</beans>
Constructor Ejemplos
Typado explicito
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg type="int" value="7500000"/>
<constructor-arg type="java.lang.String" value="42"/>
</bean>
Constructor Ejemplos
Indice explicito
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg index="0" value="7500000"/>
<constructor-arg index="1" value="42"/>
</bean>
Constructor - Ejemplos
Nombre de parametro
Es necesario compilar con informacin de debug
Existe la posibilidad de usar la anotacion
@ConstructorProperties
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg name="years" value="7500000"/>
<constructor-arg name="ultimateanswer" value="42"/>
</bean>
@ConstructorProperties({"years", "ultimateAnswer"})
public ExampleBean(int years, String ultimateAnswer) {
this.years = years;
this.ultimateAnswer = ultimateAnswer;
}
Metodo setter
Es el mtodo ms usado
public class SimpleMovieLister {
<beans default-lazy-init="true">
<!-- no beans will be pre-instantiated... -->
</beans>
Autoconexin
Es poible que spring compruebe qu beans necesita un bean
determinado y establecerselo sin necesidad de definirlo explicitamente.
En algunos casos puede ser peligroso
Es preferible realizar alguna convencin de nombres para los beans
Atributo autowire (bean)
no Por defecto, no realiza autoescritura
byName Por nombre (metodo setter)
byType Por tipo, si existieran dos mtodos setter con el mismo produce
excepcin
constructor Igual que por tipo pero en el constructor
Atributo autowire-candidate
Excluye un bean como candidato para autoeconexin
Ambito de los Bean
singleton Por defecto, solo se crea uno por
contenedor IoC
prototype Se crea uno por peticin del bean
request Uno por HTTP Request (Solo para web
aplication context)
session Uno por HTTP Session (Solo para web
application context)
Prototype
Se crea uno siempre que se realiza una peticin al
bean
Por una propiedad
llamada a getBean().
No maneja todo el ciclo de vida.
Solo maneja el ciclo de vida de inicializacin
Nunca maneja el ciclo de vida de destruccin.
Singleton Prototype
Si un bean singleton, tiene una referencia a un
bean prototype, solo se crear uno para el bean.
Cuando un bean singleton necesita una nueva
instancia de un bean cada vez se debe usar
method-injection
Sigleton Prototype 1
public class CommandManager implements ApplicationContextAware {
Retrollamadas de Destruccin
Mtodo acoplado
org.springframework.beans.factory.DisposableBean
void destroy() throws Exception;
Mtodo desacoplado
<bean id="exampleInitBean"
class="examples.ExampleBean" destroy-
method="cleanup"/>
Mtodos por defecto
Desacoplados
<beans default-init-method="init" default-destroy-method=cleanup >
</beans>
Anotaciones
@PostConstruct
@PreDestroy
Interfaces Aware
Interfaces que, si algn bean las implementa, el
framework llama a sus mtodos para realizar o
establecer alguna propiedad.
Se pierde el desacople con el framework
ApplicationContextAware
Referencia el ApplicationContext.
public interface ApplicationContextAware {
<bean id="inheritsWithDifferentClass"
class="org.springframework.beans.DerivedTestBean"
parent="inheritedTestBean" init-method="initialize">
</bean>
Extension Points
BeanPostProcessor
BeanFactoryPostProcessor
FactoryBean
BeanFactoryPostProcessor
Cambian la configuracin de los Beans
Existen algunos implementados de uso general.
PropertyPlaceholderConfigurer
PropertyOverrideConfigurer
PropertyPlaceholderConfigurer
Configura cualquier literal del fichero de
configuracin a travs de ficheros de propiedades.
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:com/foo/jdbc.properties"/>
</bean>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-
class>
</listener>
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
...
</web-app>
Practica 2
Internacionalizacin,
Propiedades, Herencia
Con la aplicacin de la prctica 1, internacionalizar
el mensaje de salida y sacarlo en varios idiomas.
Separar el fichero de configuracin en varios (uno
general, uno de BO y otro DAO).
Sacar a fichero de propiedades el nombre de la
clase que implementa el DAO.
Todas nuestros beans, debern tener acceso a los
mensajes, por tanto, deberan todas ellas tener un
messageSource. Esto se puede realizar con la
herencia de beans.
Practica 3 Probar el autowire
para TercerosBO
Activar autoWire para tercerosBO y comprobar que
funciona la inyeccin del bean tercerosDAO
Practica 4 Pasar a proyecto
WEB
Pasar el proyecto a proyecto WEB (Servlet 2.5)
Configurar el fichero web.xml
Configurar librerias
Comprobar en el log que arranca los beans.