Download - Spring Framework - Core
![Page 1: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/1.jpg)
SPRING FRAMEWORK 3.0
Spring Core Dmitry Noskov
Spring Framework - Core
![Page 2: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/2.jpg)
What is Spring?
Dmitry Noskov Spring Framework - Core
Spring is the most popular application development
framework for enterprise Java™. Millions of
developers use Spring to create high performing,
easily testable, reusable code without any lock-in.
![Page 3: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/3.jpg)
The Spring projects
Dmitry Noskov Spring Framework - Core
Spring Framework
Spring MVC
Spring WebFlow
Spring Security
Spring Integration
And …
Spring
Web Services
Spring Data
Spring Batch
Spring Social
![Page 4: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/4.jpg)
History
Goals
Spring modules
Spring triangle
Overview
Dmitry Noskov Spring Framework - Core
![Page 5: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/5.jpg)
Spring Framework history(1)
Dmitry Noskov Spring Framework - Core
the first version was written by Rod Johnson
Expert One-on-One J2EE Design and Development
first released in June 2003
milestone releases in 2004 and 2005
awards
Jolt productivity award
JAX Innovation award
![Page 6: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/6.jpg)
Spring Framework history(2)
Dmitry Noskov Spring Framework - Core
Spring 3.0 (released Dec 2009)
Java 1.5+
REST support, SpEL, more annotations, JavaConfig
Spring 2.5 (released Nov 2007)
Java 1.4+
XML namespaces, annotations
Spring 2.0 (released Oct 2006)
Java 1.3+
AspectJ support, JPA
![Page 7: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/7.jpg)
Goals
Dmitry Noskov Spring Framework - Core
make J2EE easier to use
make the common tasks easier
promote good programming practice
you can focus on the domain problems
![Page 8: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/8.jpg)
What is Spring Framework today?
Dmitry Noskov Spring Framework - Core
an open source application framework
a lightweight solution for enterprise applications
non-invasive (POJO based)
is modular
extendible for other frameworks
de facto standard of Java Enterprise Application
![Page 9: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/9.jpg)
Spring modules
Spring Framework - Core Dmitry Noskov
![Page 10: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/10.jpg)
Core container
Dmitry Noskov Spring Framework - Core
Core and Beans provide the fundamental parts of the framework, including IoC and Dependency
Injection features
Context it is a means to access objects in a framework-style manner that is similar to a JNDI
registry
Expression language provides a powerful expression language for querying and manipulating an object
graph at runtime
![Page 11: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/11.jpg)
AOP, Aspect, Instrumentation
Dmitry Noskov Spring Framework - Core
AOP provides an AOP Alliance-compliant aspect-oriented programming implementation
allowing you to define, for example, method-interceptors and pointcuts to cleanly
decouple code that implements functionality that should be separated
Aspect provides integration with AspectJ
Instrumentation provides class instrumentation support and classloader implementations to be used in
certain application servers
![Page 12: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/12.jpg)
Data Access/Integration
Dmitry Noskov Spring Framework - Core
JDBC - provides a JDBC-abstraction layer
ORM - provides integration layers for popular object-relational mapping APIs,
including JPA, JDO, Hibernate and iBatis
OXM - provides an abstraction layer that supports Object/XML mapping
implementations for JAXB, Castor, XMLBeans, JiBX and XStream.
JMS – contains features for producing and consuming messages.
Transaction - supports programmatic and declarative transaction
management
![Page 13: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/13.jpg)
WEB
Dmitry Noskov Spring Framework - Core
Spring’s WEB provides basic web-oriented integration features
WEB-Servlet Spring’s model-view-controller (MVC) implentation
WEB-Struts contains the classes for integrating a classic Struts WEB tier within a Spring application
WEB-Portlet provides the MVC implementation to be used in a portlet environment
![Page 14: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/14.jpg)
Full-fledged Spring web application
Dmitry Noskov Spring Framework - Core
![Page 15: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/15.jpg)
Using a third-party web framework
Dmitry Noskov Spring Framework - Core
![Page 16: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/16.jpg)
Remoting
Dmitry Noskov Spring Framework - Core
![Page 17: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/17.jpg)
EJB
Dmitry Noskov Spring Framework - Core
![Page 18: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/18.jpg)
The Spring triangle
Dmitry Noskov Spring Framework - Core
![Page 19: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/19.jpg)
IoC pattern
Application lifecycle
Essence of Spring IoC container
Instantiation an ApplicationContext
Spring IoC container
Dmitry Noskov Spring Framework - Core
![Page 20: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/20.jpg)
What is IoC?
Dmitry Noskov Spring Framework - Core
is a concept in application development
"don’t call me, I’ll call you"
one form is Dependency Injection (DI)
![Page 21: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/21.jpg)
Dependency Injection
Dmitry Noskov Spring Framework - Core
is a process whereby objects define their
dependencies, that is, the other objects they work
with, only through constructor arguments, arguments
to a factory method, or properties that are set on
the object instance after it is constructed or returned
from a factory method
exist in two major variants
1) constructor injection
2) setter injection
![Page 22: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/22.jpg)
IoC vs DI vs Factory
Dmitry Noskov Spring Framework - Core
DI it is specific type of IoC
The Factory pattern’s main concerns is creating
The DI’s main concern is how things are connected
together
DI related to Factory and Strategy patterns, but
mostly resembles to Build Pattern
![Page 23: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/23.jpg)
Application lifecycle
Dmitry Noskov Spring Framework - Core
Initialization
• creating services
• allocate resources
Use
• process requests
• 99% of the time
Destruction
• shuts down
• release resources
![Page 24: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/24.jpg)
Essence of IoC container
Dmitry Noskov Spring Framework - Core
![Page 25: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/25.jpg)
Terms
Dmitry Noskov Spring Framework - Core
ApplicationContext
represents the Spring IoC container
bean
is an object that managed by Spring IoC container
BeanDefinition
describe a bean instance
![Page 26: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/26.jpg)
Context lifecycle
Dmitry Noskov Spring Framework - Core
Load definitions
BFPP Instantiation Property injection
BPP Ready to use
![Page 27: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/27.jpg)
Bean lifecycle
Dmitry Noskov Spring Framework - Core
![Page 28: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/28.jpg)
Creating application context
Dmitry Noskov Spring Framework - Core
environments
standalone
WEB
JUnit
EJB
special prefixes
classpath
file system
relative path
![Page 29: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/29.jpg)
Instantiation for standalone
Dmitry Noskov Spring Framework - Core
ClassPathApplicationContext
FileSystemApplicationContext
ApplicationContext context =
new ClassPathXmlApplicationContext(
new String[] {"services.xml", "repositories.xml"});
// retrieve configured instance
CurrencyService currencyService
= context.getBean("currency", CurrencyService.class);
AccountService accountService
= context.getBean(AccountService.class);
![Page 30: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/30.jpg)
Instantiation for WEB applications
<context-param>
<param-name>
contextConfigLocation
</param-name>
<param-value>
/WEB-INF/daoContext.xml
/WEB-INF/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>
context
</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>1
</load-on-startup>
</servlet>
Dmitry Noskov Spring Framework - Core
Servlet 2.4+ Servlet 2.3
![Page 31: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/31.jpg)
Simple
Runtime
WEB
CGLIB / JDK proxies
Bean Scope
Dmitry Noskov Spring Framework - Core
![Page 32: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/32.jpg)
Spring Bean Scopes
Dmitry Noskov Spring Framework - Core
simple
singleton
prototype
runtime
thread
custom implementation
web-aware scopes (available only for web-aware ApplicationContext)
request
session
global session
![Page 33: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/33.jpg)
The singleton scope
Dmitry Noskov Spring Framework - Core
![Page 34: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/34.jpg)
The prototype scope
Dmitry Noskov Spring Framework - Core
![Page 35: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/35.jpg)
Custom scope
Dmitry Noskov Spring Framework - Core
public interface org.springframework.beans.factory.config.Scope {
//Return the object with the given name from the underlying scope
Object get(String name, ObjectFactory<?> objectFactory);
//Remove the object with the given name from the underlying scope.
Object remove(String name);
//Register a callback to be executed on destruction of the specified object
void registerDestructionCallback(String name, Runnable callback);
//Resolve the contextual object for the given key, if any.
Object resolveContextualObject(String key);
//Return the conversation ID for the current underlying scope, if any.
String getConversationId();
}
![Page 36: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/36.jpg)
Using runtime scope
Dmitry Noskov Spring Framework - Core
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
<property name="scopes">
<map>
<entry key="thread">
<bean class="org.springframework.context.support.SimpleThreadScope"/>
</entry>
</map>
</property>
</bean>
<bean id="threadService" class="example.ThreadServiceImpl" scope="thread">
<property name="priority" value="0"/>
<aop:scoped-proxy/>
</bean>
<bean id="threadMonitor" class="example.ThreadMonitorImpl">
<property name="threadService" ref="thredService"/>
</bean>
![Page 37: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/37.jpg)
Scoped bean as dependencies
<bean id="preferences" class="UserPreferences" scope="session">
<aop:scoped-proxy/>
</bean>
<bean id="userManager" class="example.UserManager">
<property name="userPreferences" ref="preferences"/>
</bean>
<bean id="preferences" class="UserPreferences" scope="session">
<aop:scoped-proxy proxy-target-class="false"/>
</bean>
<bean id="userManager" class="example.UserManager">
<property name="userPreferences" ref="preferences"/>
</bean>
Dmitry Noskov Spring Framework - Core
Using CGLIB library (by default)
Using JDK interface based proxies means
![Page 38: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/38.jpg)
WEB-aware scope configuration
<web-app>
<listener>
<listener-class>
org.springframework.web.context.request.
RequestContextListener
</listener-class>
</listener>
</web-app>
<web-app>
<filter>
<filter-name>filter</filter-name>
<filter-class>
…web.filter.RequestContextFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Dmitry Noskov Spring Framework - Core
Servlet 2.4+ Servlet 2.3
![Page 39: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/39.jpg)
Configuration
Main features
Bean lifecycle
Additional features
XML-based configuration
Dmitry Noskov Spring Framework - Core
![Page 40: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/40.jpg)
Namespaces
Dmitry Noskov Spring Framework - Core
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="" class=""></bean>
<bean id="" class=""/>
</beans>
![Page 41: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/41.jpg)
BeanFactoryPostProcessor
Dmitry Noskov Spring Framework - Core
public interface BeanFactoryPostProcessor {
/**
* Modify the application context's internal bean factory after its standard
* initialization. All bean definitions will have been loaded, but no beans
* will have been instantiated yet. This allows for overriding or adding
* properties even to eager-initializing beans.
* @param beanFactory the bean factory used by the application context
* @throws org.springframework.beans.BeansException in case of errors
*/
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory);
}
![Page 42: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/42.jpg)
Instantiating bean
Dmitry Noskov Spring Framework - Core
![Page 43: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/43.jpg)
Naming beans
Dmitry Noskov Spring Framework - Core
<beans>
<bean id="beanId" class="org.exhanger.api.OrderServiceImpl"/>
<bean name="name/" class="org.exhanger.api.OrderServiceImpl"/>
<bean name="name1,name2;name3 name4" class="...">
</bean>
<alias name="fromName" alias="toName"/>
</beans>
![Page 44: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/44.jpg)
Instantiating bean
Dmitry Noskov Spring Framework - Core
with a constructor
with a static factory method
using an instance factory method
with the FactoryBean
![Page 45: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/45.jpg)
Instantiating with a constructor
Dmitry Noskov Spring Framework - Core
simple class <bean id="exampleBean" class="examples.ExampleBean"/>
public class ExampleBean {
public ExampleBean() {}
}
inner class <bean id="innerBean" class="examples.ExampleBean$InnerBean"/>
public class ExampleBean {
public static class InnerBean {
}
}
![Page 46: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/46.jpg)
Instantiating with a static method
Dmitry Noskov Spring Framework - Core
<bean id="clientService" class="examples.ClientService"
factory-method="createInstance"/>
public class ClientService {
private static ClientService clientService = new ClientService();
private ClientService() {}
public static ClientService createInstance() {
return clientService;
}
}
![Page 47: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/47.jpg)
Using an instance factory method
Dmitry Noskov Spring Framework - Core
<!-- the factory bean-->
<bean id="serviceLocator" class="example.ServiceLocator"/>
<!-- the bean to be created via the factory bean -->
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
public class ServiceLocator {
private static ClientService clientService = new ClientService();
public ClientService createClientServiceInstance() {
return clientService;
}
}
![Page 48: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/48.jpg)
Instantiating with the FactoryBean
Dmitry Noskov Spring Framework - Core
public interface FactoryBean<T> {
/**Return an instance of the object managed by this factory.*/
T getObject() throws Exception;
/** Return the type of object that this FactoryBean creates.*/
Class<?> getObjectType();
/**Is the object managed by this factory a singleton? */
boolean isSingleton();
}
<bean id="bean" class="FactoryBean"/>
![Page 49: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/49.jpg)
Dependency injection
Dmitry Noskov Spring Framework - Core
![Page 50: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/50.jpg)
Constructor-based DI
Dmitry Noskov Spring Framework - Core
is accomplished by the container invoking a
constructor with a number of arguments, each
representing a dependency
calling a static factory method with specific
arguments to construct the bean is nearly equivalent
![Page 51: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/51.jpg)
Constructor argument resolution
Dmitry Noskov Spring Framework - Core
argument resolution <bean id="b1" class="org.examples.ClientServiceBean">
<constructor-arg ref="b2"/>
<constructor-arg ref="b3"/>
</bean>
argument type matching <bean id="b2" class="ClientService" factory-method="getInstance">
<constructor-arg type="int" value="7500000"/>
<constructor-arg type="java.lang.String" value="42"/>
</bean>
argument index <bean id="b3" factory-bean="factory" factory-method="getInstance"/>
<constructor-arg index="0" value="75"/>
<constructor-arg index="1" value="42"/>
</bean>
![Page 52: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/52.jpg)
Setter-based DI
Dmitry Noskov Spring Framework - Core
is accomplished by the container calling setter
methods on your beans after invoking a no-
argument constructor or no-argument static factory
method to instantiate bean
![Page 53: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/53.jpg)
Constructor vs setter
Dmitry Noskov Spring Framework - Core
constructor
mandatory dependencies
immutability
setter
optional dependencies and default values
obvious names
auto inheritance
![Page 54: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/54.jpg)
Straight values
Dmitry Noskov Spring Framework - Core
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" >
<!-- results in a setDriverClassName(String) call -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url">
<value>jdbc:mysql://localhost:3306/mydb</value>
</property>
<property name="username" value="root"/>
<property name="password" value="masterkaoli"/>
</bean>
![Page 55: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/55.jpg)
Null and empty values
Dmitry Noskov Spring Framework - Core
<!-- is equivalent to the following code: bean.setEmail("").-->
<bean class="Bean">
<property name="email" value=""/>
</bean>
<!-- The <null/> element handles null values. -->
<bean class="Bean">
<property name="email"><null/></property>
</bean>
![Page 56: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/56.jpg)
properties
Dmitry Noskov Spring Framework - Core
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:jdbc.properties"/>
</bean>
<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" >
<value>${jdbc.url}</value>
</property>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
![Page 57: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/57.jpg)
idref
Dmitry Noskov Spring Framework - Core
bean <bean id="theTargetBean" class="..."/>
<bean id="theClientBean" class="...">
<property name="targetName">
<idref bean="theTargetBean" />
</property>
</bean>
local <property name="targetName">
<!--a bean with id 'theTargetBean' must exist -->
<idref local="theTargetBean"/>
</property>
![Page 58: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/58.jpg)
Reference to other bean
Dmitry Noskov Spring Framework - Core
bean <ref bean="someBean"/>
local <ref local="someBean"/>
parent <!-- in the parent context -->
<bean id="accountService" class="com.foo.SimpleAccountService"/>
<!-- in the child (descendant) context -->
<bean id="accountService" class="org.springframework.ProxyFactoryBean">
<property name="target">
<ref parent="accountService"/>
</property>
</bean>
![Page 59: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/59.jpg)
Inner bean
Dmitry Noskov Spring Framework - Core
<bean id="orderService" class="OrderServiceImpl">
<property name="repository" ref="orderRepository"/>
<property name="builder">
<bean class="OrderBuilderImpl">
<constructor-arg ref="accountService"/>
<constructor-arg ref="currencyService"/>
</bean>
</property>
</bean>
![Page 60: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/60.jpg)
Collections(1)
Dmitry Noskov Spring Framework - Core
<!-- setAdminEmails(java.util.Properties) call -->
<property name="adminEmails">
<props>
<prop key="administrator">[email protected]</prop>
</props>
</property>
<!-- setSomeList(java.util.List) call -->
<property name="someList">
<list>
<value>a list element followed by a reference</value>
<ref bean="myDataSource" />
</list>
</property>
![Page 61: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/61.jpg)
Collections(2)
Dmitry Noskov Spring Framework - Core
<!-- setSomeMap(java.util.Map) call -->
<property name="someMap">
<map>
<entry key="an entry" value="just some string"/>
<entry key ="a ref" value-ref="myDataSource"/>
</map>
</property>
<!-- setSomeSet(java.util.Set) call -->
<property name="someSet">
<set>
<value>just some string</value>
<ref bean="myDataSource" />
</set>
</property>
![Page 62: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/62.jpg)
p namespace
Dmitry Noskov Spring Framework - Core
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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.xsd">
<bean id="orderService" class="OrderServiceImpl"
p:repository-ref="orderRepository"
p:locaton="BY"/>
</beans>
![Page 63: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/63.jpg)
util namespace
Dmitry Noskov Spring Framework - Core
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd">
</beans>
![Page 64: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/64.jpg)
util in action
Dmitry Noskov Spring Framework - Core
<property name="isolation">
<util:constant static-field="java.sql.Connection.TRANSACTION_SERIALIZABLE"/>
</property>
<bean id="testBean" class="org.springframework.beans.TestBean">
<property name="age" value="10"/>
</bean>
<util:property-path id="name" path="testBean.age"/>
<util:properties id="" location="classpath:jdbc.properties"/>
<util:list id="emails" list-class=""><value/><value/></util:list>
<util:map id="emails" map-class=""><entry key="" value=""/></util:map>
<util:set id="emails" set-class=""><value></value></util:set>
![Page 65: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/65.jpg)
Additional features
Dmitry Noskov Spring Framework - Core
bean definition inheritance
importing configuration files
autowiring
lazy initialization
dependency checking
![Page 66: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/66.jpg)
Bean definition inheritance
Dmitry Noskov Spring Framework - Core
<!—attribute class is optional
<bean id="parent" abstract="true" class="AbstractService">
<property name="name" value="parent"/>
<property name="age" value="1"/>
</bean>
<bean id="service" class="ServiceImpl" parent="parent">
<property name="name" value="override it"/>
</bean>
![Page 67: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/67.jpg)
Bean definition inheritance(2)
Dmitry Noskov Spring Framework - Core
<bean id="parent" abstract="true">
<property name="name" value="parent"/>
</bean>
<bean id="default" class="DefaultServiceImpl" parent="parent">
<property name="name" value="default"/>
<property name="value" value="22"/>
</bean>
<bean id="custom" class="CustomServiceImpl" parent="default">
<property name="name" value="custom"/>
</bean>
![Page 68: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/68.jpg)
Importing configuration files
Dmitry Noskov Spring Framework - Core
xml-context-config.xml <beans>
<import resource="classpath:xml-repository-config.xml"/>
<import resource="classpath:xml-service-config.xml"/>
</beans>
xml-service-config.xml <beans>
<bean id="currencyRepository" class="CurrencyMapRepository"/>
</beans>
xml-repository-config.xml <bean id="currencyService" class="CurrencyServiceImpl">
<constructor-arg ref="currencyRepository"/>
</bean>
![Page 69: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/69.jpg)
Using depends-on
Dmitry Noskov Spring Framework - Core
can explicitly force one or more beans to be
initialized before the bean using this element is
initialized
<bean id="beanOne" class="ExampleBean"
depends-on="costService,accountDao">
<property name="deviceManager" ref="deviceManager" />
</bean>
<bean id="costService" class="example.service.CostService" />
<bean id="accountDao" class="example.jdbc.JdbcAccountDao" />
![Page 70: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/70.jpg)
Lazy-initialized beans
Dmitry Noskov Spring Framework - Core
IoC container create a bean instance when it is first
requested <bean id="lazy" class="ExpensiveToCreateBean" lazy-init="true"/>
control lazy-initialization at the container level <beans default-lazy-init="true">
<!-- no beans will be pre-instantiated... -->
</beans>
disadvantages
errors in the configuration or surrounding
environment are detected some time later
![Page 71: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/71.jpg)
Autowiring
Dmitry Noskov Spring Framework - Core
advantages
can significantly reduce the need to specify properties
or constructor arguments
can update a configuration as your objects evolve
disadvantages
cannot autowire simple properties (primitives)
autowiring is less exact than explicit wiring
wiring information may not be available to tools that
may generate documentation from a Spring container
![Page 72: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/72.jpg)
Autowiring modes
Dmitry Noskov Spring Framework - Core
no (default)
byName <bean id="messageSource" class="MessageSourceImpl" />
public void setMessageSource(MessageSource messageSource)
byType <bean id="messageSource" class="MessageSourceImpl" />
public void setMessageSource(MessageSource messageSource)
constructor
autodetect
![Page 73: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/73.jpg)
Dependency checking
Dmitry Noskov Spring Framework - Core
none (default)
simple
checking for primitive types and collections
object
checking for collaborators only
all
![Page 74: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/74.jpg)
Spring Aware Interfaces
Dmitry Noskov Spring Framework - Core
![Page 75: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/75.jpg)
Spring aware interfaces
Dmitry Noskov Spring Framework - Core
BeanNameAware
BeanFactoryAware
ApplicationContextAware
ApplicationEventPublisherAware
ServletConfigAware
ServletContextAware
MessageSourceAware
![Page 76: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/76.jpg)
Application events
Dmitry Noskov Spring Framework - Core
public class SomeService implements ApplicationContextAware {
public void setApplicationContext(ApplicationContext ctx) {}
public void anyMethod(String value) {
context.publishEvent(new AnyEvent(value));
}
}
public class Listener implements ApplicationListener<AnyEvent> {
public void onApplicationEvent(AnyEvent event) {
}
}
![Page 77: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/77.jpg)
Internationalization
Dmitry Noskov Spring Framework - Core
<bean class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list><value>label</value><value>exceptions</value></list>
</property>
</bean>
public interface MessageSource {
/** Try to resolve the message. Return default if no message was found.*/
String getMessage(String code, Object[] args, String default, Locale locale);
/** Try to resolve the message. Treat an error if the message can't be found.*/
String getMessage(String code, Object[] args, Locale locale);
/** Try to resolve the message using MessageSourceResolvable */
String getMessage(MessageSourceResolvable resorvable, Locale locale);
}
![Page 78: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/78.jpg)
Initialization
Dmitry Noskov Spring Framework - Core
![Page 79: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/79.jpg)
BeanPostProcessor
Dmitry Noskov Spring Framework - Core
/**
* ApplicationContexts can autodetect BeanPostProcessor beans in their
* bean definitions and apply them to any beans subsequently created. */
public interface BeanPostProcessor {
/**
* Apply this BeanPostProcessor to the given new bean instance before any bean
* initialization callbacks (like afterPropertiesSet or a custom init-method)*/
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
/**
* Apply this BeanPostProcessor to the given new bean instance after any bean
* initialization callbacks (like afterPropertiesSet or a custom init-method).
*/
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
![Page 80: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/80.jpg)
Initialization callbacks
Dmitry Noskov Spring Framework - Core
<bean id="bean1" class="exampl.ExampleBean1" init-method="init"/>
public class ExampleBean1 {
public void init() {}
}
<bean id="bean2" class="examples.ExampleBean2"/>
public class ExampleBean2 implements InitializingBean {
public void afterPropertiesSet() {}
}
public class ExampleBean2 {
@PostConstruct
public void initialize() {}
}
![Page 81: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/81.jpg)
Destroy Spring Beans
Dmitry Noskov Spring Framework - Core
![Page 82: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/82.jpg)
Destruction callbacks
Dmitry Noskov Spring Framework - Core
<bean id="bean1" class="example.Bean1" destroy-method="cleanup"/>
public class Bean1 {
public void cleanup() {}
}
<bean id="bean2" class="example.Bean2"/>
public class Bean2 implements DisposableBean {
public void destroy() {}
}
public class Bean2 {
@PreDestroy
public void destroy() {}
}
![Page 83: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/83.jpg)
Combining lifecycle mechanisms
Dmitry Noskov Spring Framework - Core
initialization methods, are called as follows:
methods annotated with @PostConstruct
afterPropertiesSet as defined by InitializingBean
custom configured init method
destroy methods are called in the same order:
method annotated with @PreDestroy
destroy() as defined by the DisposableBean
custom configured destroy method
![Page 84: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/84.jpg)
Basic annotations
Spring stereotypes
JSR-250
JSR-330
Annotation-based configuration
Dmitry Noskov Spring Framework - Core
![Page 85: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/85.jpg)
Annotation based configuration
Dmitry Noskov Spring Framework - Core
an alternative to XML setups
annotation injections is performed before XML
![Page 86: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/86.jpg)
Basic annotations(1)
Dmitry Noskov Spring Framework - Core
Spring Annotations
@Autowired
@Qualifier
@Required
@Value
JSR 250
@Resource
@PostConstruct
@PreDestroy
![Page 87: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/87.jpg)
Basic annotations(2)
Dmitry Noskov Spring Framework - Core
context
@Scope
@Bean
@DependsOn
@Lazy
transactional
@Transactional
![Page 88: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/88.jpg)
Stereotypical
Dmitry Noskov Spring Framework - Core
@Component
Any component
@Repository
Data access
@Service
Service classes
@Controller
Spring MVC
@Configuration
Java Config
![Page 89: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/89.jpg)
Basic configuration
Dmitry Noskov Spring Framework - Core
<!-- looks for annotations on beans -->
<context:annotation-config/>
<!– scan stereotyped classes and register BeanDefinition -->
<context:component-scan
base-package="org.exhanger.repository.map,org.exhanger.api">
![Page 90: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/90.jpg)
Basic configuration(2)
Dmitry Noskov Spring Framework - Core
<context:component-scan
base-package="org.exhanger"
name-generator="my.NameGeneratorImpl"
resource-pattern="**/*.class"
scope-resolver="my.ScopeResolverImpl"
scoped-proxy="no|interfaces|targetClass">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Service"/>
<context:exclude-filter type="regex"
expression=".*MapRepository"/>
</context:component-scan>
![Page 91: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/91.jpg)
@Value
Dmitry Noskov Spring Framework - Core
@Component("authenticationProvider")
public class EjbAuthenticationProvider {
/** The provider api connection url. */
@Value("${provider.api.url}")
private String apiUrl;
/** The provider api connection username. */
private @Value("${provider.api.username}") String apiUsername;
/** The provider api connection password. */
@Value("${provider.api.password}")
private String apiPassword;
}
![Page 92: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/92.jpg)
@Autowired(1)
Dmitry Noskov Spring Framework - Core
@Service("accountService")
public class AccountServiceImpl {
@Autowired
private AccountRepository repository;
@Autowired
public AccountServiceImpl(AccountRepository repository) {}
@Autowired(required = false)
public void setRepository(AccountRepository repository) {}
@Autowired
public void populate(Repository r, OrderService s) {}
}
![Page 93: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/93.jpg)
@Autowired(2)
Dmitry Noskov Spring Framework - Core
@Service
public class AccountServiceImpl {
@Autowired
private AccountRepository[] repositories;
@Autowired
public AccountServiceImpl(Set<AccountRepository> set) {}
@Autowired(required = false)
public void setRepositories(Map<String,AccountRepository> map){
}
}
![Page 94: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/94.jpg)
@Required(1)
Dmitry Noskov Spring Framework - Core
public class AccountServiceImpl {
private AccountRepository repository;
@Required
public void setRepository(AccountRepository repository) {}
}
<bean name="accountService" class="AccountServiceImpl">
<property name="repository" ref="accountRepository"/>
</bean>
![Page 95: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/95.jpg)
@Required(2)
Dmitry Noskov Spring Framework - Core
public class AccountServiceImpl {
private AccountRepository repository;
@Mandatory
public void setRepository (AccountRepository repository) {}
}
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor">
<property name="requiredAnnotationType" value="my.Mandatory"/>
</bean>
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Mandatory {}
![Page 96: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/96.jpg)
@Qualifier
Dmitry Noskov Spring Framework - Core
public class ReportServiceImpl {
@Autowired
@Qualifier("main")
private DataSource mainDataSource;
@Autowired
@Qualifier("freeDS")
private DataSource freeDataSource;
}
<beans>
<bean class="org.apache.commons.dbcp.BasicDataSource">
<qualifier value="main"/>
</bean>
<bean id="freeDS" class="org.apache.commons.dbcp.BasicDataSource"/>
</beans>
![Page 97: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/97.jpg)
@Resource
Dmitry Noskov Spring Framework - Core
public class AccountServiceImpl {
@Resource(name = "orderService")
private OrderService orderService;
@Resource(name = "orderService")
public void setOrderService(OrderService orderService) {}
@Resource
private AuditService auditService;
@Resource
public void setAuditService(AuditService auditService) {}
}
![Page 98: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/98.jpg)
@Scope
Dmitry Noskov Spring Framework - Core
@Service
@Scope("prototype")
public class AccountServiceImpl implements AccountService {
}
@Service
@Scope(value = BeanDefinition.SCOPE_PROTOTYPE,
proxyMode = ScopedProxyMode.TARGET_CLASS)
public class AccountServiceImpl implements AccountService {
}
![Page 99: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/99.jpg)
@Lazy & @DependsOn
Dmitry Noskov Spring Framework - Core
@Lazy
@Service
@DependsOn({"orderService", "currencyService"})
public class AccountServiceImpl implements AccountService {
}
![Page 100: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/100.jpg)
Factory method component
Dmitry Noskov Spring Framework - Core
@Component
public class CurrencyRepositoryFactory {
@Bean
@Lazy
@Scope("prototype")
@Qualifier("public")
public CurrencyRepository getCurrencyRepository() {
return new CurrencyMapRepository();
}
}
![Page 101: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/101.jpg)
JSR 330
Dmitry Noskov Spring Framework - Core
@Named
@Singleton
public class AccountServiceImpl implements AccountService {
@Inject
private AccountRepository repository;
@Inject
public AccountServiceImpl(@Named("default") AccountRepository r) {}
@Inject
public void setAccountRepository(AccountRepository repository) {}
}
![Page 102: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/102.jpg)
@Autowired vs @Inject
Dmitry Noskov Spring Framework - Core
Spring JSR-330 JSR-330 restrictions
@Autowired @Inject has no ‘required’ attribute
@Component @Named
@Scope @Scope only for meta-annotations and injection points
@Scope @Singleton default scope is like ‘prototype’
@Qualifier @Named
@Value X
@Required X
@Lazy X
![Page 103: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/103.jpg)
Configuration
Basic annotations
Java-based configuration
Dmitry Noskov Spring Framework - Core
![Page 104: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/104.jpg)
Instantiatiating for standalone
Dmitry Noskov Spring Framework - Core
simple new AnnotationConfigApplicationContext(ExchangerConfig.class);
programmaticaly context = new AnnotationConfigApplicationContext();
context.register(ExchangerConfig.class);
context.refresh();
scanning context = new AnnotationConfigApplicationContext();
context.scan("org.exchanger.config");
context.refresh();
![Page 105: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/105.jpg)
Instantiating bean
Dmitry Noskov Spring Framework - Core
@Configuration
public class ExchangerRepositoryConfg {
@Bean(name = "accountRepository", initMethod = "init")
public AccountRepository accountRepository() {
return new AccountMapRepository();
}
@Bean
public AuditRepository auditRepository() {
return new AuditMapRepository();
}
}
![Page 106: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/106.jpg)
@Import
Dmitry Noskov Spring Framework - Core
@Configuration
@Import({RepositoryConfig.class, ServiceConfig.class})
public class ExchangerConfig {
}
@Configuration
public class RepositoryConfg {}
@Configuration
public class ServiceConfig {}
![Page 107: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/107.jpg)
@ImportResources
Dmitry Noskov Spring Framework - Core
@Configuration
@ImportResource("classpath:jdbc.properties")
public class ExchangerConfig {
@Value("jdbc.url")
private String jdbcUrl;
@Bean
public DataSourse dataSource() {
return new SimpleDataSource(jdbcUrl);
}
}
![Page 108: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/108.jpg)
Dependency injection
Dmitry Noskov Spring Framework - Core
@Configuration
public class ExchangerServiceConfig {
@Autowired
private CurrencyRepository currencyRepository;
public @Bean CurrencyService currencyService() {
return new CurrencyServiceImpl(currencyRepository);
}
@Bean(name = {"orderBuilder", "builder"})
public OrderBuilder orderBuilder() {
return new OrderBuilder(currencyService(), accountService());
}
}
![Page 109: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/109.jpg)
Benefits of IoC
Context lifecycle
Mix and match
Summary
Dmitry Noskov Spring Framework - Core
![Page 110: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/110.jpg)
Benefits of IoC
Dmitry Noskov Spring Framework - Core
minimizes the amount of code
make application more testable
promote programming to interfaces
loose coupling with minimal effort
support eager instantiation and lazy loading
provide control over object lifecycle
![Page 111: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/111.jpg)
Context lifecycle
Dmitry Noskov Spring Framework - Core
![Page 112: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/112.jpg)
Approach to configuration
Dmitry Noskov Spring Framework - Core
XML
infrastructure beans
annotations
working beans
java
an alternative to the FactoryBean
![Page 113: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/113.jpg)
You can mix and match
Dmitry Noskov Spring Framework - Core
dependency injection
constructor-based and setter-based
you can mix and match
configuration metadata
XML, annotations, Java
you can mix and match
annotations
own, JSR-250, JSR-330
you can mix and match
![Page 114: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/114.jpg)
Links
Dmitry Noskov Spring Framework - Core
site
http://www.springsource.org/
reference
http://static.springsource.org/spring/docs/3.0.x/spring-
framework-reference/html/
blog
http://blog.springsource.com/category/spring/
forum
http://forum.springsource.org/forumdisplay.php?f=26
![Page 115: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/115.jpg)
Books
Dmitry Noskov Spring Framework - Core
![Page 116: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/116.jpg)
Questions
Dmitry Noskov Spring Framework - Core
![Page 117: Spring Framework - Core](https://reader035.vdocuments.net/reader035/viewer/2022081717/553896534a79593a698b47f2/html5/thumbnails/117.jpg)
The end
http://www.linkedin.com/in/noskovd
http://www.slideshare.net/analizator/presentations