Spring J2EE Framework
1
Agenda – Spring Framework
1. Introduction to Spring Framework, Dependency
2. Injection/Inversion of Control and AOP
3. Spring usage scenarios and initializing. Spring in J2EE applications
4. Spring in Web tier. Spring with Struts.
5. Spring with EJBs and declarative transactions
6. Using Spring for persistence
7. Using Spring AOP interceptors
8. Using other Spring supported functions (JNDI, Mail, JMS, WebServices)
2
9. Testing using Spring
Spring
A lightweight non-intrusive framework which addresses various
tiers in a J2EE application.
Presentation layer: Integrates with Struts to initialize action classes
Business layer: Lightweight IoC container with support for AOP-driven
interceptors and transaction.
Persistence layer – DAO template support for Hibernate, SQLMaps and
JDBC
Factory implementation to abstract and integrate various other facets
of enterprise applications like E-mails, JMS, WebServices, etc.
Helps integrates tiers together using XML configuration instead of
hard-coding.
Substantially reduces code, speeds up development, facilitates
easy testing and improves code quality. 3
Spring Stack
Source: Spring Docs
4
Spring Benefits
Not a J2EE container. Doesn’t compete with J2EE app
servers. Simply provides alternatives.
POJO-based, non-invasive framework which allows a la
carte usage of its components.
Promotes decoupling and reusability
Reduces coding effort and enforces design discipline by
providing out-of-box implicit pattern implementations such
as singleton, factory, service locator etc.
Removes common code issues like leaking connections and
more
Support for declarative transaction management
Easy integration with third party tools and technologies.
5
Fundamentals Concepts
Spring largely built around
Inversion of Control (IoC) or Dependency Management
Aspect Oriented Programming (AOP)
6
Inversion of Control
Instead of objects invoking other objects, the dependant
objects are added through an external entity/container.
Also known as the Hollywood principle – “don’t call me I
will call you”
Dependency injection
Dependencies are “injected” by container during
runtime.
Beans define their dependencies through constructor
arguments or properties
Prevents hard-coded object creation and object/service
lookup.
Loose coupling
Helps write effective unit tests.
7
Non-IoC / Dependency Injection
Source: Spring Documentation 8
Non-IoC Service Object
public class CampaignServiceImpl implements
CampaignService {
public Campaign updateCampaign(Campaign campaign)
throws CampaignException{
try{
CampaignDAO campaign = new CampaignDAOImpl();
..
OpportunityDAO oppDAO = new OpportunityDAOImpl();
// Alternatively, initialize thru factory
// OpportunityDAO oppDAO = OppFactory.getOpp();
oppDAO.save(campaign);
..
}catch(Exception e){
}
}
9
Code is tightly coupled or interspersed with Factory code!
IoC / Dependency Injection
Source: Spring Documentation 10
IoC Service Object
public class CampaignServiceImpl implements
CampaignService {
public Campaign updateCampaign(Campaign campaign)
throws CampaignException{
try{
oppDAO.save(campaign);
}catch(Exception e){
}
}
// Spring sets the value thru runtime injection!
private setOpportunityDAO(OpportunityDAO oppDao){
this.oppDAO = oppDao;
} 11
Spring Usage Scenarios
Following are the typical usage scenarios for Spring
Presentation layer
Integrates with Struts to initialize action classes and its dependencies.
Facilitates presentation-tier testing
Business layer
Integrates with EJBs
Provides integration with components using IoC.
Transaction (declarative and programmatic)
Persistence layer
DAO pattern implementation
Template support for Hibernate, iBatis DataMapper and JDBC
Transaction management, Exception translation, connection management.
General
Email, JNDI, WebServices
12
Spring Bean Definition
The bean class is the actual implementation of the bean being
described by the BeanFactory.
Bean examples – DAO, DataSource, Transaction Manager,
Persistence Managers, Service objects, etc
Spring config contains implementation classes while your code
should program to interfaces.
Bean behaviors include:
Singleton or prototype
Autowiring
Initialization and destruction methods
init-method
destroy-method
Beans can be configured to have property values set.
Can read simple values, collections, maps, references to other beans,
etc.
13
Simple Spring Bean Example
<bean id=“CampaignServiceTarget"
class="com.corp.CampaignServiceImpl">
<property name=“promotionService">
<ref bean=“promotionService" />
</property>
<property name=“count">2</property>
</bean>
public class CampaignServiceImpl implements CampaignService{
…
public void setCount(int c){
this.count = c;
}
public void setPromotionService(PromotionService pServ){
this.promotionService = pServ;
}
} 14
Spring BeanFactory
BeanFactory is core to the Spring framework
Lightweight container that loads bean definitions and
manages your beans.
Configured declaratively using an XML file, or files, that
determine how beans can be referenced and wired
together.
Knows how to serve and manage a singleton or
prototype defined bean
Responsible for lifecycle methods.
Injects dependencies into defined beans when served
Removes the need for ad-hoc singletons and factories
15
Spring ApplicationContext
A Spring ApplicationContext allows you to get access to the
objects that are configured in a BeanFactory in a
framework manner.
ApplicationContext extends BeanFactory
Adds services such as international messaging capabilities.
Add the ability to load file resources in a generic fashion.
Several ways to configure a context:
XMLWebApplicationContext – Configuration for a web
application.
ClassPathXMLApplicationContext – standalone XML
application context
FileSystemXmlApplicationContext
Allows you to avoid writing Service Locators 16
Struts Support
ContextLoaderPlugin
Loads a Spring application context for the Struts ActionServlet.
Struts Actions are managed as Spring beans.
ActionSupport and DispatchActionSupport
Pre-built convenience classes to provide access to the context.
Provides methods in superclass for easy context lookup.
17
Configuring Context – Option 1
<plug-in
className="org.springframework.web.struts.Contex
tLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml"/>
</plug-in>
18
Configuring Context – Option 2
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/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> 19
Locating a Bean with Struts
public abstract class BaseAction extends
ActionSupport {
protected CampaignService getCampaignService() {
return (CampaignService)
getWebApplicationContext()
.getBean(“campaignService");
}
}
<bean id=“campaignService"
class=“com.corp.CampaignServiceImpl">
20
Spring with EJB
Implements service locator and code-less business delegate.
Configurable EJB lookup for remote and local EJBs
Supports POJO business tier with EJB façade
Easier EJB development with helper classes
Supports SLSBs and MDBs
Implement “Business Interface” pattern
EJB classes and POJO implementation extend a common
interface
Common interface defines all methods
21
Spring and EJB
Spring promoted as an alternative to the relatively “complex”
EJBs
Provides few comparable features, if not all
EJBs are a must for
Distributed transactions
Cluster-safe remoting of services
Container managed component security
High availability services
Using Spring with EJBs moves implementation to a POJO
model
Positions applications to a easier transition into the new EJB
3.0 spec.
22
Spring with EJB
23
Spring EJB Declaration – ejb-jar.xml
<session id=“CampaignService">
<ejb-name>CampaignService</ejb-name>
<local-home>com.corp.ejb.CampaignServiceLocalHome</local-home>
<local>com.corp.ejb.CampaignServiceLocal</local>
<ejb-class>com.corp.ejb.CampaignServiceBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
<env-entry>
<env-entry-name>ejb/BeanFactoryPath</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>ejbContext.xml</env-entry-value>
</env-entry>
<ejb-local-ref id="EJBLocalRef_1136316508000">
<ejb-ref-name>ejb/CampaignService</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local-home>com.corp.ejb.services.CampaignServiceLocalHome</local-home>
<local>com.corp.ejb.services.CampaignServiceLocal</local>
<ejb-link>CampaignService</ejb-link>
</ejb-local-ref>
</session>
24
Spring EJB Declaration
<bean id="accountService"
class=“LocalStatelessSessionProxyFactoryBean">
<property name="jndiName">
<value>ejb/CampaignServiceHome</value>
</property>
<property name="businessInterface">
<value>com.corp.services.CampaignService</value>
</property>
</bean>
25
EJB Client with Spring Helper
EJB Local:
/**
* Local interface for Enterprise Bean: CampaignService.
*/
public interface CampaignServiceLocal extends
javax.ejb.EJBLocalObject, CampaignService {
}
26
EJB class with Spring Helper
/**
* Bean implementation class for Enterprise Bean:
CampaignService
*/
public class CampaignServiceBean extends
AbstractStatelessSessionBean
implements CampaignService {
private static final String BEAN_NAME=
“campaignService";
private Campaign service;
protected void onEjbCreate() throws CreateException {
service = (CampaignService)
getBeanFactory().getBean(BEAN_NAME);
}
} 27
Delegated POJO Service Implementation
/**
* POJO implementation class for Enterprise Bean:
CampaignServiceBean
*/
public class CampaignServiceImpl implements CampaignService {
public Long createCampaign(String c) throws AppException {
..
}
}
applicationContext.xml
<bean id=“campaignServiceTarget"
class="com.corp.services.CampaignServiceImpl">
<property name=“promoDAO">
<ref bean=“promoDAO" />
</property>
</bean>
28
Transaction Management With Spring
Choice of two transaction managers
DataSourceTransactionManager for Local Transactions
JtaTransactionManager for using container transactions
manager
Choice of two transaction
Declarative (preferred); Declarations are in Spring
context.
Programmatic; only for scenarios when declarative
doesn’t work. Custom Spring API
29
Transaction Management With Spring
Local Transactions:
<bean id=“localTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionMana
ger">
<property name="dataSource">
<ref local="springContainerDataSource" />
</property>
</bean>
JTA Transactions (Using Websphere):
<bean id="wsJtaTm"
class="org.springframework.transaction.jta.WebSphereTransactionManag
erFactoryBean"/>
<bean id=“distTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="wsJtaTm" />
<property name="userTransactionName"><null /></property>
30
</bean>
Enabling Transactions on Services
Transactions are typically enabled at the business tier level and
not in the DAO
Spring transactions are an alternative to EJB transactions; for
both declarative and programmatic
Have to be enabled after disabling EJB CMT. No point in having
both
31
Enabling Declarative Transactions on Services
<bean id=“campaignServiceTxn"
class="org.springframework.transaction.interceptor.TransactionProxy
FactoryBean">
<property name="transactionManager">
<ref bean="distTransactionManager" />
</property>
<property name="target">
<ref bean=“campaignServiceTarget" />
</property>
<property name="transactionAttributes">
<props>
<prop key="update*">
PROPAGATION_REQUIRED, -com.corp.common.exception.NWException
</prop>
<prop key="*">
PROPAGATION_REQUIRED,readOnly,-com.corp.common.exception.NWException
</prop>
</props>
</property>
32
</bean>
Dependency Injection
beanId:CampaignServiceTxn
-TransactionProxyFactoryBean
TransactionAttributes
beanId:CampaignServiceTarget beanId:TransactionManager
-CampaignServiceImpl - JTATransactionManager
+ createCampaign(String): Long WebsphereTransactionManager
+ setPromoDAO()
beanId:promoDAO beanId:hibernateSessionFactory
- HibernatePromotionDAO MappingResources
- setHibernateSessionFactory() HibernateProperties
33
Persistence With Spring
Provides DAO implementation
Data access templates/helper classes.
Exception handling and translation. try/catch/finally blocks
are not required anymore.
Connection management and implicit passing of datasource
to DAO
Traditional problem of connection leaking etc. no more a
concern
34
Defining Datasource
<bean id="springContainerDataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>jdbc/CustomerDB</value>
</property>
</bean>
35
Defining Persistence and wiring
Datasource
<bean id=“hibernateSessionFactory" class=
“org.springframework.orm.hibernate.LocalSessionFactoryBean“>
<property name="dataSource">
<ref local="springContainerDataSource” />
</property>
<property name="mappingResources">
<list> <value>com/corp/orm/Customer.hbm.xml</value>
<value>com/corp/orm/Account.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
net.sf.hibernate.dialect.DB2Dialect
</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.autocommit">false</prop>
<prop key="cache.provider_class">
org.hibernate.cache.OSCacheProvider
</prop>
</props>
36
</property>
</bean>
Defining Persistence Beans
<bean id=“promoDao"
class="com.corp.dao.HibernatePromotionDao">
<property name="sessionFactory">
<ref local="hibernateSessionFactory" />
</property>
</bean>
37
DAO Support classes
Support for
JdbcDaoSupport
Provides callback methods for row iteration
HibernateDaoSupport
Initializes Hibernate session factory
Provides templates to invoke Hibernate API or the session
SqlMapDaoSupport
Provides template for iBatis SQLMaps
Support similar to Hibernate template
38
JDBC Code without a template
public class JDBCPromotionDAO implements PromotionDAO {
public Order savePromotion(Promotion promo) throws
PromoException{
Transaction tx = null;
try{
s = ... // get a new datasourceobject
tx = s.beginTransaction();
s.save(promo);
tx.commit();
} catch (SQLException sqle){
// log, rollback, and convert to OrderException
} finally {
s.close(); // needs a try/catch block
}
return promo; 39
}
Spring JDBC DAO Template
public class JDBCPromotionDAO implements
PromotionDAO extends JDBCDaoSupport{
public Order savePromotion(Promotion promo) throws
DataAccessException{
Transaction tx = null;
// get a new datasourceobject
templ = new JdbcTemplate(this.appDataSource);
templ.update(promo);
return promo;
}
public void setAppDataSource (DataSource ds) {
this.appDataSource = ds;
} 40
Hibernate Code without a template
public class HibernatePromotionDAO implements PromotionDAO {
public Order savePromotion(Promotion promo) throws PromoException{
Session s = null;
Transaction tx = null;
try{
s = ... // get a new Hibernate Session object
tx = s.beginTransaction();
s.save(promo);
tx.commit();
} catch (HibernateException he){
// log, rollback, and convert to DomainException
} catch (SQLException sqle){
// log, rollback, and convert to DomainException
} finally {
s.close(); // needs a try/catch block
}
return promo;
41
}
Spring Hibernate DAO Template Example
public class PromotionHibernateDAO extends HibernateDaoSupport
implements PromotionDAO {
...
public Order savePromotion(final Promotion promo) {
return (Order) getHibernateTemplate().execute(new
HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
session.save(promo);
return promo;
}
});
}
...
}
42
Spring Hibernate DAO Template Example
public class PromotionHibernateDAO extends
HibernateDaoSupport
implements PromotionDAO {
...
public List findOrdersByCustomerId(int id) {
return getHibernateTemplate()
.findByNamedQuery(“OrdersByCustomerID”,
new Integer(id));
}
public Order findOrderById(int orderId ) {
return (Order) getHibernateTemplate().load(
Order. class,
new Integer(orderId));
}
... 43
}
Consistent Exception Handling
Exception logic is managed by Spring using its own exception
hierarchy.
Exceptions from JDBC, Hibernate, SQLMaps, are wrapped up into
an appropriate, and consistent, DataAccessException and thrown.
Cleaner separation of tiers.
These exceptions are treated as unchecked exceptions that can
be handled in business tier.
Own exception translation can be defined by sub-classing classes
such as SQLErrorCodeSQLExceptionTranslator
44
Spring AOP
Provides a non-intrusive solution to common OO limitation
for easily implementing cross cutting concerns.
Used effectively for functions such as declarative
transaction management, declarative security, profiling,
logging, etc.
Supports AOPAlliance out-of-box. Supports AspectJ for
added features and compile time weaving.
Supports standard “advices”
method before
method after returning
throws advice
around advice
45
Spring AOP Runtime Weaving
beanId:methodAuthzAdvisor beanId:methodAuthzAdvice
- RegexpMethodPointcutAdvisor - AuthorizationAdvice
PointCut pattern(.*)
Before
CampaignServiceImpl
-createCampaign(String);
46
Spring AOP Advice for Component Authorization
<!-- Advisor pointcut definition for before advice -->
<bean id="methodAuthzAdvisor“
class="org.springframework.aop.support.RegexpMethodPointcu
tAdvisor">
<property name="advice">
<ref local="methodAuthzAdvice"/>
</property>
<property name="pattern">
<value>.*</value>
</property>
</bean>
<!-- Advice classes -->
47
<bean id="methodAuthzAdvice"
class="com.corp.marketlink.aspects.AuthorizationAdvice"/>
Spring AOP Before Advice Example
public class AuthorizationAdvice implements MethodBeforeAdvice
{
..
public void before(Method method, Object[] args, Object
target) throws Throwable {
//Implement user authorization
CtxAwareReqData reqData = (CtxAwareReqData) args[0];
List allowedRoles = getAllowedRoles(reqData);
boolean isValidAccess = checkAccess(reqData,
allowedRoles);
if (!isValidAccess) {
//Unauthorized user access, do not process any
further.
throw new Exception();
}
48
}
..
Spring Interceptor Injection
beanId:methodAuthzAdvisor
- RegexpMethodPointcutAdvisor
PointCut pattern(.*)
beanId:CampaignServiceTxn beanId:methodAuthzAdvice
-TransactionProxyFactoryBean - AuthorizationAdvice
TransactionAttributes
beanId:CampaignServiceTarget beanId:TransactionManager
-CampaignServiceImpl - JTATransactionManager
+ createCampaign(String): Long WebsphereTransactionManager
+ setPromoDAO()
beanId:promoDAO beanId:hibernateSessionFactory
- HibernatePromotionDAO MappingResources
- setHibernateSessionFactory() HibernateProperties
49
Incorporating Advice in Service
<bean id=“promotionService"
class="org.springframework.aop.framework.ProxyFactor
yBean">
<property name="proxyInterfaces">
<value>com.corp.CampaignService</value>
</property>
<property name="target">
<ref local=“CampaignServiceTxn"/>
</property>
<property name="interceptorNames">
<list>
<value>methodAuthzAdvisor</value>
</list>
</property>
</bean> 50
Spring and Testing
Easier test driven development
Integration testing
Can use a standalone Spring configuration with mock
objects for testing.
XMLApplicationContext or FileSystemApplicationContext
to initialize Spring
Unit testing
Dependency injection setter makes its very easy to
perform unit tests.
Allows tests outside the container without using the
Spring container.
Provides mock objects for Struts and DB tests
51
Other Spring Components
JavaMail helpers
JMS implementation
JNDI lookup
Integration with iText for PDF generation
Helper classes for Http Invocation and WebServices
.. and a whole lot of other abstractions
52
Resources/References
Spring – www.springframework.org
Inversion of Control -
http://www.martinfowler.com/articles/injection.html
Java Development With Spring Framework – Johnson,
Hoeller et al.
Spring in Action – Walls, Breidenbach
53