SlideShare a Scribd company logo
1 of 46
Introduction to the Spring
Framework

Ajit Koti
             Spring is
            • F = -kx (physics)
            •„ One of 4 Seasons
            •„ An Open-Source, Application Framework
References
   Spring’s homepage: http://www.springframework.org
   Spring documentation - http://www.springsource.org/documentation
   Spring API -
    http://static.springframework.org/spring/docs/2.5.x/api/index.html
   Introduction to the Spring Framework 2.5, by Rod Johnson (Originator
    of Spring) -
    http://www.theserverside.com/tt/articles/article.tss?l=IntrotoSpring25
   “Inversion of control containers and dependency injection” by Martin
    Fowler: http://www.martinfowler.com/articles/injection.html
   AOP Alliance: http://aopalliance.sourceforge.net
What is Spring?
 A Container
 Creates objects and makes them available to your application
 A Framework
 Provides an infrastructure of classes that make it easier to
  accomplish tasks
What does Spring provide?
    ◦ Lightweight container and framework
       Most of your code will be unaware of the Spring
        framework
       Use only the parts you of Spring you want
    ◦ Manages dependencies between your objects
       Encourages use of interfaces
       Lessens “coupling” between objects
    ◦ Cleaner separation of responsibilities
       Put logic that applies to many objects in one single
        place
       Separate the class’s core responsibility from other
        duties



Spring + J2EE
Spring enables you to build applications from “plain old Java
  objects” (POJOs) and to apply enterprise services non-invasively
  to POJOs. This capability applies to the Java SE programming
  model and to full and partial Java EE.
 Examples of how you, as an application developer, can use the
  Spring platform advantage:
 Make a Java method execute in a database transaction without
  having to deal with transaction APIs.
 Make a local Java method a remote procedure without having to
  deal with remote APIs.
 Make a local Java method a management operation without
  having to deal with JMX APIs.
 Make a local Java method a message handler without having to
  deal with JMS APIs.
Overview of the Spring Framework
Spring Framework Values
   S Non-invasive framework – code works outside framework,
    minimal lock-in, easy migration
   m Consistent model in any environment
   m Promotes code reuse and deferment of architectural decisions.
   m Facilitates OO code and good practices such as programming
    to interfaces
   t Extraction of configuration to consistent xml model
   t Promotes Architectural choice – choose best of breed
    frameworks
   f
Usage Scenarios
Inversion of Control (IoC)
   Dependency injection
    ◦ Beans define their dependencies through constructor
      arguments or properties
    ◦ The container provides the injection at runtime
   “Don’t talk to strangers”
   Also known as the Hollywood principle – “don’t call me I will call
    you”
   Decouples object creators and locators from application logic
   Easy to maintain and reuse
   Testing is easier
Dependency Injection




Variations on dependency injection
    •Constructor-based
    •Setter-based
Constructor-based dependency injection
   Constructor-based DI is accomplished by the container invoking a
    constructor with a number of arguments
<bean id=“simpleMovieLister ” class=“example. SimpleMovieLister ”>
 <constructor-arg name=“movieFinder”><ref bean=“movieFinder”/>
</bean>
<bean id=“movieFinder” class=“example. MovieFinder”>




public class SimpleMovieLister {
// the SimpleMovieLister has a dependency on a MovieFinder

private MovieFinder movieFinder;
// a constructor so that the Spring container can 'inject' a MovieFinder

public SimpleMovieLister(MovieFinder movieFinder) {
this.movieFinder = movieFinder; }

}
Setter-based dependency injection
   Setter-based DI is accomplished by the container calling setter
    methods on your beans after invoking a no-argument constructor
    or no-argumentstatic factory method to instantiate your bean.
     <bean id=“simpleMovieLister ” class=“example. SimpleMovieLister ”>
      <property name=“movieFinder”><ref bean=“movieFinder”/>
      </property>
     </bean>
     <bean id=“movieFinder” class=“example. MovieFinder”>



    public class SimpleMovieLister {

    // the SimpleMovieLister has a dependency on a MovieFinder
    private MovieFinder movieFinder;

    public SimpleMovieLister() { }

    // a setter method so that the Spring container can 'inject' a MovieFinder
    public setMovieFinder (MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
     }
    }
Abstract Beans
    Allows definition of part of a bean which can be reused many times in
     other bean definitions



    <bean id="abstractBean" abstract="true“                The parent bean defines 2
    class="org.example.ParentBean">                        values (name, age)
        <property name="name" value="parent-AZ"/>
        <property name="age" value="31"/>                  The child bean uses the
    </bean>                                                parent age value (31)
    <bean id="childBean"
               class="org.example.ChildBean"
                                                           The child bean overrides
               parent="abstractBean" init-method="init">   the parent name value (from
       <property name="name" value="child-AZ"/>            parent-AZ to child-AZ)
    </bean>
                                                           Parent bean could not be
                                                           injected, child could
Bean scopes
     singleton
(Default) Scopes a single bean definition to a single object instance per Spring IoC
   container.
     prototype
Scopes a single bean definition to any number of object instances.
     request
Scopes a single bean definition to the lifecycle of a single HTTP request; that is, each
   HTTP request has its own instance of a bean created off the back of a single bean
   definition. Only valid in the context of a web-aware Spring ApplicationContext.
     session
Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the
   context of a web-aware SpringApplicationContext.
     global session
Scopes a single bean definition to the lifecycle of a global HTTP Session. Typically only
   valid when used in a portlet context. Only valid in the context of a web-aware
   Spring ApplicationContext.
      custom scope
    To integrate your custom scope(s) into the Spring container, you need to implement
      the org.springframework.beans.factory.config.Scope interface
The singleton scope
   The non-singleton, prototype scope of bean deployment results in the creation of a new bean
    instance every time a request for that specific bean is made. That is, the bean is injected into
    another bean or you request it through a getBean() method call on the container. As a rule, use
    the prototype scope for all stateful beans and the singleton scope for stateless beans.
   The following diagram illustrates the Spring prototype scope. A data access object (DAO) is not
    typically configured as a prototype, because a typical DAO does not hold any conversational state;
    it was just easier for this author to reuse the core of the singleton diagram.


       <bean id="accountService" class=“DefaultAccountService"/>
       <!-- the following is equivalent, though redundant (singleton scope is the default) -->
       <bean id="accountService" class=“DefaultAccountService" scope="singleton“/>
The prototype scope
   The non-singleton, prototype scope of bean deployment results in the creation of a new bean
    instance every time a request for that specific bean is made. That is, the bean is injected into
    another bean or you request it through a getBean() method call on the container. As a rule,
    use the prototype scope for all stateful beans and the singleton scope for stateless beans.
   The following diagram illustrates the Spring prototype scope. A data access object (DAO) is
    not typically configured as a prototype, because a typical DAO does not hold any
    conversational state; it was just easier for this author to reuse the core of the singleton
    diagram.
      <bean id="accountService" class=“DefaultAccountService" scope="prototype“/>
Request, session, and global session scopes
   Request scope

            <bean id="loginAction" class="com.foo.LoginAction" scope="request"/>

            The Spring container creates a new instance of the LoginAction bean by using the loginAction bean
    definition for each and every HTTP request. That is, the loginAction bean is scoped at the HTTP request level.
    You can change the internal state of the instance that is created as much as you want, because other instances
    created from the same loginAction bean definition will not see these changes in state; they are particular to an
    individual request. When the request completes processing, the bean that is scoped to the request is discarded.
   Session scope

          <bean id="userPreferences" class="com.foo.UserPreferences" scope="session“/>

        The Spring container creates a new instance of the UserPreferences bean by using the userPreferences bean
    definition for the lifetime of a single HTTP Session. In other words, the userPreferences bean is effectively
    scoped at the HTTP Session level. As with request-scoped beans, you can change the internal state of the
    instance that is created as much as you want, knowing that other HTTP Session instances that are also using
    instances created from the same userPreferences bean definition do not see these changes in state, because they
    are particular to an individual HTTP Session. When the HTTP Session is eventually discarded, the bean that is
    scoped to that particular HTTP Session is also discarded.


   Global session scope

          <bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession”/>

       The global session scope is similar to the standard HTTP Session scope and applies only in the context of
    portlet-based web applications. The portlet specification defines the notion of a global Session that is shared
    among all portlets that make up a single portlet web application. Beans defined at the global session scope are
    scoped (or bound) to the lifetime of the global portlet Session.
Lifecycle callbacks
   Initialization callbacks
Use the init-method attribute to specify the name of the method that has a void no-argument
  signature.
To perform some initializing after the bean has been created.
       <bean id="exampleInitBean" class="examples.ExampleBean" init-method="init“/>

      public class ExampleBean {
          public void init() {
         // do some initialization work
        }
      }



   Destruction callbacks
Use the destroy-method attribute to specify the name of the method that has a void no-argument
   signature. To perform some initializing after the bean has been created.
       <bean id="exampleInitBean" class=“ExampleBean" destroy-method="cleanup"


      public class ExampleBean {
          public void init() {
         // do some initialization work
        }
      }
Spring Aware
   ApplicationContextAware
      public class CommandManager implements ApplicationContextAware {
      private ApplicationContext applicationContext;

      protected Command createCommand() {
      return this.applicationContext.getBean("command", Command.class); }
      public void setApplicationContext(ApplicationContext applicationContext) throws
      BeansException {
      this.applicationContext = applicationContext; }



   BeanNameAware
    public class CommandManager implements BeanNameAware {
    private String name;

    protected Command createCommand() {
     if(name .equals(“xyz”))
    }

    public void setBeanName(string name) throws BeansException{
      this.name-name; }
    }
Container extension points
Customizing beans using the BeanPostProcessor Interface

public class InstantiationTracingBeanPostProcessor implements BeanPostProcessor {
// simply return the instantiated bean as-is
public Object postProcessBeforeInitialization(Object bean, String beanName) throws
BeansException {
return bean; // we could potentially return any object reference here... }

public Object postProcessAfterInitialization(Object bean, String beanName) throws
BeansException {
System.out.println("Bean '" + beanName + "' created : " + bean.toString()); return bean; }



 <bean id="messenger“ class=“Messenger”
  <!-- when the above bean (messenger) is instantiated, this custom BeanPostProcessor
 implementation will output the fact to the system console -->
  <bean class=“InstantiationTracingBeanPostProcessor“/>

 ApplicationContext ctx = new ClassPathXmlApplicationContext("scripting/beans.xml");
 Messenger messenger = (Messenger) ctx.getBean("messenger");


Bean 'messenger' created : org.springframework.BeanFactory@272961
Container extension points (Cont’d)
    BeanFactoryPostProcessor 
         The semantics of this interface are similar to the BeanPostProcessor, with one major
     difference: BeanFactoryPostProcessors operate on the bean configuration metadata; that is,
     the Spring IoC container allows BeanFactoryPostProcessors to read the configuration
     metadata and potentially change it before the container instantiates any beans other
     than BeanFactoryPostProcessors..
PropertyPlaceholderConfigurer
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property
name="locations" value="classpath:com/foo/jdbc.properties"/>
 </bean>

<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property
name="password" value="${jdbc.password}"/>
</bean>


     PropertyOverrideConfigurer
    Properties file configuration lines take this format:
    beanName.property=value

    For example:
    dataSource.driverClassName=com.mysql.jdbc.Driver
    dataSource.url=jdbc:mysql:mydb
 Autowiring collaborators
    The Spring container can autowire relationships between collaborating beans. You can
     allow Spring to resolve collaborators (other beans) automatically for your bean by inspecting
     the contents of the ApplicationContext


     When using XML-based configuration metadata[2], you specify autowire mode for a bean
     definition with the autowire attribute of the <bean/>element. The autowiring functionality
     has five modes. You specify autowiring per bean and thus can choose which ones to
     autowire.
    Autowiring modes
Mode        Explanation
            (Default) No autowiring. Bean references must be defined via a ref element. Changing the default setting
no          is not recommended for larger deployments, because specifying collaborators explicitly gives greater
            control and clarity. To some extent, it documents the structure of a system.

            Autowiring by property name. Spring looks for a bean with the same name as the property that needs to
            be autowired. For example, if a bean definition is set to autowire by name, and it contains
byName
            a master property (that is, it has a setMaster(..)method), Spring looks for a bean definition named master,
            and uses it to set the property.
            Allows a property to be autowired if exactly one bean of the property type exists in the container. If
            more than one exists, a fatal exception is thrown, which indicates that you may not
byType
            use byType autowiring for that bean. If there are no matching beans, nothing happens; the property is
            not set.
construct   Analogous to byType, but applies to constructor arguments. If there is not exactly one bean of the
or          constructor argument type in the container, a fatal error is raised.
Method injection
   In most application scenarios, most beans in the container are singletons. When a singleton
    bean needs to collaborate with another singleton bean, or a non-singleton bean needs to
    collaborate with another non-singleton bean, you typically handle the dependency by defining
    one bean as a property of the other.
   A problem arises when the bean lifecycles are different. Suppose singleton bean A needs to use
    non-singleton (prototype) bean B, perhaps on each method invocation on A. The container only
    creates the singleton bean A once, and thus only gets one opportunity to set the properties. The
    container cannot provide bean A with a new instance of bean B every time one is needed..

      // a class that uses a stateful Command-style class to perform some processing
      public class CommandManager implements ApplicationContextAware {
      private ApplicationContext applicationContext;

      public Object process(Map commandState) { /
      / grab a new instance of the appropriate Command
      Command command = createCommand();
      // set the state on the (hopefully brand new) Command instance command.setState(commandState);
      return command.execute();
      }

      protected Command createCommand() {
      // notice the Spring API dependency!
      return this.applicationContext.getBean("command", Command.class);
      }

      public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
      this.applicationContext = applicationContext;
      }
Lookup Method Injection
   Lookup method injection is the ability of the container to override methods on container managed
    beans, to return the lookup result for another named bean in the container. The lookup typically
    involves a prototype bean as in the scenario described in the preceding section. The Spring
    Framework implements this method injection by using bytecode generation from the CGLIB library
    to generate dynamically a subclass that overrides the method.
    public class CommandManager {

    public Object process(Map commandState) { /
    / grab a new instance of the appropriate Command
    Command command = createCommand();
    // set the state on the (hopefully brand new)
    Command instance command.setState(commandState);
    return command.execute();
    }

    // okay... but where is the implementation of this method?
    protected abstract Command createCommand() ;



    <!-- a stateful bean deployed as a prototype (non-singleton) -->
    <bean id="command" class="AsyncCommand" scope="prototype“/>

    <!-- commandProcessor uses statefulCommandHelper -->
    <bean id="commandManager" class="CommandManager">
    <lookup-method name="createCommand" bean="command"/> </bean>
Bean Factory
   The BeanFactory is the actual container which instantiates, configures, and manages
    a number of beans. These beans typically collaborate with one another, and thus have
    dependencies between themselves. These dependencies are reflected in the configuration
    data used by the BeanFactory (although some dependencies may not be visible as
    configuration data, but rather be a function of programmatic interactions between beans
    at runtime).
   A BeanFactory is represented by the
    interface org.springframework.beans.factory.BeanFactory, for which there are multiple
    implementations. The most commonly used simple BeanFactory implementation
    is org.springframework.beans.factory.xml.XmlBeanFactory.


    ApplicationContext
   Extends functionality of BeanFactory
   Pre-instantiates singleton beans
   Detects and registers BeanPostProcessors and BeanFactoryPostProcessors
   Supports nesting of contexts
   ApplicationListener and ApplicationEvents
    ◦ Initialized and closed predefined
    ◦ Custom may be created
   MessageSource provides i18n messaging
    ◦ <bean id=”messageSource” class=”...ResourceBundleMessageSource”/>
    ◦ Contains list of bundle base names
Spring AOP

    AOP Fundamentals
   Aspect-oriented programming (AOP) provides for simplified application of cross-
    cutting concerns
    ◦ Transaction management
    ◦ Security
    ◦ Logging
    ◦ Auditing
    ◦ Locking
AOP concepts
   Aspect: a modularization of a concern that cuts across multiple classes. Transaction management is
    a good example of a crosscutting concern in enterprise Java applications. In Spring AOP, aspects
    are implemented using regular classes (the schema-based approach) or regular classes annotated
    with the @Aspect annotation (the @AspectJ style).
   Join point: a point during the execution of a program, such as the execution of a method or the
    handling of an exception. In Spring AOP, a join point always represents a method execution.
   Advice: action taken by an aspect at a particular join point. Different types of advice include
    "around," "before" and "after" advice. (Advice types are discussed below.) Many AOP frameworks,
    including Spring, model an advice as an interceptor, maintaining a chain of interceptorsaround the
    join point.
   Pointcut: a predicate that matches join points. Advice is associated with a pointcut expression and
    runs at any join point matched by the pointcut (for example, the execution of a method with a certain
    name). The concept of join points as matched by pointcut expressions is central to AOP, and Spring
    uses the AspectJ pointcut expression language by default.
   Introduction: declaring additional methods or fields on behalf of a type. Spring AOP allows you to
    introduce new interfaces (and a corresponding implementation) to any advised object. For example,
    you could use an introduction to make a bean implement an IsModifiedinterface, to simplify
    caching. (An introduction is known as an inter-type declaration in the AspectJ community.)
   Target object: object being advised by one or more aspects. Also referred to as the advised object.
    Since Spring AOP is implemented using runtime proxies, this object will always be a proxied object.
   AOP proxy: an object created by the AOP framework in order to implement the aspect contracts
    (advise method executions and so on). In the Spring Framework, an AOP proxy will be a JDK
    dynamic proxy or a CGLIB proxy.
Spring AOP capabilities and goals

 Spring AOP currently supports only method execution join points.
 Aspects are configured using normal bean definition syntax
 Spring does not provide the most complete AOP implementation
  ,it rather provides a close integration between AOP
  implementation and Spring IoC to help solve common problems
  in enterprise applications.
 Spring AOP will never strive to compete with AspectJ to provide a
  comprehensive AOP solution
Spring Advice
   Before advice: Advice that executes before a join point, but which does not have the
    ability to prevent execution flow proceeding to the join point (unless it throws an
    exception).
   After returning advice: Advice to be executed after a join point completes normally:
    for example, if a method returns without throwing an exception.
   After throwing advice: Advice to be executed if a method exits by throwing an
    exception.
   After (finally) advice: Advice to be executed regardless of the means by which a
    join point exits (normal or exceptional return).
   Around advice: Advice that surrounds a join point such as a method invocation.
    This is the most powerful kind of advice. Around advice can perform custom
    behavior before and after the method invocation. It is also responsible for choosing
    whether to proceed to the join point or to shortcut the advised method execution by
    returning its own return value or throwing an exception.
Spring Pointcuts
Spring AOP supports the following AspectJ pointcut designators (PCD) for use in
   pointcut expressions:
   Execution - for matching method execution join points, this is the primary pointcut designator
    you will use when working with Spring AOP
   within - limits matching to join points within certain types (simply the execution of a method
    declared within a matching type when using Spring AOP)
   this - limits matching to join points (the execution of methods when using Spring AOP) where the
    bean reference (Spring AOP proxy) is an instance of the given type
   target - limits matching to join points (the execution of methods when using Spring AOP) where
    the target object (application object being proxied) is an instance of the given type
   args - limits matching to join points (the execution of methods when using Spring AOP) where
    the arguments are instances of the given types
   @target - limits matching to join points (the execution of methods when using Spring AOP)
    where the class of the executing object has an annotation of the given type
   @args - limits matching to join points (the execution of methods when using Spring AOP) where
    the runtime type of the actual arguments passed have annotations of the given type(s)
   @within - limits matching to join points within types that have the given annotation (the
    execution of methods declared in types with the given annotation when using Spring AOP)
   @annotation - limits matching to join points where the subject of the join point (method being
    executed in Spring AOP) has the given annotation
Declaring Pointcut & Advice
   Declaring A Pointcut

<aop:config>
      <aop:advisor pointcut=“SystemArchitecture.businessService()" advice-ref="tx-advice"/>
</aop:config>

<tx:advice id="tx-advice">
      <tx:attributes> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes>
</tx:advice>
Or
@Pointcut("execution(* com.xyz.someapp.service.*.*(..))")
public void businessService() {}
   Declaring advice

 @Aspect public class AroundExample
 { @Around("com.xyz.myapp.SystemArchitecture.businessService()")
  public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
  // start stopwatch
 Object retVal = pjp.proceed();
  // stop stopwatch
  return retVal; }
Transactions
   Comprehensive transaction support is among the most compelling
    reasons to use the Spring Framework. The Spring Framework
    provides a consistent abstraction for transaction management that
    delivers the following benefits:
   Consistent programming model across different transaction APIs
    such as Java Transaction API (JTA), JDBC, Hibernate, Java
    Persistence API (JPA), and Java Data Objects (JDO).
   Support for declarative transaction management.
   Simpler API for programmatic transaction management than
    complex transaction APIs such as JTA.
   Excellent integration with Spring's data access abstractions.
Transaction Manager
      Spring does not directly manage transactions. Instead, it comes with a selection of transaction
       managers that delegate responsibility for transaction management to a platform-specific
       transaction implementation provided by either JTA or the persistence mechanism


Transaction manager                        Purpose
implementation

org.springframework.jdbc.datasource.       Manages transactions on a single JDBC
DataSourceTransactionManager               DataSource

org.springframework.orm.hibernate.         Used to manage transactions when Hibernate is the
HibernateTransactionManager                persistence mechanism.

org.springframework.orm.jdo.               Used to manage transactions when JDO is used for
JdoTransactionManager                      persistence.
                                           Manages transactions using a Java Transaction API
org.springframework.transaction.
                                           (JTA ) implementation. Must be used when a transaction
jta.JtaTransactionManager
                                           spans multiple resources.
org.springframework.orm.ojb.               Manages transactions when Apache’s Object Relational
PersistenceBrokerTransactionManager        Bridge (OJB) is used for persistence
Declarative Transaction Implementation
// the service interface that we want to make transactional
public interface FooService {
Foo getFoo(String fooName);
Foo getFoo(String fooName, String barName);
void insertFoo(Foo foo);}

<!-- this is the service object that we want to make transactional -->
<bean id="fooService" class="x.y.service.DefaultFooService"/>
<!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean below) -->
    <tx:advice id="txAdvice" transaction-manager="txManager">
<!-- the transactional semantics... -->
<tx:attributes>
<!-- all methods starting with 'get' are read-only -->
    <tx:method name="get*" read-only="true"/>
<!-- other methods use the default transaction settings (see below) --> <tx:method name="*"/>
</tx:attributes>
</tx:advice>

<!-- ensure that the above transactional advice runs for any execution of an operation defined by the
FooService interface -->
 <aop:config>
  <aop:pointcut id="fooServiceOperation" expression="execution(* x.y.service.FooService.*(..))"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>
 </aop:config>

<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property
name="dataSource" ref="dataSource"/> </bean>
Declarative Transaction
<tx:advice/> settings
Attribute      Required?   Default    Description

                                      Method name(s) with which the transaction attributes are to be
                                      associated. The wildcard (*) character can be used to associate
name           Yes          
                                      the same transaction attribute settings with a number of
                                      methods; for example, get*, handle*, on*Event, and so forth.


propagation    No          REQUIRED   Transaction propagation behavior.



isolation      No          DEFAULT    Transaction isolation level.



timeout        No          -1         Transaction timeout value (in seconds).



read-only      No          false      Is this transaction read-only?


                                      Exception(s) that trigger rollback; comma-delimited.       For
rollback-for   No           
                                      example,com.foo.MyBusinessException,ServletException.
no-rollback-                          Exception(s) that do not trigger rollback; comma-delimited. For
               No           
for                                   example,com.foo.MyBusinessException,ServletException.
Spring’s Transactional Propagation Rules

Propagation behavior       What it means

                           Indicates that the method should not run within a transaction. If an
PROPAGATION_NOT_SUPPORTE   existing transaction is in progress, it will be suspended for the
D                          duration of the method. If using JTATransactionManager,
                           access to TransactionManager is required.
                           Indicates that the current method must run within a transaction. If
PROPAGATION_REQUIRED       an existing transaction is in progress, the method will run within
                           that transaction. Otherwise, a new transaction will be started.
                           Indicates that the current method must run within its own transaction.
                           A new transaction is started and if an existing transaction is in
PROPAGATION_REQUIRES_NEW   progress, it will be suspended for the duration of the method. If
                           using JTATransactionManager, access to Transaction-
                           Manager is required.
                           Indicates that the current method does not require a transactional
PROPAGATION_SUPPORTS       context, but may run within a transaction if one is already in
                           progress.
Data Access
  The Data Access Object (DAO) support in Spring is
aimed at making it easy to work with data access
technologies like JDBC, Hibernate, JPA or JDO in a
consistent way. This allows one to switch between the
aforementioned persistence technologies fairly easily
and it also allows one to code without worrying about
catching exceptions that are specific to each
technology.
JDBC Template
<bean id="corporateEventDao" class="com.example.JdbcCorporateEventDao">
<property name="dataSource" ref="dataSource"/> </bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-
method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/> </bean>

<context:property-placeholder location="jdbc.properties"/>


  @Repository
  public class JdbcCorporateEventDao implements CorporateEventDao {
  private JdbcTemplate jdbcTemplate;
  @Autowired
  public void setDataSource(DataSource dataSource) {
  this.jdbcTemplate = new JdbcTemplate(dataSource); }

  public List<Actor> findAllActors() {
  return this.jdbcTemplate.query( "select first_name, last_name from t_actor", new
  ActorMapper()); }

  private static final class ActorMapper implements RowMapper<Actor> {
   public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
   Actor actor = new Actor(); actor.setFirstName(rs.getString("first_name"));
  actor.setLastName(rs.getString("last_name")); return actor; } }
Hibernate Template
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="mappingResources">
<list> <value>product.hbm.xml</value> </list>
</property>
<property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.HSQLDialect
</value> </property> </bean>

<bean id="myProductDao" class="product.ProductDaoImpl">
<property name="sessionFactory" ref="mySessionFactory"/> </bean>



public class ProductDaoImpl implements ProductDao {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory; }

public Collection loadProductsByCategory(String category) {
 return this.sessionFactory.getCurrentSession() .createQuery("from test.Product product where
product.category=?") .setParameter(0, category) .list(); }
}
Hibernate Transaction
<!-- SessionFactory, DataSource, etc. omitted -->
<bean id="transactionManager“ class="org.springframework….HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/> </bean>

<aop:config>
 <aop:pointcut id="productServiceMethods" expression="execution(* product.ProductService.*(..))"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="productServiceMethods"/></aop:config>

<tx:advice id="txAdvice" transaction-manager="myTxManager">
<tx:attributes>
<tx:method name="increasePrice*" propagation="REQUIRED"/>
<tx:method name="someOtherBusinessMethod" propagation="REQUIRES_NEW"/>
<tx:method name="*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes> </tx:advice>

<bean id="myProductService" class="product.SimpleProductService">
<property name="productDao" ref="myProductDao"/> </bean>

public class ProductServiceImpl implements ProductService {
private ProductDao productDao;

public void setProductDao(ProductDao productDao){
this.productDao = productDao; }

public void increasePriceOfAllProductsInCategory(final String category) {
List productsToChange = this.productDao.loadProductsByCategory(category); /}
 }
Marshalling XML using O/X Mappers
    Spring's Object/XML Mapping support. Object/XML Mapping, or O/X mapping for short, is the
    act of converting an XML document to and from an object. This conversion process is also
    known as XML Marshalling, or XML Serialization. Within the field of O/X mapping,
    a marshaller is responsible for serializing an object (graph) to XML. In similar fashion,
    an unmarshaller deserializes the XML to an object graph. This XML can take the form of a
    DOM document, an input or output stream, or a SAX handler.
Some of the benefits of using Spring for your O/X mapping needs are:
o   Ease of configuration.
o   Consistent Interfaces
o   Consistent Exception Hierarchy


       Marshaller and Unmarshaller
    The Marshaller interface has one main method, which marshals the given object to a
    given javax.xml.transform.Result. Result is a tagging interface that basically represents an
    XML output abstraction: concrete implementations wrap various XML representations.
    public interface Marshaller {
    void marshal(Object graph, Result result) throws XmlMappingException,
    IOException; }

    This interface also has one method, which reads from the
    given javax.xml.transform.Source (an XML input abstraction), and returns the object read. As
    with Result, Source is a tagging interface that has three concrete implementations. 

    public interface Unmarshaller {
    Object unmarshal(Source source) throws XmlMappingException, IOException; }
Using Marshaller and Unmarshaller
Spring Remoting
   Spring features integration classes for remoting support using various technologies. The
    remoting support eases the development of remote-enabled services, implemented by your
    usual (Spring) POJOs. Currently, Spring supports four remoting technologies:
    Remote Method Invocation (RMI). Through the use of the RmiProxyFactoryBean and the
    RmiServiceExporter Spring supports both traditional RMI (with java.rmi.Remote interfaces
    and java.rmi.RemoteException) and transparent remoting via RMI invokers (with any Java
    interface).
    Spring's HTTP invoker. Spring provides a special remoting strategy which allows for Java
    serialization via HTTP, supporting any Java interface (just like the RMI invoker). The
    corresponding support classes are HttpInvokerProxyFactoryBean and
    HttpInvokerServiceExporter.
    Hessian. By using Spring's HessianProxyFactoryBean and the HessianServiceExporter you
    can transparently expose your services using the lightweight binary HTTP-based protocol
    provided by Caucho.
    Burlap. Burlap is Caucho's XML-based alternative to Hessian. Spring provides support
    classes such as BurlapProxyFactoryBean and BurlapServiceExporter.
    JAX-RPC. Spring provides remoting support for web services via JAX-RPC (J2EE 1.4's web
    service API).
   JAX-WS. Spring provides remoting support for web services via JAX-WS (the successor of
    JAX-RPC, as introduced in Java EE 5 and Java 6).
   JMS. Remoting using JMS as the underlying protocol is supported via the
    JmsInvokerServiceExporter and JmsInvokerProxyFactoryBean classes.
Remote Method Invocation (RMI).
   Using the RmiServiceExporter, we can expose the interface of our AccountService object as
    RMI object. The interface can be accessed by using RmiProxyFactoryBean, or via plain RMI
    in case of a traditional RMI service. The RmiServiceExporter explicitly supports the exposing
    of any non-RMI services via RMI invokers.

     <bean id="accountService" class="example.AccountServiceImpl“/>

     <bean class="org.springframework.remoting.rmi.RmiServiceExporter">
     <!-- does not necessarily have to be the same name as the bean to be exported -->
     <property name="serviceName" value="AccountService"/>
     <property name="service" ref="accountService"/>
     <property name="serviceInterface" value="example.AccountService"/>
     <property name="registryPort" value="1199"/></bean>


   Linking in the service at the client
    <bean class="example.SimpleObject">
    <property name="accountService" ref="accountService"/>
    </bean>
    <bean id="accountService"
    class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
    <property name="serviceUrl" value="rmi://HOST:1199/AccountService"/>
    <property name="serviceInterface" value="example.AccountService"/>
    </bean>
Spring framework

More Related Content

What's hot

02 java spring-hibernate-experience-questions
02 java spring-hibernate-experience-questions02 java spring-hibernate-experience-questions
02 java spring-hibernate-experience-questionsDhiraj Champawat
 
EJB et WS (Montreal JUG - 12 mai 2011)
EJB et WS (Montreal JUG - 12 mai 2011)EJB et WS (Montreal JUG - 12 mai 2011)
EJB et WS (Montreal JUG - 12 mai 2011)Montreal JUG
 
Spring dependency injection
Spring dependency injectionSpring dependency injection
Spring dependency injectionsrmelody
 
Dependency Injection in Spring in 10min
Dependency Injection in Spring in 10minDependency Injection in Spring in 10min
Dependency Injection in Spring in 10minCorneil du Plessis
 
Spring overview &amp; architecture
Spring  overview &amp; architectureSpring  overview &amp; architecture
Spring overview &amp; architecturesaurabhshcs
 
How do I write Testable Javascript so I can Test my CF API on Server and Client
How do I write Testable Javascript so I can Test my CF API on Server and ClientHow do I write Testable Javascript so I can Test my CF API on Server and Client
How do I write Testable Javascript so I can Test my CF API on Server and ClientGavin Pickin
 
Pentesting Modern Web Apps: A Primer
Pentesting Modern Web Apps: A PrimerPentesting Modern Web Apps: A Primer
Pentesting Modern Web Apps: A PrimerBrian Hysell
 
Building a Spring Boot Application - Ask the Audience!
Building a Spring Boot Application - Ask the Audience!Building a Spring Boot Application - Ask the Audience!
Building a Spring Boot Application - Ask the Audience!🎤 Hanno Embregts 🎸
 
Intro to Pentesting Jenkins
Intro to Pentesting JenkinsIntro to Pentesting Jenkins
Intro to Pentesting JenkinsBrian Hysell
 
Extending burp with python
Extending burp with pythonExtending burp with python
Extending burp with pythonHoang Nguyen
 
#11.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원학원,재직자/실업자교육학원,스프링교육,마이바...
#11.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원학원,재직자/실업자교육학원,스프링교육,마이바...#11.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원학원,재직자/실업자교육학원,스프링교육,마이바...
#11.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원학원,재직자/실업자교육학원,스프링교육,마이바...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Spring Framework Petclinic sample application
Spring Framework Petclinic sample applicationSpring Framework Petclinic sample application
Spring Framework Petclinic sample applicationAntoine Rey
 
Spring rest-doc-2015-11
Spring rest-doc-2015-11Spring rest-doc-2015-11
Spring rest-doc-2015-11Eric Ahn
 
Spring Certification Questions
Spring Certification QuestionsSpring Certification Questions
Spring Certification QuestionsSpringMockExams
 

What's hot (16)

02 java spring-hibernate-experience-questions
02 java spring-hibernate-experience-questions02 java spring-hibernate-experience-questions
02 java spring-hibernate-experience-questions
 
EJB et WS (Montreal JUG - 12 mai 2011)
EJB et WS (Montreal JUG - 12 mai 2011)EJB et WS (Montreal JUG - 12 mai 2011)
EJB et WS (Montreal JUG - 12 mai 2011)
 
Spring frame work
Spring frame workSpring frame work
Spring frame work
 
Spring dependency injection
Spring dependency injectionSpring dependency injection
Spring dependency injection
 
Dependency Injection in Spring in 10min
Dependency Injection in Spring in 10minDependency Injection in Spring in 10min
Dependency Injection in Spring in 10min
 
Spring overview &amp; architecture
Spring  overview &amp; architectureSpring  overview &amp; architecture
Spring overview &amp; architecture
 
9.Spring DI_4
9.Spring DI_49.Spring DI_4
9.Spring DI_4
 
How do I write Testable Javascript so I can Test my CF API on Server and Client
How do I write Testable Javascript so I can Test my CF API on Server and ClientHow do I write Testable Javascript so I can Test my CF API on Server and Client
How do I write Testable Javascript so I can Test my CF API on Server and Client
 
Pentesting Modern Web Apps: A Primer
Pentesting Modern Web Apps: A PrimerPentesting Modern Web Apps: A Primer
Pentesting Modern Web Apps: A Primer
 
Building a Spring Boot Application - Ask the Audience!
Building a Spring Boot Application - Ask the Audience!Building a Spring Boot Application - Ask the Audience!
Building a Spring Boot Application - Ask the Audience!
 
Intro to Pentesting Jenkins
Intro to Pentesting JenkinsIntro to Pentesting Jenkins
Intro to Pentesting Jenkins
 
Extending burp with python
Extending burp with pythonExtending burp with python
Extending burp with python
 
#11.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원학원,재직자/실업자교육학원,스프링교육,마이바...
#11.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원학원,재직자/실업자교육학원,스프링교육,마이바...#11.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원학원,재직자/실업자교육학원,스프링교육,마이바...
#11.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원학원,재직자/실업자교육학원,스프링교육,마이바...
 
Spring Framework Petclinic sample application
Spring Framework Petclinic sample applicationSpring Framework Petclinic sample application
Spring Framework Petclinic sample application
 
Spring rest-doc-2015-11
Spring rest-doc-2015-11Spring rest-doc-2015-11
Spring rest-doc-2015-11
 
Spring Certification Questions
Spring Certification QuestionsSpring Certification Questions
Spring Certification Questions
 

Similar to Spring framework

Spring IOC and DAO
Spring IOC and DAOSpring IOC and DAO
Spring IOC and DAOAnushaNaidu
 
2-0. Spring ecosytem.pdf
2-0. Spring ecosytem.pdf2-0. Spring ecosytem.pdf
2-0. Spring ecosytem.pdfDeoDuaNaoHet
 
Spring training
Spring trainingSpring training
Spring trainingTechFerry
 
Skillwise-Spring framework 1
Skillwise-Spring framework 1Skillwise-Spring framework 1
Skillwise-Spring framework 1Skillwise Group
 
스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용
스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용
스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용Sungchul Park
 
Introduction to Spring Framework
Introduction to Spring FrameworkIntroduction to Spring Framework
Introduction to Spring FrameworkRajind Ruparathna
 
Spring framework in depth
Spring framework in depthSpring framework in depth
Spring framework in depthVinay Kumar
 
Spring framework IOC and Dependency Injection
Spring framework  IOC and Dependency InjectionSpring framework  IOC and Dependency Injection
Spring framework IOC and Dependency InjectionAnuj Singh Rajput
 
Contexts and Dependency Injection for the JavaEE platform
Contexts and Dependency Injection for the JavaEE platformContexts and Dependency Injection for the JavaEE platform
Contexts and Dependency Injection for the JavaEE platformBozhidar Bozhanov
 
Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans Hitesh-Java
 
Spring, web service, web server, eclipse by a introduction sandesh sharma
Spring, web service, web server, eclipse by a introduction sandesh sharmaSpring, web service, web server, eclipse by a introduction sandesh sharma
Spring, web service, web server, eclipse by a introduction sandesh sharmaSandesh Sharma
 
Toms introtospring mvc
Toms introtospring mvcToms introtospring mvc
Toms introtospring mvcGuo Albert
 
Session 43 - Spring - Part 1 - IoC DI Beans
Session 43 - Spring - Part 1 - IoC DI BeansSession 43 - Spring - Part 1 - IoC DI Beans
Session 43 - Spring - Part 1 - IoC DI BeansPawanMM
 
The Spring Framework: A brief introduction to Inversion of Control
The Spring Framework:A brief introduction toInversion of ControlThe Spring Framework:A brief introduction toInversion of Control
The Spring Framework: A brief introduction to Inversion of ControlVisualBee.com
 
Enterprise Java Beans 3 - Business Logic
Enterprise Java Beans 3 - Business LogicEnterprise Java Beans 3 - Business Logic
Enterprise Java Beans 3 - Business LogicEmprovise
 

Similar to Spring framework (20)

Spring IOC and DAO
Spring IOC and DAOSpring IOC and DAO
Spring IOC and DAO
 
2-0. Spring ecosytem.pdf
2-0. Spring ecosytem.pdf2-0. Spring ecosytem.pdf
2-0. Spring ecosytem.pdf
 
Spring training
Spring trainingSpring training
Spring training
 
Spring core
Spring coreSpring core
Spring core
 
Spring introduction
Spring introductionSpring introduction
Spring introduction
 
Skillwise-Spring framework 1
Skillwise-Spring framework 1Skillwise-Spring framework 1
Skillwise-Spring framework 1
 
스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용
스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용
스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용
 
Introduction to Spring Framework
Introduction to Spring FrameworkIntroduction to Spring Framework
Introduction to Spring Framework
 
Spring framework
Spring frameworkSpring framework
Spring framework
 
Spring framework in depth
Spring framework in depthSpring framework in depth
Spring framework in depth
 
Spring session
Spring sessionSpring session
Spring session
 
Spring framework IOC and Dependency Injection
Spring framework  IOC and Dependency InjectionSpring framework  IOC and Dependency Injection
Spring framework IOC and Dependency Injection
 
Spring Basics
Spring BasicsSpring Basics
Spring Basics
 
Contexts and Dependency Injection for the JavaEE platform
Contexts and Dependency Injection for the JavaEE platformContexts and Dependency Injection for the JavaEE platform
Contexts and Dependency Injection for the JavaEE platform
 
Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans
 
Spring, web service, web server, eclipse by a introduction sandesh sharma
Spring, web service, web server, eclipse by a introduction sandesh sharmaSpring, web service, web server, eclipse by a introduction sandesh sharma
Spring, web service, web server, eclipse by a introduction sandesh sharma
 
Toms introtospring mvc
Toms introtospring mvcToms introtospring mvc
Toms introtospring mvc
 
Session 43 - Spring - Part 1 - IoC DI Beans
Session 43 - Spring - Part 1 - IoC DI BeansSession 43 - Spring - Part 1 - IoC DI Beans
Session 43 - Spring - Part 1 - IoC DI Beans
 
The Spring Framework: A brief introduction to Inversion of Control
The Spring Framework:A brief introduction toInversion of ControlThe Spring Framework:A brief introduction toInversion of Control
The Spring Framework: A brief introduction to Inversion of Control
 
Enterprise Java Beans 3 - Business Logic
Enterprise Java Beans 3 - Business LogicEnterprise Java Beans 3 - Business Logic
Enterprise Java Beans 3 - Business Logic
 

Recently uploaded

"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 

Recently uploaded (20)

"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 

Spring framework

  • 1. Introduction to the Spring Framework Ajit Koti Spring is • F = -kx (physics) •„ One of 4 Seasons •„ An Open-Source, Application Framework
  • 2. References  Spring’s homepage: http://www.springframework.org  Spring documentation - http://www.springsource.org/documentation  Spring API - http://static.springframework.org/spring/docs/2.5.x/api/index.html  Introduction to the Spring Framework 2.5, by Rod Johnson (Originator of Spring) - http://www.theserverside.com/tt/articles/article.tss?l=IntrotoSpring25  “Inversion of control containers and dependency injection” by Martin Fowler: http://www.martinfowler.com/articles/injection.html  AOP Alliance: http://aopalliance.sourceforge.net
  • 3. What is Spring?  A Container  Creates objects and makes them available to your application  A Framework  Provides an infrastructure of classes that make it easier to accomplish tasks
  • 4. What does Spring provide? ◦ Lightweight container and framework  Most of your code will be unaware of the Spring framework  Use only the parts you of Spring you want ◦ Manages dependencies between your objects  Encourages use of interfaces  Lessens “coupling” between objects ◦ Cleaner separation of responsibilities  Put logic that applies to many objects in one single place  Separate the class’s core responsibility from other duties  
  • 5. Spring + J2EE Spring enables you to build applications from “plain old Java objects” (POJOs) and to apply enterprise services non-invasively to POJOs. This capability applies to the Java SE programming model and to full and partial Java EE.  Examples of how you, as an application developer, can use the Spring platform advantage:  Make a Java method execute in a database transaction without having to deal with transaction APIs.  Make a local Java method a remote procedure without having to deal with remote APIs.  Make a local Java method a management operation without having to deal with JMX APIs.  Make a local Java method a message handler without having to deal with JMS APIs.
  • 6. Overview of the Spring Framework
  • 7. Spring Framework Values  S Non-invasive framework – code works outside framework, minimal lock-in, easy migration  m Consistent model in any environment  m Promotes code reuse and deferment of architectural decisions.  m Facilitates OO code and good practices such as programming to interfaces  t Extraction of configuration to consistent xml model  t Promotes Architectural choice – choose best of breed frameworks  f
  • 9. Inversion of Control (IoC)  Dependency injection ◦ Beans define their dependencies through constructor arguments or properties ◦ The container provides the injection at runtime  “Don’t talk to strangers”  Also known as the Hollywood principle – “don’t call me I will call you”  Decouples object creators and locators from application logic  Easy to maintain and reuse  Testing is easier
  • 10. Dependency Injection Variations on dependency injection •Constructor-based •Setter-based
  • 11. Constructor-based dependency injection  Constructor-based DI is accomplished by the container invoking a constructor with a number of arguments <bean id=“simpleMovieLister ” class=“example. SimpleMovieLister ”> <constructor-arg name=“movieFinder”><ref bean=“movieFinder”/> </bean> <bean id=“movieFinder” class=“example. MovieFinder”> public class SimpleMovieLister { // the SimpleMovieLister has a dependency on a MovieFinder private MovieFinder movieFinder; // a constructor so that the Spring container can 'inject' a MovieFinder public SimpleMovieLister(MovieFinder movieFinder) { this.movieFinder = movieFinder; } }
  • 12. Setter-based dependency injection  Setter-based DI is accomplished by the container calling setter methods on your beans after invoking a no-argument constructor or no-argumentstatic factory method to instantiate your bean. <bean id=“simpleMovieLister ” class=“example. SimpleMovieLister ”> <property name=“movieFinder”><ref bean=“movieFinder”/> </property> </bean> <bean id=“movieFinder” class=“example. MovieFinder”> public class SimpleMovieLister { // the SimpleMovieLister has a dependency on a MovieFinder private MovieFinder movieFinder; public SimpleMovieLister() { } // a setter method so that the Spring container can 'inject' a MovieFinder public setMovieFinder (MovieFinder movieFinder) { this.movieFinder = movieFinder; } }
  • 13. Abstract Beans  Allows definition of part of a bean which can be reused many times in other bean definitions <bean id="abstractBean" abstract="true“ The parent bean defines 2 class="org.example.ParentBean"> values (name, age) <property name="name" value="parent-AZ"/> <property name="age" value="31"/> The child bean uses the </bean> parent age value (31) <bean id="childBean" class="org.example.ChildBean" The child bean overrides parent="abstractBean" init-method="init"> the parent name value (from <property name="name" value="child-AZ"/> parent-AZ to child-AZ) </bean> Parent bean could not be injected, child could
  • 14. Bean scopes  singleton (Default) Scopes a single bean definition to a single object instance per Spring IoC container.  prototype Scopes a single bean definition to any number of object instances.  request Scopes a single bean definition to the lifecycle of a single HTTP request; that is, each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext.  session Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the context of a web-aware SpringApplicationContext.  global session Scopes a single bean definition to the lifecycle of a global HTTP Session. Typically only valid when used in a portlet context. Only valid in the context of a web-aware Spring ApplicationContext.   custom scope To integrate your custom scope(s) into the Spring container, you need to implement the org.springframework.beans.factory.config.Scope interface
  • 15. The singleton scope  The non-singleton, prototype scope of bean deployment results in the creation of a new bean instance every time a request for that specific bean is made. That is, the bean is injected into another bean or you request it through a getBean() method call on the container. As a rule, use the prototype scope for all stateful beans and the singleton scope for stateless beans.  The following diagram illustrates the Spring prototype scope. A data access object (DAO) is not typically configured as a prototype, because a typical DAO does not hold any conversational state; it was just easier for this author to reuse the core of the singleton diagram. <bean id="accountService" class=“DefaultAccountService"/> <!-- the following is equivalent, though redundant (singleton scope is the default) --> <bean id="accountService" class=“DefaultAccountService" scope="singleton“/>
  • 16. The prototype scope  The non-singleton, prototype scope of bean deployment results in the creation of a new bean instance every time a request for that specific bean is made. That is, the bean is injected into another bean or you request it through a getBean() method call on the container. As a rule, use the prototype scope for all stateful beans and the singleton scope for stateless beans.  The following diagram illustrates the Spring prototype scope. A data access object (DAO) is not typically configured as a prototype, because a typical DAO does not hold any conversational state; it was just easier for this author to reuse the core of the singleton diagram. <bean id="accountService" class=“DefaultAccountService" scope="prototype“/>
  • 17. Request, session, and global session scopes  Request scope <bean id="loginAction" class="com.foo.LoginAction" scope="request"/> The Spring container creates a new instance of the LoginAction bean by using the loginAction bean definition for each and every HTTP request. That is, the loginAction bean is scoped at the HTTP request level. You can change the internal state of the instance that is created as much as you want, because other instances created from the same loginAction bean definition will not see these changes in state; they are particular to an individual request. When the request completes processing, the bean that is scoped to the request is discarded.  Session scope <bean id="userPreferences" class="com.foo.UserPreferences" scope="session“/> The Spring container creates a new instance of the UserPreferences bean by using the userPreferences bean definition for the lifetime of a single HTTP Session. In other words, the userPreferences bean is effectively scoped at the HTTP Session level. As with request-scoped beans, you can change the internal state of the instance that is created as much as you want, knowing that other HTTP Session instances that are also using instances created from the same userPreferences bean definition do not see these changes in state, because they are particular to an individual HTTP Session. When the HTTP Session is eventually discarded, the bean that is scoped to that particular HTTP Session is also discarded.  Global session scope <bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession”/> The global session scope is similar to the standard HTTP Session scope and applies only in the context of portlet-based web applications. The portlet specification defines the notion of a global Session that is shared among all portlets that make up a single portlet web application. Beans defined at the global session scope are scoped (or bound) to the lifetime of the global portlet Session.
  • 18. Lifecycle callbacks  Initialization callbacks Use the init-method attribute to specify the name of the method that has a void no-argument signature. To perform some initializing after the bean has been created. <bean id="exampleInitBean" class="examples.ExampleBean" init-method="init“/> public class ExampleBean { public void init() { // do some initialization work } }  Destruction callbacks Use the destroy-method attribute to specify the name of the method that has a void no-argument signature. To perform some initializing after the bean has been created. <bean id="exampleInitBean" class=“ExampleBean" destroy-method="cleanup" public class ExampleBean { public void init() { // do some initialization work } }
  • 19. Spring Aware  ApplicationContextAware public class CommandManager implements ApplicationContextAware { private ApplicationContext applicationContext; protected Command createCommand() { return this.applicationContext.getBean("command", Command.class); } public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; }  BeanNameAware public class CommandManager implements BeanNameAware { private String name; protected Command createCommand() { if(name .equals(“xyz”)) } public void setBeanName(string name) throws BeansException{ this.name-name; } }
  • 20. Container extension points Customizing beans using the BeanPostProcessor Interface public class InstantiationTracingBeanPostProcessor implements BeanPostProcessor { // simply return the instantiated bean as-is public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; // we could potentially return any object reference here... } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("Bean '" + beanName + "' created : " + bean.toString()); return bean; } <bean id="messenger“ class=“Messenger” <!-- when the above bean (messenger) is instantiated, this custom BeanPostProcessor implementation will output the fact to the system console --> <bean class=“InstantiationTracingBeanPostProcessor“/> ApplicationContext ctx = new ClassPathXmlApplicationContext("scripting/beans.xml"); Messenger messenger = (Messenger) ctx.getBean("messenger"); Bean 'messenger' created : org.springframework.BeanFactory@272961
  • 21. Container extension points (Cont’d)  BeanFactoryPostProcessor  The semantics of this interface are similar to the BeanPostProcessor, with one major difference: BeanFactoryPostProcessors operate on the bean configuration metadata; that is, the Spring IoC container allows BeanFactoryPostProcessors to read the configuration metadata and potentially change it before the container instantiates any beans other than BeanFactoryPostProcessors.. PropertyPlaceholderConfigurer <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations" value="classpath:com/foo/jdbc.properties"/> </bean> <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean>   PropertyOverrideConfigurer Properties file configuration lines take this format: beanName.property=value For example: dataSource.driverClassName=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql:mydb
  • 22.  Autowiring collaborators  The Spring container can autowire relationships between collaborating beans. You can allow Spring to resolve collaborators (other beans) automatically for your bean by inspecting the contents of the ApplicationContext When using XML-based configuration metadata[2], you specify autowire mode for a bean definition with the autowire attribute of the <bean/>element. The autowiring functionality has five modes. You specify autowiring per bean and thus can choose which ones to autowire.  Autowiring modes Mode Explanation (Default) No autowiring. Bean references must be defined via a ref element. Changing the default setting no is not recommended for larger deployments, because specifying collaborators explicitly gives greater control and clarity. To some extent, it documents the structure of a system. Autowiring by property name. Spring looks for a bean with the same name as the property that needs to be autowired. For example, if a bean definition is set to autowire by name, and it contains byName a master property (that is, it has a setMaster(..)method), Spring looks for a bean definition named master, and uses it to set the property. Allows a property to be autowired if exactly one bean of the property type exists in the container. If more than one exists, a fatal exception is thrown, which indicates that you may not byType use byType autowiring for that bean. If there are no matching beans, nothing happens; the property is not set. construct Analogous to byType, but applies to constructor arguments. If there is not exactly one bean of the or constructor argument type in the container, a fatal error is raised.
  • 23. Method injection  In most application scenarios, most beans in the container are singletons. When a singleton bean needs to collaborate with another singleton bean, or a non-singleton bean needs to collaborate with another non-singleton bean, you typically handle the dependency by defining one bean as a property of the other.  A problem arises when the bean lifecycles are different. Suppose singleton bean A needs to use non-singleton (prototype) bean B, perhaps on each method invocation on A. The container only creates the singleton bean A once, and thus only gets one opportunity to set the properties. The container cannot provide bean A with a new instance of bean B every time one is needed.. // a class that uses a stateful Command-style class to perform some processing public class CommandManager implements ApplicationContextAware { private ApplicationContext applicationContext; public Object process(Map commandState) { / / grab a new instance of the appropriate Command Command command = createCommand(); // set the state on the (hopefully brand new) Command instance command.setState(commandState); return command.execute(); } protected Command createCommand() { // notice the Spring API dependency! return this.applicationContext.getBean("command", Command.class); } public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; }
  • 24. Lookup Method Injection  Lookup method injection is the ability of the container to override methods on container managed beans, to return the lookup result for another named bean in the container. The lookup typically involves a prototype bean as in the scenario described in the preceding section. The Spring Framework implements this method injection by using bytecode generation from the CGLIB library to generate dynamically a subclass that overrides the method. public class CommandManager { public Object process(Map commandState) { / / grab a new instance of the appropriate Command Command command = createCommand(); // set the state on the (hopefully brand new) Command instance command.setState(commandState); return command.execute(); } // okay... but where is the implementation of this method? protected abstract Command createCommand() ; <!-- a stateful bean deployed as a prototype (non-singleton) --> <bean id="command" class="AsyncCommand" scope="prototype“/> <!-- commandProcessor uses statefulCommandHelper --> <bean id="commandManager" class="CommandManager"> <lookup-method name="createCommand" bean="command"/> </bean>
  • 25. Bean Factory  The BeanFactory is the actual container which instantiates, configures, and manages a number of beans. These beans typically collaborate with one another, and thus have dependencies between themselves. These dependencies are reflected in the configuration data used by the BeanFactory (although some dependencies may not be visible as configuration data, but rather be a function of programmatic interactions between beans at runtime).  A BeanFactory is represented by the interface org.springframework.beans.factory.BeanFactory, for which there are multiple implementations. The most commonly used simple BeanFactory implementation is org.springframework.beans.factory.xml.XmlBeanFactory. ApplicationContext  Extends functionality of BeanFactory  Pre-instantiates singleton beans  Detects and registers BeanPostProcessors and BeanFactoryPostProcessors  Supports nesting of contexts  ApplicationListener and ApplicationEvents ◦ Initialized and closed predefined ◦ Custom may be created  MessageSource provides i18n messaging ◦ <bean id=”messageSource” class=”...ResourceBundleMessageSource”/> ◦ Contains list of bundle base names
  • 26. Spring AOP AOP Fundamentals  Aspect-oriented programming (AOP) provides for simplified application of cross- cutting concerns ◦ Transaction management ◦ Security ◦ Logging ◦ Auditing ◦ Locking
  • 27. AOP concepts  Aspect: a modularization of a concern that cuts across multiple classes. Transaction management is a good example of a crosscutting concern in enterprise Java applications. In Spring AOP, aspects are implemented using regular classes (the schema-based approach) or regular classes annotated with the @Aspect annotation (the @AspectJ style).  Join point: a point during the execution of a program, such as the execution of a method or the handling of an exception. In Spring AOP, a join point always represents a method execution.  Advice: action taken by an aspect at a particular join point. Different types of advice include "around," "before" and "after" advice. (Advice types are discussed below.) Many AOP frameworks, including Spring, model an advice as an interceptor, maintaining a chain of interceptorsaround the join point.  Pointcut: a predicate that matches join points. Advice is associated with a pointcut expression and runs at any join point matched by the pointcut (for example, the execution of a method with a certain name). The concept of join points as matched by pointcut expressions is central to AOP, and Spring uses the AspectJ pointcut expression language by default.  Introduction: declaring additional methods or fields on behalf of a type. Spring AOP allows you to introduce new interfaces (and a corresponding implementation) to any advised object. For example, you could use an introduction to make a bean implement an IsModifiedinterface, to simplify caching. (An introduction is known as an inter-type declaration in the AspectJ community.)  Target object: object being advised by one or more aspects. Also referred to as the advised object. Since Spring AOP is implemented using runtime proxies, this object will always be a proxied object.  AOP proxy: an object created by the AOP framework in order to implement the aspect contracts (advise method executions and so on). In the Spring Framework, an AOP proxy will be a JDK dynamic proxy or a CGLIB proxy.
  • 28. Spring AOP capabilities and goals  Spring AOP currently supports only method execution join points.  Aspects are configured using normal bean definition syntax  Spring does not provide the most complete AOP implementation ,it rather provides a close integration between AOP implementation and Spring IoC to help solve common problems in enterprise applications.  Spring AOP will never strive to compete with AspectJ to provide a comprehensive AOP solution
  • 29. Spring Advice  Before advice: Advice that executes before a join point, but which does not have the ability to prevent execution flow proceeding to the join point (unless it throws an exception).  After returning advice: Advice to be executed after a join point completes normally: for example, if a method returns without throwing an exception.  After throwing advice: Advice to be executed if a method exits by throwing an exception.  After (finally) advice: Advice to be executed regardless of the means by which a join point exits (normal or exceptional return).  Around advice: Advice that surrounds a join point such as a method invocation. This is the most powerful kind of advice. Around advice can perform custom behavior before and after the method invocation. It is also responsible for choosing whether to proceed to the join point or to shortcut the advised method execution by returning its own return value or throwing an exception.
  • 30. Spring Pointcuts Spring AOP supports the following AspectJ pointcut designators (PCD) for use in pointcut expressions:  Execution - for matching method execution join points, this is the primary pointcut designator you will use when working with Spring AOP  within - limits matching to join points within certain types (simply the execution of a method declared within a matching type when using Spring AOP)  this - limits matching to join points (the execution of methods when using Spring AOP) where the bean reference (Spring AOP proxy) is an instance of the given type  target - limits matching to join points (the execution of methods when using Spring AOP) where the target object (application object being proxied) is an instance of the given type  args - limits matching to join points (the execution of methods when using Spring AOP) where the arguments are instances of the given types  @target - limits matching to join points (the execution of methods when using Spring AOP) where the class of the executing object has an annotation of the given type  @args - limits matching to join points (the execution of methods when using Spring AOP) where the runtime type of the actual arguments passed have annotations of the given type(s)  @within - limits matching to join points within types that have the given annotation (the execution of methods declared in types with the given annotation when using Spring AOP)  @annotation - limits matching to join points where the subject of the join point (method being executed in Spring AOP) has the given annotation
  • 31. Declaring Pointcut & Advice  Declaring A Pointcut <aop:config> <aop:advisor pointcut=“SystemArchitecture.businessService()" advice-ref="tx-advice"/> </aop:config> <tx:advice id="tx-advice"> <tx:attributes> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> Or @Pointcut("execution(* com.xyz.someapp.service.*.*(..))") public void businessService() {}  Declaring advice @Aspect public class AroundExample { @Around("com.xyz.myapp.SystemArchitecture.businessService()") public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { // start stopwatch Object retVal = pjp.proceed(); // stop stopwatch return retVal; }
  • 32. Transactions  Comprehensive transaction support is among the most compelling reasons to use the Spring Framework. The Spring Framework provides a consistent abstraction for transaction management that delivers the following benefits:  Consistent programming model across different transaction APIs such as Java Transaction API (JTA), JDBC, Hibernate, Java Persistence API (JPA), and Java Data Objects (JDO).  Support for declarative transaction management.  Simpler API for programmatic transaction management than complex transaction APIs such as JTA.  Excellent integration with Spring's data access abstractions.
  • 33. Transaction Manager  Spring does not directly manage transactions. Instead, it comes with a selection of transaction managers that delegate responsibility for transaction management to a platform-specific transaction implementation provided by either JTA or the persistence mechanism Transaction manager Purpose implementation org.springframework.jdbc.datasource. Manages transactions on a single JDBC DataSourceTransactionManager DataSource org.springframework.orm.hibernate. Used to manage transactions when Hibernate is the HibernateTransactionManager persistence mechanism. org.springframework.orm.jdo. Used to manage transactions when JDO is used for JdoTransactionManager persistence. Manages transactions using a Java Transaction API org.springframework.transaction. (JTA ) implementation. Must be used when a transaction jta.JtaTransactionManager spans multiple resources. org.springframework.orm.ojb. Manages transactions when Apache’s Object Relational PersistenceBrokerTransactionManager Bridge (OJB) is used for persistence
  • 34. Declarative Transaction Implementation // the service interface that we want to make transactional public interface FooService { Foo getFoo(String fooName); Foo getFoo(String fooName, String barName); void insertFoo(Foo foo);} <!-- this is the service object that we want to make transactional --> <bean id="fooService" class="x.y.service.DefaultFooService"/> <!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean below) --> <tx:advice id="txAdvice" transaction-manager="txManager"> <!-- the transactional semantics... --> <tx:attributes> <!-- all methods starting with 'get' are read-only --> <tx:method name="get*" read-only="true"/> <!-- other methods use the default transaction settings (see below) --> <tx:method name="*"/> </tx:attributes> </tx:advice> <!-- ensure that the above transactional advice runs for any execution of an operation defined by the FooService interface --> <aop:config> <aop:pointcut id="fooServiceOperation" expression="execution(* x.y.service.FooService.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/> </aop:config> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
  • 36. <tx:advice/> settings Attribute Required? Default Description Method name(s) with which the transaction attributes are to be associated. The wildcard (*) character can be used to associate name Yes   the same transaction attribute settings with a number of methods; for example, get*, handle*, on*Event, and so forth. propagation No REQUIRED Transaction propagation behavior. isolation No DEFAULT Transaction isolation level. timeout No -1 Transaction timeout value (in seconds). read-only No false Is this transaction read-only? Exception(s) that trigger rollback; comma-delimited. For rollback-for No   example,com.foo.MyBusinessException,ServletException. no-rollback- Exception(s) that do not trigger rollback; comma-delimited. For No   for example,com.foo.MyBusinessException,ServletException.
  • 37. Spring’s Transactional Propagation Rules Propagation behavior What it means Indicates that the method should not run within a transaction. If an PROPAGATION_NOT_SUPPORTE existing transaction is in progress, it will be suspended for the D duration of the method. If using JTATransactionManager, access to TransactionManager is required. Indicates that the current method must run within a transaction. If PROPAGATION_REQUIRED an existing transaction is in progress, the method will run within that transaction. Otherwise, a new transaction will be started. Indicates that the current method must run within its own transaction. A new transaction is started and if an existing transaction is in PROPAGATION_REQUIRES_NEW progress, it will be suspended for the duration of the method. If using JTATransactionManager, access to Transaction- Manager is required. Indicates that the current method does not require a transactional PROPAGATION_SUPPORTS context, but may run within a transaction if one is already in progress.
  • 38. Data Access The Data Access Object (DAO) support in Spring is aimed at making it easy to work with data access technologies like JDBC, Hibernate, JPA or JDO in a consistent way. This allows one to switch between the aforementioned persistence technologies fairly easily and it also allows one to code without worrying about catching exceptions that are specific to each technology.
  • 39. JDBC Template <bean id="corporateEventDao" class="com.example.JdbcCorporateEventDao"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy- method="close"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <context:property-placeholder location="jdbc.properties"/> @Repository public class JdbcCorporateEventDao implements CorporateEventDao { private JdbcTemplate jdbcTemplate; @Autowired public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } public List<Actor> findAllActors() { return this.jdbcTemplate.query( "select first_name, last_name from t_actor", new ActorMapper()); } private static final class ActorMapper implements RowMapper<Actor> { public Actor mapRow(ResultSet rs, int rowNum) throws SQLException { Actor actor = new Actor(); actor.setFirstName(rs.getString("first_name")); actor.setLastName(rs.getString("last_name")); return actor; } }
  • 40. Hibernate Template <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="myDataSource"/> <property name="mappingResources"> <list> <value>product.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.HSQLDialect </value> </property> </bean> <bean id="myProductDao" class="product.ProductDaoImpl"> <property name="sessionFactory" ref="mySessionFactory"/> </bean> public class ProductDaoImpl implements ProductDao { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public Collection loadProductsByCategory(String category) { return this.sessionFactory.getCurrentSession() .createQuery("from test.Product product where product.category=?") .setParameter(0, category) .list(); } }
  • 41. Hibernate Transaction <!-- SessionFactory, DataSource, etc. omitted --> <bean id="transactionManager“ class="org.springframework….HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <aop:config> <aop:pointcut id="productServiceMethods" expression="execution(* product.ProductService.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="productServiceMethods"/></aop:config> <tx:advice id="txAdvice" transaction-manager="myTxManager"> <tx:attributes> <tx:method name="increasePrice*" propagation="REQUIRED"/> <tx:method name="someOtherBusinessMethod" propagation="REQUIRES_NEW"/> <tx:method name="*" propagation="SUPPORTS" read-only="true"/> </tx:attributes> </tx:advice> <bean id="myProductService" class="product.SimpleProductService"> <property name="productDao" ref="myProductDao"/> </bean> public class ProductServiceImpl implements ProductService { private ProductDao productDao; public void setProductDao(ProductDao productDao){ this.productDao = productDao; } public void increasePriceOfAllProductsInCategory(final String category) { List productsToChange = this.productDao.loadProductsByCategory(category); /} }
  • 42. Marshalling XML using O/X Mappers Spring's Object/XML Mapping support. Object/XML Mapping, or O/X mapping for short, is the act of converting an XML document to and from an object. This conversion process is also known as XML Marshalling, or XML Serialization. Within the field of O/X mapping, a marshaller is responsible for serializing an object (graph) to XML. In similar fashion, an unmarshaller deserializes the XML to an object graph. This XML can take the form of a DOM document, an input or output stream, or a SAX handler. Some of the benefits of using Spring for your O/X mapping needs are: o Ease of configuration. o Consistent Interfaces o Consistent Exception Hierarchy  Marshaller and Unmarshaller The Marshaller interface has one main method, which marshals the given object to a given javax.xml.transform.Result. Result is a tagging interface that basically represents an XML output abstraction: concrete implementations wrap various XML representations. public interface Marshaller { void marshal(Object graph, Result result) throws XmlMappingException, IOException; } This interface also has one method, which reads from the given javax.xml.transform.Source (an XML input abstraction), and returns the object read. As with Result, Source is a tagging interface that has three concrete implementations.  public interface Unmarshaller { Object unmarshal(Source source) throws XmlMappingException, IOException; }
  • 43. Using Marshaller and Unmarshaller
  • 44. Spring Remoting  Spring features integration classes for remoting support using various technologies. The remoting support eases the development of remote-enabled services, implemented by your usual (Spring) POJOs. Currently, Spring supports four remoting technologies:  Remote Method Invocation (RMI). Through the use of the RmiProxyFactoryBean and the RmiServiceExporter Spring supports both traditional RMI (with java.rmi.Remote interfaces and java.rmi.RemoteException) and transparent remoting via RMI invokers (with any Java interface).  Spring's HTTP invoker. Spring provides a special remoting strategy which allows for Java serialization via HTTP, supporting any Java interface (just like the RMI invoker). The corresponding support classes are HttpInvokerProxyFactoryBean and HttpInvokerServiceExporter.  Hessian. By using Spring's HessianProxyFactoryBean and the HessianServiceExporter you can transparently expose your services using the lightweight binary HTTP-based protocol provided by Caucho.  Burlap. Burlap is Caucho's XML-based alternative to Hessian. Spring provides support classes such as BurlapProxyFactoryBean and BurlapServiceExporter.  JAX-RPC. Spring provides remoting support for web services via JAX-RPC (J2EE 1.4's web service API).  JAX-WS. Spring provides remoting support for web services via JAX-WS (the successor of JAX-RPC, as introduced in Java EE 5 and Java 6).  JMS. Remoting using JMS as the underlying protocol is supported via the JmsInvokerServiceExporter and JmsInvokerProxyFactoryBean classes.
  • 45. Remote Method Invocation (RMI).  Using the RmiServiceExporter, we can expose the interface of our AccountService object as RMI object. The interface can be accessed by using RmiProxyFactoryBean, or via plain RMI in case of a traditional RMI service. The RmiServiceExporter explicitly supports the exposing of any non-RMI services via RMI invokers. <bean id="accountService" class="example.AccountServiceImpl“/> <bean class="org.springframework.remoting.rmi.RmiServiceExporter"> <!-- does not necessarily have to be the same name as the bean to be exported --> <property name="serviceName" value="AccountService"/> <property name="service" ref="accountService"/> <property name="serviceInterface" value="example.AccountService"/> <property name="registryPort" value="1199"/></bean>  Linking in the service at the client <bean class="example.SimpleObject"> <property name="accountService" ref="accountService"/> </bean> <bean id="accountService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <property name="serviceUrl" value="rmi://HOST:1199/AccountService"/> <property name="serviceInterface" value="example.AccountService"/> </bean>

Editor's Notes

  1. Core Container The  Core Container  consists of the Core, Beans, Context, and Expression Language modules. The  Core and Beans  modules provide the fundamental parts of the framework, including the IoC and Dependency Injection features. TheBeanFactory is a sophisticated implementation of the factory pattern. It removes the need for programmatic singletons and allows you to decouple the configuration and specification of dependencies from your actual program logic. The  Context  module builds on the solid base provided by the  Core and Beans  modules: it is a means to access objects in a framework-style manner that is similar to a JNDI registry. The Context module inherits its features from the Beans module and adds support for internationalization (using, for example, resource bundles), event-propagation, resource-loading, and the transparent creation of contexts by, for example, a servlet container. The Context module also supports Java EE features such as EJB, JMX ,and basic remoting. The ApplicationContext interface is the focal point of the Context module. The  Expression Language  module provides a powerful expression language for querying and manipulating an object graph at runtime. It is an extension of the unified expression language (unified EL) as specified in the JSP 2.1 specification. The language supports setting and getting property values, property assignment, method invocation, accessing the context of arrays, collections and indexers, logical and arithmetic operators, named variables, and retrieval of objects by name from Spring&apos;s IoC container. It also supports list projection and selection as well as common list aggregations. Data Access/Integration The  Data Access/Integration  layer consists of the JDBC, ORM, OXM, JMS and Transaction modules. The  JDBC  module provides a JDBC-abstraction layer that removes the need to do tedious JDBC coding and parsing of database-vendor specific error codes. The  ORM  module provides integration layers for popular object-relational mapping APIs, including  JPA ,  JDO ,  Hibernate , and  iBatis . Using the ORM package you can use all of these O/R-mapping frameworks in combination with all of the other features Spring offers, such as the simple declarative transaction management feature mentioned previously. The  OXM  module provides an abstraction layer that supports Object/XML mapping implementations for JAXB, Castor, XMLBeans, JiBX and XStream. The Java Messaging Service ( JMS ) module contains features for producing and consuming messages. The  Transaction  module supports programmatic and declarative transaction management for classes that implement special interfaces and for  all your POJOs (plain old Java objects) . Web The  Web  layer consists of the Web, Web-Servlet, Web-Struts, and Web-Portlet modules. Spring&apos;s  Web  module provides basic web-oriented integration features such as multipart file-upload functionality and the initialization of the IoC container using servlet listeners and a web-oriented application context. It also contains the web-related parts of Spring&apos;s remoting support. The  Web-Servlet  module contains Spring&apos;s model-view-controller ( MVC ) implementation for web applications. Spring&apos;s MVC framework provides a clean separation between domain model code and web forms, and integrates with all the other features of the Spring Framework. The  Web-Struts  module contains the support classes for integrating a classic Struts web tier within a Spring application. Note that this support is now deprecated as of Spring 3.0. Consider migrating your application to Struts 2.0 and its Spring integration or to a Spring MVC solution. The  Web-Portlet  module provides the MVC implementation to be used in a portlet environment and mirrors the functionality of Web-Servlet module. AOP and Instrumentation Spring&apos;s  AOP  module 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. Using source-level metadata functionality, you can also incorporate behavioral information into your code, in a manner similar to that of .NET attributes. The separate  Aspects  module provides integration with AspectJ. The  Instrumentation  module provides class instrumentation support and classloader implementations to be used in certain application servers. Test The  Test  module supports the testing of Spring components with JUnit or TestNG. It provides consistent loading of Spring ApplicationContexts and caching of those contexts. It also provides mock objects that you can use to test your code in isolation.
  2. With the building blocks described above you can use Spring in all sorts of scenarios, from applets up to fully-fledged enterprise applications using Spring&apos;s transaction management functionality and Web framework. A typical web application using most of Spring&apos;s features. Using TransactionProxyFactoryBeans the web application is fully transactional, just as it would be when using container managed transaction as provided by Enterprise JavaBeans. All your custom business logic can be implemented using simple POJOs, managed by Spring&apos;s Dependency Injection container. Additional services such as sending email and validation, independent of the web layer enable you to choose where to execute validation rules. Spring&apos;s ORM support is integrated with Hibernate, JDO and iBatis. Using for example HibernateDaoSupport, you can re-use your existing Hibernate mappings. Form controllers seamlessly integrate the web-layer with the domain model, removing the need for ActionForms or other classes that transform HTTP parameters to values for your domain model.
  3. Inversion of Control has already been referred to as Dependency Injection . The basic principle is that beans define their dependencies (i.e. the other objects they work with) only through constructor arguments or properties. Then, it is the job of the container to actually inject those dependencies when it creates the bean. This is fundamentally the inverse (hence the name Inversion of Control) of the bean instantiating or locating its dependencies on its own using direct construction of classes, or something like the Service Locator pattern. While we will not elaborate too much on the advantages of Dependency Injection, it becomes evident upon usage that code gets much cleaner and reaching a higher grade of decoupling is much easier when beans do not look up their dependencies, but are provided them, and additionally do not even know where the dependencies are located and of what actual type they are.
  4. Dependency resolution process The container performs bean dependency resolution as follows: The ApplicationContext is created and initialized with configuration metadata that describes all the beans. Configuration metadata can be specified via XML, Java code or annotations. For each bean, its dependencies are expressed in the form of properties, constructor arguments, or arguments to the static-factory method if you are using that instead of a normal constructor. These dependencies are provided to the bean,  when the bean is actually created . Each property or constructor argument is an actual definition of the value to set, or a reference to another bean in the container. Each property or constructor argument which is a value is converted from its specified format to the actual type of that property or constructor argument. By default Spring can convert a value supplied in string format to all built-in types, such as int, long, String, boolean, etc. The Spring container validates the configuration of each bean as the container is created, including the validation of whether bean reference properties refer to valid beans. However, the bean properties themselves are not set until the bean  is actually created . Beans that are singleton-scoped and set to be pre-instantiated (the default) are created when the container is created. Otherwise, the bean is created only when it is requested. Creation of a bean potentially causes a graph of beans to be created, as the bean&apos;s dependencies and its dependencies&apos; dependencies (and so on) are created and assigned. Circular dependencies If you use predominantly constructor injection, it is possible to create an unresolvable circular dependency scenario. For example: Class A requires an instance of class B through constructor injection, and class B requires an instance of class A through constructor injection. If you configure beans for classes A and B to be injected into each other, the Spring IoC container detects this circular reference at runtime, and throws a BeanCurrentlyInCreationException. One possible solution is to edit the source code of some classes to be configured by setters rather than constructors. Alternatively, avoid constructor injection and use setter injection only. In other words, although it is not recommended, you can configure circular dependencies with setter injection. Unlike the  typical  case (with no circular dependencies), a circular dependency between bean A and bean B forces one of the beans to be injected into the other prior to being fully initialized itself (a classic chicken/egg scenario). You can generally trust Spring to do the right thing. It detects configuration problems, such as references to non-existent beans and circular dependencies, at container load-time. Spring sets properties and resolves dependencies as late as possible, when the bean is actually created. This means that a Spring container which has loaded correctly can later generate an exception when you request an object if there is a problem creating that object or one of its dependencies. For example, the bean throws an exception as a result of a missing or invalid property. This potentially delayed visibility of some configuration issues is why ApplicationContext implementations by default pre-instantiate singleton beans. At the cost of some upfront time and memory to create these beans before they are actually needed, you discover configuration issues when the ApplicationContext is created, not later. You can still override this default behavior so that singleton beans will lazy-initialize, rather than be pre-instantiated. If no circular dependencies exist, when one or more collaborating beans are being injected into a dependent bean, each collaborating bean is  totally  configured prior to being injected into the dependent bean. This means that if bean A has a dependency on bean B, the Spring IoC container completely configures bean B prior to invoking the setter method on bean A. In other words, the bean is instantiated (if not a pre-instantiated singleton), its dependencies are set, and the relevant lifecycle methods (such as a  configured init method  or the  IntializingBean callback method ) are invoked.
  5. constructor-based dependency injection is realized by invoking a constructor with a number of arguments, each representing a collaborator or property. Although Spring generally advocates usage of setter-based dependency injection as much as possible, it does fully support the constructor-based approach as well, since you may wish to use it with pre-existing beans which provide only multi-argument constructors, and no setters. Additionally, for simpler beans, some people prefer the constructor approach as a means of ensuring beans can not be constructed in an invalid state.
  6. setter-based dependency injection is realized by calling setters on your beans after invoking a no-argument constructor to instantiate your bean. Beans defined in the BeanFactory that use setter-based dependency injection are true JavaBeans . Spring generally advocates usage of setter-based dependency injection, since a large number of constructor arguments can get unwieldy, especially when some properties are optional.
  7. When you create a bean definition, you create a  recipe  for creating actual instances of the class defined by that bean definition. The idea that a bean definition is a recipe is important, because it means that, as with a class, you can create many object instances from a single recipe. You can control not only the various dependencies and configuration values that are to be plugged into an object that is created from a particular bean definition, but also the  scope  of the objects created from a particular bean definition. This approach is powerful and flexible in that you can choose  the scope of the objects you create through configuration instead of having to bake in the scope of an object at the Java class level. Beans can be defined to be deployed in one of a number of scopes: out of the box, the Spring Framework supports five scopes, three of which are available only if you use a web-aware ApplicationContext.
  8. Spring&apos;s concept of a singleton bean differs from the Singleton pattern as defined in the Gang of Four (GoF) patterns book. The GoF Singleton hard-codes the scope of an object such that one  and only one  instance of a particular class is created  per ClassLoader . The scope of the Spring singleton is best described as  per container and per bean . This means that if you define one bean for a particular class in a single Spring container, then the Spring container creates one  and only one  instance of the class defined by that bean definition.  The singleton scope is the default scope in Spring . To define a bean as a singleton in XML.
  9. In contrast to the other scopes, Spring does not manage the complete lifecycle of a prototype bean: the container instantiates, configures, and otherwise assembles a prototype object, and hands it to the client, with no further record of that prototype instance. Thus, although  initialization lifecycle callback methods are called on all objects regardless of scope, in the case of prototypes, configured  destruction  lifecycle callbacks are  not called. The client code must clean up prototype-scoped objects and release expensive resources that the prototype bean(s) are holding. To get the Spring container to release resources held by prototype-scoped beans, try using a custom  bean post-processor , which holds a reference to beans that need to be cleaned up.
  10. Note: The request, session, and global session scopes are  only  available if you use a web-aware Spring ApplicationContext implementation (such as XmlWebApplicationContext). If you use these scopes with regular Spring IoC containers such as the ClassPathXmlApplicationContext, you get an IllegalStateException complaining about an unknown bean scope. Initial web configuration o support the scoping of beans at the request, session, and global session levels (web-scoped beans), some minor initial configuration is required before you define your beans. (This initial setup is  not  required for the standard scopes, singleton and prototype.) How you accomplish this initial setup depends on your particular Servlet environment.. If you access scoped beans within Spring Web MVC, in effect, within a request that is processed by the Spring DispatcherServlet, orDispatcherPortlet, then no special setup is necessary: DispatcherServlet and DispatcherPortlet already expose all relevant state. If you use a Servlet 2.4+ web container, with requests processed outside of Spring&apos;s DispatcherServlet (for example, when using JSF or Struts), you need to add the following javax.servlet.ServletRequestListener to the declarations in your web applications web.xml file: &lt;web-app&gt; ... &lt;listener&gt; &lt;listener-class&gt; org.springframework.web.context.request.RequestContextListener &lt;/listener-class&gt; &lt;/listener&gt; ... &lt;/web-app
  11. To interact with the container&apos;s management of the bean lifecycle, you can implement the Spring InitializingBean and DisposableBean interfaces. The container calls afterPropertiesSet() for the former and destroy() for the latter to allow the bean to perform certain actions upon initialization and destruction of your beans. You can also achieve the same integration with the container without coupling your classes to Spring interfaces through the use of init-method and destroy method object definition metadata. Internally, the Spring Framework uses BeanPostProcessor implementations to process any callback interfaces it can find and call the appropriate methods. If you need custom features or other lifecycle behavior Spring does not offer out-of-the-box, you can implement a BeanPostProcessor yourself.
  12. ApplicationContextAware: When an ApplicationContext creates a class that implements the org.springframework.context.ApplicationContextAware interface, the class is provided with a reference to that ApplicationContext. Thus beans can manipulate programmatically the ApplicationContext that created them, through the ApplicationContext interface, or by casting the reference to a known subclass of this interface, such as ConfigurableApplicationContext, which exposes additional functionality. One use would be the programmatic retrieval of other beans. Sometimes this capability is useful; however, in general you should avoid it, because it couples the code to Spring and does not follow the Inversion of Control style, where collaborators are provided to beans as properties. Other methods of the ApplicationContext provide access to file resources, publishing application events, and accessing a MessageSource. BeanNameAware : When an ApplicationContext creates a class that implements the org.springframework.beans.factory.BeanNameAware interface, the class is provided with a reference to the name defined in its associated object definition. he callback is invoked after population of normal bean properties but before an initialization callback such as InitializingBeans afterPropertiesSet  or a custom init-method.  
  13. Typically, an application developer does not need to subclass any ApplicationContext implementation classes. You can extend The Spring IoC container infinitely by plugging in implementations of special integration interfaces. The BeanPostProcessor interface defines  callback methods  that you can implement to provide your own (or override the container&apos;s default) instantiation logic, dependency-resolution logic, and so forth. If you want to implement some custom logic after the Spring container finishes instantiating, configuring, and otherwise initializing a bean, you can plug in one or more BeanPostProcessor implementations. You can configure multiple BeanPostProcessor interfaces. You can control the order in which these BeanPostProcessor interfaces execute by setting the order property. You can set this property only if the BeanPostProcessor implements the Ordered interface; if you write your ownBeanPostProcessor you should consider implementing the Ordered interface too. For more details, consult the Javadoc for the BeanPostProcessorand Ordered interfaces. Note BeanPostProcessors operate on bean (or object)  instances ; that is to say, the Spring IoC container instantiates a bean instance and  then  BeanPostProcessor interfaces do their work. BeanPostProcessor interfaces are scoped  per-container . This is only relevant if you are using container hierarchies. If you define a BeanPostProcessor in one container, it will  only  do its work on the beans in that container. Beans that are defined in one container are not post-processed by a BeanPostProcessor in another container, even if both containers are part of the same hierarchy. The org.springframework.beans.factory.config.BeanPostProcessor interface consists of exactly two callback methods. When such a class is registered as a post-processor with the container, for each bean instance that is created by the container, the post-processor gets a callback from the container both  before  container initialization methods (such as  afterPropertiesSet  and any declared init method) are called, and also afterwards. The post-processor can take any action with the bean instance, including ignoring the callback completely. A bean post-processor typically checks for callback interfaces, or may wrap a bean with a proxy. Some Spring AOP infrastructure classes are implemented as bean post-processors and they do this proxy-wrapping logic. An ApplicationContext  automatically detects  any beans that are defined in the configuration metadata it receives that implement theBeanPostProcessor interface. The ApplicationContext registers these beans as post-processors, to be then called appropriately by the container upon bean creation. You can then deploy the post-processors as you would any bean.
  14. A bean factory post-processor is executed automatically when it is declared inside of an ApplicationContext, in order to apply changes to the configuration metadata that defines a container. Spring includes a number of pre-existing bean factory post-processors, such asPropertyOverrideConfigurer and PropertyPlaceholderConfigurer. A custom BeanFactoryPostProcessor can also be used, for example, to register custom property editors. An ApplicationContext detects any beans that are deployed into it and that implement the BeanFactoryPostProcessor interface. It automatically uses these beans as bean factory post-processors, at the appropriate time. You can then deploy these post-processor beans as you would any other bean. PropertyPlaceholderConfigurer You use the PropertyPlaceholderConfigurer to externalize property values from a bean definition into another separate file in the standard JavaProperties format. Doing so enables the person deploying an application to customize environment-specific properties such as database URLs and passwords, without the complexity or risk of modifying the main XML definition file or files for the container. Consider the following XML-based configuration metadata fragment, where a DataSource with placeholder values is defined. The example shows properties configured from an external Properties file. At runtime, a PropertyPlaceholderConfigurer is applied to the metadata that will replace some properties of the DataSource. The values to replace are specified as &apos;placeholders&apos; of the form ${property-name} which follows the Ant / Log4J / JSP EL style.   PropertyOverrideConfigurer The PropertyOverrideConfigurer, another bean factory post-processor, resembles the PropertyPlaceholderConfigurer, but unlike the latter, the original definitions can have default values or no values at all for bean properties. If an overriding Properties file does not have an entry for a certain bean property, the default context definition is used. Note that the bean definition is  not  aware of being overridden, so it is not immediately obvious from the XML definition file that the override configurer is used. In case of multiple PropertyOverrideConfigurer instances that define different values for the same bean property, the last one wins, due to the overriding mechanism.
  15. Autowiring has the following advantages: 1] Autowiring can significantly reduce the need to specify properties or constructor arguments 2] Autowiring can update a configuration as your objects evolve. For example, if you need to add a dependency to a class, that dependency can be satisfied automatically without you needing to modify the configuration. Thus autowiring can be especially useful during development, without negating the option of switching to explicit wiring when the code base becomes more stable. Limitations and disadvantages of autowiring Autowiring works best when it is used consistently across a project. If autowiring is not used in general, it might be confusing to developers to use it to wire only one or two bean definitions. Consider the limitations and disadvantages of autowiring: Explicit dependencies in property and constructor-arg settings always override autowiring. You cannot autowire so-called  simple properties such as primitives, Strings, and Classes (and arrays of such simple properties). This limitation is by-design. Autowiring is less exact than explicit wiring. Although, as noted in the above table, Spring is careful to avoid guessing in case of ambiguity that might have unexpected results, the relationships between your Spring-managed objects are no longer documented explicitly. Wiring information may not be available to tools that may generate documentation from a Spring container. Multiple bean definitions within the container may match the type specified by the setter method or constructor argument to be autowired. For arrays, collections, or Maps, this is not necessarily a problem. However for dependencies that expect a single value, this ambiguity is not arbitrarily resolved. If no unique bean definition is available, an exception is thrown. In the latter scenario, you have several options: Abandon autowiring in favor of explicit wiring. Avoid autowiring for a bean definition by setting its autowire-candidate attributes to false as described in the next section. Designate a single bean definition as the  primary  candidate by setting the primary attribute of its &lt;bean/&gt; element to true.
  16. The preceding is not desirable, because the business code is aware of and coupled to the Spring Framework. Method Injection, a somewhat advanced feature of the Spring IoC container, allows this use case to be handled in a clean fashion which we will see in next section
  17. For this dynamic subclassing to work, you must have the CGLIB jar(s) in your classpath. The class that the Spring container will subclass cannot be final, and the method to be overridden cannot be final either. Also, testing a class that has an abstractmethod requires you to subclass the class yourself and to supply a stub implementation of the abstract method. Finally, objects that have been the target of method injection cannot be serialized.
  18. Aspect-Oriented Programming  (AOP) complements Object-Oriented Programming (OOP) by providing another way of thinking about program structure. The key unit of modularity in OOP is the class, whereas in AOP the unit of modularity is the  aspect . Aspects enable the modularization of concerns such as transaction management that cut across multiple types and objects. (Such concerns are often termed  crosscutting  concerns in AOP literature.) One of the key components of Spring is the  AOP framework . While the Spring IoC container does not depend on AOP, meaning you do not need to use AOP if you don&apos;t want to, AOP complements Spring IoC to provide a very capable middleware solution. AOP is used in the Spring Framework to... 1] provide declarative enterprise services, especially as a replacement for EJB declarative services. The most important such service is  declarative transaction management . 2] Allow users to implement custom aspects, complementing their use of OOP with AOP.
  19. Spring AOP is implemented in pure Java. There is no need for a special compilation process. Spring AOP does not need to control the class loader hierarchy, and is thus suitable for use in a Servlet container or application server. Spring AOP currently supports only method execution join points (advising the execution of methods on Spring beans). Field interception is not implemented, although support for field interception could be added without breaking the core Spring AOP APIs. If you need to advise field access and update join points, consider a language such as AspectJ. Spring AOP&apos;s approach to AOP differs from that of most other AOP frameworks. The aim is not to provide the most complete AOP implementation (although Spring AOP is quite capable); it is rather to provide a close integration between AOP implementation and Spring IoC to help solve common problems in enterprise applications. Thus, for example, the Spring Framework&apos;s AOP functionality is normally used in conjunction with the Spring IoC container. Aspects are configured using normal bean definition syntax (although this allows powerful &amp;quot;autoproxying&amp;quot; capabilities): this is a crucial difference from other AOP implementations. There are some things you cannot do easily or efficiently with Spring AOP, such as advise very fine-grained objects (such as domain objects typically): AspectJ is the best choice in such cases. However, our experience is that Spring AOP provides an excellent solution to most problems in enterprise Java applications that are amenable to AOP. Spring AOP will never strive to compete with AspectJ to provide a comprehensive AOP solution. We believe that both proxy-based frameworks like Spring AOP and full-blown frameworks such as AspectJ are valuable, and that they are complementary, rather than in competition. Spring 2.0 seamlessly integrates Spring AOP and IoC with AspectJ, to enable all uses of AOP to be catered for within a consistent Spring-based application architecture. This integration does not affect the Spring AOP API or the AOP Alliance API: Spring AOP remains backward-compatible.
  20. Around advice is the most general kind of advice. Since Spring AOP, like AspectJ, provides a full range of advice types, we recommend that you use the least powerful advice type that can implement the required behavior. For example, if you need only to update a cache with the return value of a method, you are better off implementing an after returning advice than an around advice, although an around advice can accomplish the same thing. Using the most specific advice type provides a simpler programming model with less potential for errors. For example, you do not need to invoke the proceed() method on the JoinPoint used for around advice, and hence cannot fail to invoke it.
  21. Note : Because Spring AOP limits matching to only method execution join points, the discussion of the pointcut designators above gives a narrower definition than you will find in the AspectJ programming guide. In addition, AspectJ itself has type-based semantics and at an execution join point both &apos;this&apos; and &apos;target&apos; refer to the same object - the object executing the method. Spring AOP is a proxy-based system and differentiates between the proxy object itself (bound to &apos;this&apos;) and the target object behind the proxy (bound to &apos;target&apos;).
  22. Execution Pointcut Spring AOP users are likely to use the execution pointcut designator the most often. The format of an execution expression is: execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?) All parts except the returning type pattern (ret-type-pattern in the snippet above), name pattern, and parameters pattern are optional. The returning type pattern determines what the return type of the method must be in order for a join point to be matched. Most frequently you will use * as the returning type pattern, which matches any return type. A fully-qualified type name will match only when the method returns the given type. The name pattern matches the method name. You can use the * wildcard as all or part of a name pattern. The parameters pattern is slightly more complex: ()matches a method that takes no parameters, whereas (..) matches any number of parameters (zero or more). The pattern (*) matches a method taking one parameter of any type, (*,String) matches a method taking two parameters, the first can be of any type, the second must be a String. Around Advice Around advice runs &amp;quot;around&amp;quot; a matched method execution. It has the opportunity to do work both before and after the method executes, and to determine when, how, and even if, the method actually gets to execute at all. Around advice is often used if you need to share state before and after a method execution in a thread-safe manner (starting and stopping a timer for example). Always use the least powerful form of advice that meets your requirements (i.e. don&apos;t use around advice if simple before advice would do). Around advice is declared using the @Around annotation. The first parameter of the advice method must be of type ProceedingJoinPoint. Within the body of the advice, calling proceed() on the ProceedingJoinPoint causes the underlying method to execute. The proceed method may also be called passing in an Object[] - the values in the array will be used as the arguments to the method execution when it proceeds. The behavior of proceed when called with an Object[] is a little different than the behavior of proceed for around advice compiled by the AspectJ compiler. For around advice written using the traditional AspectJ language, the number of arguments passed to proceed must match the number of arguments passed to the around advice (not the number of arguments taken by the underlying join point), and the value passed to proceed in a given argument position supplants the original value at the join point for the entity the value was bound to (Don&apos;t worry if this doesn&apos;t make sense right now!). The approach taken by Spring is simpler and a better match to its proxy-based, execution only semantics. You only need to be aware of this difference if you are compiling @AspectJ aspects written for Spring and using proceed with arguments with the AspectJ compiler and weaver. There is a way to write such aspects that is 100% compatible across both Spring AOP and AspectJ, and this is discussed in the following section on advice parameters. The value returned by the around advice will be the return value seen by the caller of the method. A simple caching aspect for example could return a value from a cache if it has one, and invoke proceed() if it does not. Note that proceed may be invoked once, many times, or not at all within the body of the around advice, all of these are quite legal.
  23. Each of these transaction managers acts as a façade to a platform-specific transaction implementation (figure 5.2). This makes it possible for you to work with a transaction in Spring with little regard to what the actual transaction implementation is.
  24. You want to make a service object, the fooService bean, transactional. The transaction semantics to apply are encapsulated in the &lt;tx:advice/&gt; definition. The &lt;tx:advice/&gt; definition reads as “ ... all methods on starting with &apos;get&apos; are to execute in the context of a read-only transaction, and all other methods are to execute with the default transaction semantics ”. The transaction-managerattribute of the &lt;tx:advice/&gt; tag is set to the name of the PlatformTransactionManager bean that is going to  drive  the transactions, in this case, the txManager bean. The &lt;aop:config/&gt; definition ensures that the transactional advice defined by the txAdvice bean executes at the appropriate points in the program. First you define a pointcut that matches the execution of any operation defined in the FooService interface (fooServiceOperation). Then you associate the pointcut with the txAdvice using an advisor. The result indicates that at the execution of a fooServiceOperation, the advice defined by txAdvice will be run.
  25. Some of the benefits of using Spring for your O/X mapping needs are: Ease of configuration.  Spring&apos;s bean factory makes it easy to configure marshallers, without needing to construct JAXB context, JiBX binding factories, etc. The marshallers can be configured as any other bean in your application context. Additionally, XML Schema-based configuration is available for a number of marshallers, making the configuration even simpler. Consistent Interfaces.  Spring&apos;s O/X mapping operates through two global interfaces: the Marshaller and Unmarshaller interface. These abstractions allow you to switch O/X mapping frameworks with relative ease, with little or no changes required on the classes that do the marshalling. This approach has the additional benefit of making it possible to do XML marshalling with a mix-and-match approach (e.g. some marshalling performed using JAXB, other using XMLBeans) in a non-intrusive fashion, leveraging the strength of each technology. Consistent Exception Hierarchy.  Spring provides a conversion from exceptions from the underlying O/X mapping tool to its own exception hierarchy with the XmlMappingException as the root exception. As can be expected, these runtime exceptions wrap the original exception so no information is lost.