SlideShare ist ein Scribd-Unternehmen logo
1 von 42
Spring is grate framework for development of Enterprise grade applications. Spring is a
light-weight framework for the development of enterprise-ready applications. Spring can
be used to configure declarative transaction management, remote access to your logic using
RMI or web services, mailing facilities and various options in persisting your data to a
database. Spring framework can be used in modular fashion, it allows to use in parts and
leave the other components which is not required by the application.

Features of Spring Framework:

      Transaction Management: Spring framework provides a generic abstraction layer
       for transaction management. This allowing the developer to add the pluggable
       transaction managers, and making it easy to demarcate transactions without dealing
       with low-level issues. Spring's transaction support is not tied to J2EE environments
       and it can be also used in container less environments.

      JDBC Exception Handling: The JDBC abstraction layer of the Spring offers a
       meaningful exception hierarchy, which simplifies the error handling strategy

      Integration with Hibernate, JDO, and iBATIS: Spring provides best Integration
       services with Hibernate, JDO and iBATIS.

      AOP Framework: Spring is best AOP framework

      MVC Framework: Spring comes with MVC web application framework, built on
       core Spring functionality. This framework is highly configurable via strategy
       interfaces, and accommodates multiple view technologies like JSP, Velocity, Tiles,
       iText, and POI. But other frameworks can be easily used instead of Spring MVC
       Framework..

Spring Architecture

Spring is well-organized architecture consisting of seven modules. Modules in the Spring
framework are:

   1. Spring AOP
      One of the key components of Spring is the AOP framework. AOP is used in
      Spring:
           To provide declarative enterprise services,especially as a replacement for
              EJB declarative services. The most important such service is declarative
              transaction management, which builds on Spring's transaction abstraction.
           To allow users to implement customaspects, complementing their use of
              OOP with AOP
   2. Spring ORM
      The ORM package is related to the database access. It provides integration layers
      for popular object-relational mapping APIs, including JDO, Hibernate and iBatis.

   3. Spring Web
      The Spring Web module is part of Spring’s web application development stack,
which includes Spring MVC.

   4. Spring DAO
      The DAO (Data Access Object) support in Spring is primarily for standardizing the
      data access work using the technologies like JDBC, Hibernate or JDO.

   5. Spring Context
      This package builds on the beans package to add support for message sources and
      for the Observer design pattern, and the ability for application objects to obtain
      resources using a consistent API.

   6. Spring Web MVC
      This is the Module which provides the MVC implementations for the web
      applications.

   7. Spring Core
      The Core package is the most import component of the Spring Framework.
      This component provides the Dependency Injection features. The BeanFactory
      provides a factory pattern which separates the dependencies like initialization,
      creation and access of the objects from your actual program logic.

The following diagram represents the Spring FrameworkArchitecture
(PUBLISHED IN DEVELOPER IQ - September2005)

Spring is an open-source application framework, introduced and developed in 2004. The
main ideas were suggested by an experienced J2EE architect, Rod Johnson.

He had earlier, written a book titled 'J2EE Develoment without using EJB' and had
introduced the concept of Light-weight container. Primarily, his argument is that while EJB
has its merits, it is not always necessary and suitable in all applications.

Just as Hibernate attacks CMP as primitive ORM technology, Spring attacks EJB as unduly
complicated and not susceptible to unit-testing. Instead of EJB, Spring suggests that we
make use of ordinary Java beans, with some slight modifications, to get all the supposed
advantages of EJB environment. Thus, Spring is posed as an alternative to EJB essentially.
However, as a concession to the existing EJB investments, Spring is designed to operate
with EJB if required.

Much of the philosophy and approach of Spring framework, however, predates , the latest
EJB vesrion (ie) EJB-3, about to arrive shortly. It is said that EJB-3 has absorbed a number
of new ideas suggested by Spring and some more, to answer the criticisms. There is a
debate going on in the Java community about Spring and EJB-3. Spring is not a Persistence
technolgy but a framework which allows plug in of other such technol gies. But EJB-3 is
                                                                         o
primarily focussed on Persistence Technology and has now incorporated Hi ernate, the
                                                                                b
best ORM todate.Talks are going on to incorpotrate another equally nice ORM Technology
known as JDO, which provides for Object Database also. Moreoveer, EJB-3 's Attribute-
Orientaed Meta tags, help in vastly reducing the size of XML lines. Some have complained
that Spring is still too dependent on XML files. In this tutorial, any reference to EJB, is
only to EJB-2.My aim in presenting this tutorial is not to advocate the choiceof either
Spring or EJB-3, a topic still being devbated by experts but to sharemy perception with our
readers.

In spring, we can make use of plain Java Beans to achieve things that were previously
possible with EJB only. The main aim of Spring is to simplify the J2EE development and
testing.

EJB has been around since 1988 and is an established standard and specification in
Enterprise world. Though there have been numerous Open-source Javatechnologies
recently, no other technology has claimed to be superior to EJB, in its total features.

Rod Johnson, in his book, critices a number of features in EJB. Significantly, he has also
spoken approvingly of some features of EJB and has recommended its use in some special
circumstances.

EJB is a standard with wide Enterprise-level Industry support.It has been deployed in
thousands of successful applications around the world. TheEJB specification is a fixed
target and so tool-developers are able to develop wizards, which can make ejb development
quick and easy. There are many vendors for EJB application server like IBM (Web-
Sphere), BEA (Weblogic), Oracle (JDeveloper) etc.

To quote from another book on Spring (quot;Springin Actionquot; - Craig Walls-Manning press) quot;
EJB is complex quot;, as the author put it nicely, quot;not for just being complex'. It is complex
because it attempts to provide solutions for complex problemsquot;. EJB is developed
mainly for the remote transaction and distributed objects. But a number of enterprise
projects do not have this level of complexity and still use EJBs and even the simple
application becomes complex. In such cases Spring claims to be an alternative.

Since Spring comes with rich support to enterprise level services, it claims to be an
alternative to EJB It is worthwhile to begin with a comparison of EJB-2 and Spring, in
some main features.

The main advantages of EJB are :

a) Transaction Management
b) Declarative Transaction support
c) Persistence ( CMP & BMP)
d) Declarative Security
e) Distributed Computing (Container managed RPC)

Spring does not attempt to do everythi g by itself but supports the best of breed
                                      n
technologies for each of these requirements.
For example, instead of CMP & BMP, it supports several persistence technologies like
JDO, Hibernate and OJB. These ORM toools are far more capable than the
implementation in CMP.To simplify JDBC coding, there are tools like iBatis and Spring
supports iBatis also.

Spring makes use of Acegi, an open-source Security framework and provides declarative
security through spring configuration file or class metadata while in EJB declarative
security is configured through deployment descriptor.
Spring provides proxying for RMI (special remoting technologies like Burlap) JAX-
RPC & web-service while EJB provides container-managed remote method calls.
Spring can offer declarative transaction like EJB. But spring provides declarative rollback
behavior also ,for methods and exceptions
Thus, while EJB is monolithic and attempts to do many things, some tasks fairly well and
some others not so well, Spring uses ordinary Java beans only and through special
techniques provides many of the functionalities of EJB, by integrating with a number of
open-source technologies.

Thereby, it gives the following advantages over EJB2.
a) testing is easier. We do not need to start the EJB container , for testing.
b) As Spring is based on the standard JavaBeans naming convention, programmers find it
easy to work with.
c) It makes use of AOP(Aspect-Oriented Programming) which is a very recent and useful
paradigm., in addition to classic OOP and preserves the purity of OOP.
d) It is flexible.
Spring's goal is to be an entire Application Framework. Other popular framewoks like
Struts, Tapestry, JSF etc., are very good web tier frameworks but when we use these
framework, we have to provide additional framework to deal with enterprise tier that
integrates well with these framework. Spring tries to alleviate this problem by providing a
comprehensive framework, which includes
a core bean container,
an MVC framework,
an AOP integration framework,
a JDBC integration framework and
an EJB integration framework.

It also provides integration modules for O/R mapping tools like Hibernate and JDO. Thus
spring framework can be thought of as a layered architecture consisting of seven well
defined modules.
The function of each component is as follows:

1. Core Container:
The core container provides the fundamental functionality of Spring. It's primary
component is the 'BeanFactory', an implementation of the Factory pattern. The
BeanFactory applies the IOC pattern to separate an application's configuration and
dependency specification from the actual application code.

2. Spring Context/Application Context:
The Spring context is a configuration file that provides context information to the Spring
framework . The Spring context supplies enterprise services such asJNDI access, EJB
integration, e-mail, internalization, validation, and scheduling functionality.

3. Spring AOP:(Aspect-Oriented)
The Spring AOP module integrates aspect-oriented programming functionality directly into
the Spring framework, through its configuration management feature. As a result we can
easily AOP-enable any object managed by the Spring framework. The Spring AOP module
provides transaction management services for objects in any Spring-based application.
With Spring AOP we can incorporate declarative transaction management into our
applications without relying on EJB components.
The Spring AOP module also introduces metadata programming to Spring. Using this we
can add annotation to the source code that instructs Spring on where and how to apply
aspects.

4. Spring DAO:
The Spring's JDBC and DAO abstraction layer offers a meaningful exception h     ierarchy
for managing the databaase connection, exception handling and error messages thrown by
different database vendors. The exception hierarchy simplifies error handling and greatly
reduces the amount of code that we need to write, such as opening and closing connections.
This module also provide transaction management services for objects in a spring
application.

5. Spring ORM:
The Spring framework can be integrated to several ORM frameworks to provide Object
Relational tool, including JDO, Hibernate, OJB and iBatis SQL Maps.

6. Spring Web module:
The Web context module builds on top of the application context module, providing
contexts for Web-based applications. As a result, the Spring framework supports
integration with Jakarta Struts, JSF and webworks. The Web module also eases the
tasks of handling multipart requests and binding request parameters to domain objects.

7. Spring MVC Framework:
The MVC framework is a full-featured MVC implementation for building Web
applications. The MVC framework is highly configurable via strategy interfaces and
accommodates numerous view technologies including JSP, Velocity, Tiles and the
generation of PDF and Excel Files.

--------------------------------------------
I would venture to suggest that Spring will win sure acceptance among j2ee devcelopers ,
very soon because of its ready-made adapters for various hot web-tier and presentation
technologies.!
For example, there is a great varierty of technologies in the web-tier like MVC
PATTERN, STRUTS, JSF, WEB-WORK, JSP, TAPESTRY,FREEMARKER etc.
Developers are now puzzled and confused about the relative meritsand demerits of all
these. Once they choose a technology and start implementing and later want to change over
to another technology, it is very difficult. But, as Spring offers modules for aall the above
technologies, it is most often simply changi g the configuraion file. With this approach, it
                                              n
is even possible for a development team to try and test a given task in all the above forms
and see the effect and performance before deciding the choice. Spring offers its own
version of MVC architecture. It also offers adapters for Struts.

In the MVC adapter, it offers the following View choices.

JSP is default view template. 'InternalResouceViewResolver'can be used for this
purpose. Spring can be integrated with other template solutions like Velocity,
FreeMarker, tiles etc., Also Spring can be used to produce dynamic binary Excel
spreadsheet, PDF documents etc.,

To configure the velocity engine 'VelocityConfigurer' bean is declared in spring
configuration. The view resolver is configured by 'VelocityViewResolver' bean.

To configure the FreeMarker engine 'FreeMarkerConfigurer' bean is declared in spring
configuration. The view resolver is configured by 'FreeMarkerViewResolver' bean.

'TilesConfigurer' can used to used to load Ti es configuration file for rendering Tiles
                                            l
view. 'AbstractExcelView' is used to generate Excel SpreadSheet as views.
'AbstactPdfView' supports the creation of PDF as views. 'buildPdfDocument()' is used to
create PDF decument. Similarly we have 'buildExcelDocument()' to create the excel
document.

For delegation purpose, Spring provides 'DelegatingRequestProcessor' and to use the
tiles 'DelegatingTilesRequestProcessor'is used. 'SpringTapestryEngine' is used for
integrating Tapestry to Spring. 'FacesSpringVariableResolver'is used to resolve spring-
managed beans in JSF.

-----------------------------------------------------------------------------

Next we shall see the main concepts of Spring, Inversion of Control (IoC) and Aspect
Oriented Programming. Spring is based on dependency injection type of IoC . We don't
directly connect our components and services toget er in code but describe which services
                                                    h
are needed by which components in a configuration file. A container is responsible for
hooking it up. This concept is similar to 'Declarative Management' IOC is a broad
                                                                   .
concept. the two main types are

 1. Dependency Lookup:
The container provides callbacks to components and a lookup context. The managed
objects are responsible for their other lookups. This is the EJB Approach. The Inversion
of Control is limited to the Container involved callback methods that the codecan use to
obtain resources. Here we need to use JNDI to look up other EJBs and resources. Because
of this reason EJB is not branded as 'IOC framework'.There are some problems in this
implementation. The class needs a application server environment as it is dependent on
JNDI and it is hard to test as we need to provide a dummy JNDI contest for testing
purpose.

2. Dependency Injection:
In this application objects is not responsible for looking up resources they depend on.
Instead IoC container configures the object externalizing resource lookup from application
code into the container. That is, dependencies are injected into objects. Thus lookups are
completely removed from application objects and it can be used outside the container
also.

----
In this method, the objects can be populated via Setter Injection (Java-Beans properties)
or Constructor Injection (constructor arguments). Each method has its own advantage and
disadvantage.
Normally in all the java beans, we will use setter and getter method to set and get the value
of property as follows

    public class namebean

{

     String     name;



     public void setName(String a)

     {

         name = a;

     }

     public String getName()

     {

         return name;

     }

}

We will create an instance of the bean 'namebean' (say bean1) and set property as
bean1.setName(quot;tomquot;); Here in setter injection, we will set the property 'name' by using
the <property> subelement of <bean> tag in spring configuration file as showm below,



<bean id=quot;bean1quot; class=quot;namebeanquot;>
<property        name=quot;namequot; >

         <value>tom</value>

    </property>



</bean>



The subelement <value> sets the 'name' property by calling the set method as

setName(quot;tomquot;); This process is called setter injection.

For constructor injection, we use constructor with parameters as shown below,

public class namebean

{

     String name;

     public namebean(String a)

     {

         name = a;

     }

}

We will set the property 'name' while creatinf an instance of the bean 'namebean' as
namebean bean1 = new namebean(quot;tomquot;);
 Here we use the <constructor-arg> element to set the the property by construct ro
injection as

<bean id=quot;bean1quot; class=quot;namebeanquot;>

    <constructor-arg>

      <value>My Bean Value</value>
</constructor-arg>



</bean>

To set properties that reference other beans <ref>, subelement of <property> is used as
shown below,

<bean id=quot;bean1quot; class=quot;bean1implquot;>

  <property name=quot;gamequot;>

     <ref bean=quot;bean2quot;/>

  </property>

</bean>

<bean id=quot;bean2quot; class=quot;bean2implquot; />

Aspect-Oriented Programming

---------------------------

Aspect Oriented programming is a new

programming technique that promotes separation of concerns within the system. System
are composed of several components each responsible for a specific piece of functionality.
Whatever may be the core function of the program, the system service like logging,
transaction management, security etc., must be included in the program. These system
services are commonly refered to as 'cross-cutting concerns' as they tend to cut across
multiple components in a system. AOP makes it possible to modularize and separate these
services and then apply them declaratively to the components and we can focus on our own
specific concerns. In spring, aspects are wired into objects in the spring XML file in the
same way as JavaBean. This process is known as 'Weaving'.

----------------------------------------

The container is at the core of Spring Container. In manages the life cycle and
configuration of application objects. We can configure how each of our beans should be
created either to create a single instance of bean or produce a new instance every time and
how they should be associated with each other. Spring should not, however, be confused
with traditionally heavyweight EJB containers, which are often large. The Spring actually
comes with two distinct containers: Bean Factories-defined by quot;org.springframework.
beans.factory.BeanFactoryquot; are the simplest containers, providing support for
dependency injection. Application contexts - defined by
quot;org.springframework.context.Application Contextquot; provides application framework
services.

BEAN FACTORY:
Bean factory is an implementation of the factory design pattern and its function is to create
and dispense beans. As the bean factory knows about many objects within an application, it
is able to create association between collaborating objects as they are instantiated. This
removes the burden of configuration from the bean and the client.

There are several implementation of BeanFactory. The most useful one is
quot;org.springframework.beans.factory.xml.
XmlBeanFactoryquot;. It loads its beans based on the definition contained in an XML file. To
create an XmlBeanFactory, pass a InputStream to the constructor. The resource will
provide the XML to the factory.
BeanFactory factory = new XmlBeanFactory(new FileInputStream(quot;myBean.xmlquot;));


This line tells the bean factory to read the bean definition from the XML file. The bean
definition includes the description of beans and their properties. But the bean factory
doesn't instantiate the bean yet. To retrieve a bean from a 'BeanFactory', the getBean()
method is called. When getBean() method is called, factory will instantiate the bean and
begin setting the bean's properties us dependency injection.
                                       ing

 myBean bean1 = (myBean)factory.getBean(quot;myBeanquot;);

APPLICATION CONTEXT:
While Bean Factory is used for simple applications, the Application Context is spring's
more advanced container. Like 'BeanFactory' it can be used to load bean definitions, wire
beans together and dispense beans upon request.

It also provide
1) a means for resolving text messages, including support for internationalization.
2) a generic way to load file resources.
3) events to beans that are registered as listeners.

Because of additional functionality, 'Application Context' is preferred over a BeanFactory.
Only when the resource is scarce like mobile devices, 'BeanFactory' is used. The three
commonly used implementation of 'Application Context' are

1. ClassPathXmlApplicationContext : It Loads context definition from an XML file
located in the classpath, treating context definitions as classpath resources. The application
context is loaded from the application's classpath by using the code
ApplicationContext context = new ClassPathXmlApplicationContext(quot;bean                .xmlquot;);

2. FileSystemXmlApplicationContext : It loads context definition from an XML file in the
filesystem. The application context is loaded from the file system by using the code
ApplicationContext context = new FileSystemXmlApplicationContext(quot;b              ean.xmlquot;);

3. XmlWebApplicationContext : It loads contex definition from an XML file contained
                                             t
within a web application.
Spring is lightweight in terms of both size and overhead. The entire Spring framework can
be distributed in a single JAR file that weighs just over 1.7 MB. And the processing
overhead required by Spring is negligible. Also Spring is nonintrusive:(ie) objects in a
Spring-enabled application typically have no dependencies on Spring-specific classes.

There are other lightweight containers like HiveMind, Avalon, PicoContainer etc.,
Avalon was one of the first IoC containers. Avalon mainly provides interface-dependent
IoC. so, we much change our code in order to use a different container. This couples your
code to a particular framework which is an undesirable feature.

PicoContainer is a minimal (very small size nearly 50k) lightweight container that
provides IoC in the form of constructor and setter injection. By using PicoContainer we can
only assemble components programmaticallythrough PicoContainer's API. But it allows
only one instance of any particular type to be present in the registry. Also PicoContainer is
only a container. It does not offer various special features as spring like integration.

HiveMind is relatively new IoC container. Like PicoContainer, it focuses on wiring with
support for both constructor and setter injections. It also allows us to define our
configuration in an XML file. Like PicoContainer, HiveMind is only a container. It does
not offer integration with other technology. Thus Spring makes it possible to configure and
compose complex applications from simpler components. In Spring, application objects are
composed declaratively, typically in an XML file. Spring also provides much infrastructure
functionality like transaction management, persistence framework integration, etc., leaving
the development of application logic to us.
With this inroduction, we shall see a simple example in Spring in next article.

-------------------------------------------

 BOOKS FOR REFERENCE:

1.'Spring in Action' - Craig Walls and Ryan Breidenbach.

2.'J2EE Development without EJB'

  - Rod Johnson

PART-II
-----------------

(PUBLISHED IN DEVELOPER IQ - September2005)
The Spring Framework comes in the form of ZIP file with the necessary jars, examples
etc., The Spring framework can be downloaded from http://www.springframework.org       .
There will be two zip files one with dependencies and other wit out. The spring framework
                                                                h
with dependencies is larger and includes all dependent libraries. Download Spring
framework 1.2 without dependency and unzip on the hard disk as spring12

Inside the folder spring12 we can find 7 folders. The name and the contents of all the
folders are given below,
1. dist: It contains various Spring distribution jar files.
2. docs: It contains general documentation and API javadocs.
3. mock: It contains mock JNDI contexts and a set of servlet API mock objects.
4. samples: It contains demo applications and skeletons.
5. src: It contains the Java source files for the framework.
6. test: It contains the Java source files for Spring's test suite.
7. tiger: It contains JDK1.5 examples and test suite.

Inside the quot;distquot; directory, we can find all the jar files necessary for compiling and
executing the program. The jar files and its contents are listed below:
1. spring.jar : It contains the entire Spring framework including everything in the other
JAR files also.
2. spring-core.jar : It contains the core Spring container and its utilities.
3. spring-beans.jar : It contains the bean Spring container and JavaBeans support utilities.

4. spring-aop.jar : It contains Spring's AOP framework, source-level metadata support,
AOP Alliance interfaces etc.,
5. spring-context.jar : It contains application context, validation framework, JNDI,
templating support and scheduling.
6. spring-dao.jar : It contains DAO support and transaction infrastructure.
7. spring-jdbc.jar : It contains the JDBC support.
8. spring-support.jar : It contains JMX support, JCA support, scheduling support, mail
support and caching support.
9. spring-web.jar : It contains the web application context, multipart resolver, Struts
support, JSF support and web utilities.
10. spring-webmvc.jar : It contains the framework servlets, web MVC framework, web
controllers and web views.
11. spring-remoting.jar :It contains remoting support, EJB support and JMS support.
12. spring-orm.jar : It contains iBATIS SQL Maps support, Apache OJB support,
TopLink support and JDO support.
13. spring-hibernate.jar : It contains Hibernate 2.1 support, Hibernate 3.x support.
14. spring-mock.jar : It contains JNDI mocks, Servlet API mocks and JUnit support.

--------------------------------------------

Now we will run a greeter example in Spring.

f:>md springdemo
f:>cd springdemo

As the entire Spring Framework is included in spring.jar. We use that to run our examples.
Copy spring.jar from spring12dist folder to the working folder. Also copy commons-
logging.jar from tomcat41serverlib to the working directory.

f:springdemo>set path=c:windowscommand;g:jdk1.5bin
(* Set path for jdk1.5 or jdk1.4.2 only. )
f:springdemo>set classpath=f:springdemo;
f:springdemospring.jar;

f:springdemocommons-logging.jar

 For a typical Spring Application we need the following files
1. An interface that defines the functions.
2. An Implementation that contains properties, its setter and getter methods, functions
etc.,
3. A XML file called Spring configuration file.
4. Client program that uses the function.

Edit
1. hello.java
2. helloimpl.java
3. hello.xml
4. helloclient.java

    //f:springdemohello.java

public interface hello
{
  public String sayhello(String a);
}

--------------------------------------------

//f:springdemohelloimpl.java
public class helloimpl implements hello

{

      private String greeting;
      public helloimpl()

      {

      }

      public helloimpl(String a)

      {

      greeting=a;

      }

      public String sayhello(String s)
{

           return greeting+s;

      }

      public void setGreeting(String a)

      {

           greeting=a;

      }

}

--------------------------------------------

//f:springdemohello.xml

    <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>

<!DOCTYPE beans PUBLIC

quot;-//SPRING//DTD BEAN//ENquot;

quot;http://www.springframework.org/dtd/spring-beans.dtdquot;>

    <beans>

    <bean id=quot;helloquot;

          class=quot;helloimplquot;>

    <property name=quot;greetingquot;>

      <value>Good Morning!...</value>

    </property>

    </bean>

</beans>

--------------------------------------------

//f:springdemohelloclient.java
import java.io.*;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.xml.*;
import org.springframework.core.io.*;

public class helloclient

{

    public static void main(String args[]) throws Exception

    {

        try

        {

            System.out.println(quot;please Wait.quot;);
            Resource res = new ClassPathResource(quot;hello.xmlquot;);
            BeanFactory factory = new XmlBeanFactory(res);
            hello bean1 = (hello)factory.getBean(quot;helloquot;);
            String s = bean1.sayhello(args[0]);
            System.out.println(s);

        }

        catch(Exception e1)

              { System.out.println(quot;quot;+e1); }

    }

}

-------------------------------------------

To run:
f:springdemo>javac hello.java
f:springdemo>javac helloimpl.java
f:springdemo>javac helloclient.java
f:springdemo>java helloclient quot;samquot;

We will get the output as follows:
please wait..
Aug 5, 2002 2:10:56 AM org.springframework.
beans.factory.xml.XmlBe   anDefinitionReader
loadBeanDefinitions
INFO: Loading XML bean definitions from
class path resource [hello.xml]
Aug 5, 2002 2:10:57 AM org.springframework.
beans.factory.support.
AbstractBeanFactorygetBean

INFO: Creating shared instance of singleton
bean 'hello'
Good Morning!...sam

------------------------------------

Thus we have run our first Spring program.Here helloimpl implements the hello interface.
Although it is not necessary to hide the implementation behind an interface,it is
recommended as a way to seperate implementation from interface. helloimpl has a single
property greeting. This property can be set in two different ways: by property's setter
method or by the constructor. The XML file hello.xml declares the instance of
helloimpl.java in the spring container and configures its property greeting with the value
'Good Morning!...'

The root of the hello.xml file is the <beans> element, which is the root element of any
Spring configuration file. The <bean> element is used to tell the Spring container about the
class and how it should be configured. Here, the id attribute takes the interface name and
the class attribute specifies the bean’s fully qualified class name.

Within the <bean> element, the <property> element is used to set the property, in this case
the greeting property. By using <property>, we’re telling the Spring container to call
setGreeting() while setting the property. The value of the greeting is defined within the
<value> element. Here we have given 'Good Morning!...' as the value.

The container instantiates the 'helloimpl' based on the XML definition as,

helloimpl hello = new helloimpl();
helloimpl.setGreeting(quot;Good Morning!...quot;);

Similarly, greeting property may be set through the single argument constructor of
'helloimpl' as,
<bean id=quot;helloquot; class=quot;helloimplquot;>
<constructor-arg>
<value>Good Morning!...</value>
</constructor-arg>
</bean>

Now the container instantiates the 'helloimpl' based on the XML definition as,

helloimpl hello = new
helloimpl(quot;Good Morning...quot;);
In the client program, 'BeanFactory' class is used which is the Spring container. Then the
'getBean()' method is called to get the reference to the 'hello'. With this reference,
sayhello() method is called.

------------------------------------------

We can also use a frame client. The code is very much similar to console client except the
GUI code.

//f:springdemohelloframe.java

import java.io.*;

import java.awt.*;

import org.springframework.beans.factory.*;

import org.springframework.beans.factory.xml.*;

import org.springframework.core.io.*;

public class helloframe           extends Frame

{

TextField          text1;

TextArea           area1;

Label              label1;

Button             button1;

    public static void main(String args[])

    {

         helloframe       app = new helloframe();

         app.setSize(700,500);

         app.setVisible(true);

    }

    helloframe()

    {

         setLayout(new FlowLayout());
setBackground(Color.green);

    label1=new Label(quot;Type Name: quot;);

    text1=new TextField(25);

    area1=new TextArea(10,50);

    button1=new Button(quot;Exitquot;);

    button1.setBackground(Color.red);

    add(label1);

    add(text1);

    add(area1);

    add(button1);

}

public boolean action (Event e,Object c)

{

    if(e.target==text1)

    {

        try

        {

            area1.append(quot;Please Wait..nquot;);

            Resource    res = new   ClassPathResource(quot;hello.xmlquot;);

            BeanFactory    factory = new   XmlBeanFactory(res);

            hello bean1 = (hello)factory.getBean(quot;helloquot;);

            String s = bean1.sayhello(text1.getText());

            area1.append(s);

        }

        catch(Exception e1)

                       {area1.append(quot;quot;+e1);}

    }
if(e.target==button1)

        {

            System.exit(0);

        }

        return true;

    }


Then compile and run the frame client program. We will a textbox, a exit button and a text
area. Type a name (say 'tom') in text area and press enter. 'Good Morning!... tom' will
appear in the text area

--------------------------------------------

  Next we shall see how to run this program as a servlet. Consider Tomcat-5 is installed in
g drive.
   First copy g:spring12spring.jar to g:tomcat5commonlib and start tomcat server.
   Then set classpath as shown below and edit the servletclient.java.

    f:springdemo>set classpath=f:springdemo;

    f:springdemospring.jar;

    f:springdemocommons-logging.jar;

    g:tomcat5commonlibservlet-api.jar

//f:springdemoservletclient.java

import java.io.*;

import org.springframework.beans.factory.*;

import org.springframework.beans.factory.xml*;
                                           .

import org.springframework.core.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class servletclient extends HttpServlet

{
public void doPost(HttpServletRequest req,HttpServletResponse resp)

        throws ServletException,IOException



{

    resp.setContentType(quot;text/htmlquot;);

    PrintWriter out =resp.getWriter();



    String a = req.getParameter(quot;text1quot;);

    try

    {

        System.out.println(quot;Please wait.quot;);



        Resource res = new ClassPathResource(quot;hello.xmlquot;);

        System.out.println(quot;Resource okquot;);



        BeanFactory factory = new XmlBeanFactory(res);

        System.out.println(quot;BeanFactory okquot;);



        hello bean1 = (hello)factory.getBean(quot;helloquot;);



        String s = bean1.sayhello(a);

        out.println(s);

    }

    catch(Exception e1)
{System.out.println(quot;quot;+e1);}

    }

}

--------------------------------------------

//f:springdemoservletclient.htm



<html>

<body>

<form method=post

        action=quot;http://localhost:8080/

               servlet/servletclientquot;>

    <input type=text name=quot;text1quot;>

    <input type=submit>

</form>

</body>

</html>

--------------------------------------------

Then compile the servlet and copy all the class files ie., hello.class, helloimpl.class,
servletclient.class and the xml file hello.xml to g:tomcat5webappsrootweb-infclasses.
Copy html file servletclient.htm to g:tomcat5webappsroot. Add entry to web.xml file.
Restart Tomcat server and open browser and type url as
http://localhost:8080/servletclient.htm. We will get a text box and a button. Type a name
(say 'tom') and click the 'submit' button.

Good Morning!... tom will appear

In the next article, we shall see how to contact the database from Spring.
PART-III
(PUBLISHED IN DEVELOPER IQ - September2005)
Now we will move on to the main process of any enterprise application: Data Persistence.
For this we have to initialize our data access framework, manage resources, handle
various exceptions and if anything goes wrong, we must roll-back so as to save the
existing data.

Spring comes with a family of data access frameworks that integrates well will variety of
data access technologies like JDBC, Java Data Objects and Object Relational Mapping
(ORM) tools like Hibernate, OJB, iBatis etc.,

Many J2EE application servers and even web servers provide a 'dataSource' via Jndi
name. To configure the spring bean with the Jndi name of our 'dataSource' and use its
connection pooling facility 'JndiObjectFactoryBean' is used. When a DataSource is not
present, we need a connection pooling bean that implements 'dataSource'. For this
purpose we use 'dbcp.BasicDataSource' is used. By using this we can have a
'dataSource' with connection pooling independent of application server.

To perform unit-tests in our data access code, spring comes with a very lightweight
'dataSource' implementation class: 'DriverManagerDataSource'. This class can be easily
configured for unit tests as,

DriverManagerDataSource dataSource = new DriverManagerDataSource();

dataSource.setDriverClassName(driver);

dataSource.setUrl(url);

dataSource.setUsername(username);

dataSource.setPassword(password);

These properties can be configured in the spring configuration file also.

----------------------------------------------

Spring comes with its own data access framework. Spring separates the fixed andvariant
parts of data access process into two distinct classes : template and callback. Template
manages the fixed part of our framework like data connection, managing resources,
controlling transaction etc., while the Callback defines the things that are specific to our
application like creating statements, binding parameters etc.,

The template class of Spring is 'JdbcTemplate'. A 'dataSource' is provided inside
JdbcTemplate.

An example of database connection using 'JdbcTemplate' is shown below. Here we are
using 'MySql' database. The MySql database can be downloaded from
http://www.mysql.com. Download mysql4.1 and MyODBC-3.51 (ODBC Connector)
install these in the hard disk. For Mysql give a username('root') and a password ('sql').

Then start the 'My Sql Console Line Client' from programs and type the password.

The prompt will be changed to mysql,

mysql> show databases;

Two databases will be present default: mysql and test.

mysql> use test;

We will get message as 'Database changed'. Next create table in test database as follows

mysql> create table table1(name text, place text);

We will get the message 'Query OK, 0 rows affected'. Now we have created a table in
mysql database, set the path and classpath as before and edit the program

-----
f:sprindemodatacon.java


import javax.sql.*;

public interface datacon

{

    public DataSource dbcon();

}

----------------------------------------

f:sprindemodataconimpl.java

import org.springframework.j
                           dbc.core.*;

import org.springframework.j
                           dbc.datasource.*;
import org.springframework.j
                           dbc.object.*;

import org.springframework.j
                           dbc.support.*;

import javax.sql.*;

public class dataconimpl implements datacon

{

    private DataSource dataSource;

    public void setDataSource(DataSource ds)

    {

        dataSource = ds;

    }

    public DataSource dbcon()

    {

        return dataSource;

    }

}

----------------------------------------

f:sprindemodatacon.xml

<?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>

<!DOCTYPE beans PUBLIC quot;-//SPRING//DTD BEAN//ENquot;

quot;http://www.springframework.org/dtd/spring-beans.dtdquot;>

<beans>

    <bean id=quot;dataSourcequot;

        class=quot;org.springframework.jdbc.datasource.DriverManagerDataSourcequot;
                                                                          >
<property name=quot;driverClassNamequot;>

     <value>sun.jdbc.odbc.JdbcOdbcDriver</value>

   </property>

   <property name=quot;urlquot;>

     <value>jdbc:odbc:test</value>

   </property>

   <property name=quot;usernamequot;
                           >

     <value>root</value>

   </property>

   <property name=quot;passwordquot;>

     <value>sql</value>

   </property>

 </bean>

 <bean id=quot;dataconquot; class=quot;dataconimplquot;>

   <property name=quot;dataSourcequot;>

      <ref local=quot;dataSourcequot;/>

   </property>

 </bean>

</beans>

----------------------------------------

f:sprindemospringservlet.java

import java.io.*;

import javax.sql.*;
import java.sql.*;

import java.util.*;

import javax.servlet.*;

import javax.servlet.http.*;

import org.springframework.beans.factory.*;

import org.springframework.beans.factory.xml.*;

import org.springframework.core
                              .io.*;

import org.springframework.j
                           dbc.core.*;

import org.springframework.j
                           dbc.datasource.*;

import org.springframework.j
                           dbc.object.*;

import org.springframework.j
                           dbc.support.*;

public class springservlet extends HttpServlet

{

    public void doPost(HttpServletRequest req,HttpServletResponse resp)

              throws ServletException,IOException

    {

        resp.setContentType(quot;text/htmlquot;);

        PrintWriter out = resp.getWriter();

        String a = req.getParameter(quot;text1quot;);

        String b = req.getParameter(quot;text2quot;);

        String c = req.getParameter(quot;combo1quot;);

        String d = req.getParameter(quot;combo2quot;);

        try
{

    System.out.println(quot;Wait...quot;);

    Resource res = new ClassPathResource(quot;datacon.xmlquot;);

    BeanFactory factory = new XmlBeanFactory(res);

    datacon bean1 = (datacon)factory.getBean(quot;dataconquot;);

    DataSource ds=bean1.dbcon();

    if(d.equals(quot;addquot;))

    {

        JdbcTemplate jt = new JdbcTemplate(ds);

        jt.execute(quot;insert into table1 values('quot;+a+quot;','quot;+b+quot;') quot;);

        out.println(quot;Record Addedquot;);

    }

    if(d.equals(quot;deletequot;))

    {

        JdbcTemplate jt = new JdbcTemplate(ds);

        jt.execute(quot;delete from table1 where name='quot;+a+quot;' quot;);

        out.println(quot;Record Deletedquot;);

    }

    if(d.equals(quot;findquot;))

    {

        List list1;

        JdbcTemplate jt = new JdbcTemplate(ds);

        list1=jt.queryForList(quot;select * from table1 where name='quot;+a+quot;'quot;);
Iterator i=list1.iterator();

    while(i.hasNext())

    {

        Object ob = i.next();

        out.println(ob.toString());

    }

}

if(d.equals(quot;updatequot;))

{

    if(c.equals(quot;namequot;))

    {

        JdbcTemplate jt = new JdbcTemplate(ds);

        jt.execute(quot;update table1 set table1.place='quot;+b+quot;'where

                                   table1.name='quot;+a+quot;' quot;);

    }

    if(c.equals(quot;placequot;))

    {

        JdbcTemplate jt = new JdbcTemplate(ds);

        jt.execute(quot;update table1 set table1.name='quot;+a+quot;'where

                            table1.place='quot;+b+quot;' quot;);

    }

    out.println(quot;Record Updatedquot;);

}
}

        catch(Exception e1)

             {System.out.println(quot;quot;+e1);}

    }

}

----------------------------------------

f:sprindemospringservlet.htm

<html>

<body bgcolor=quot;pinkquot;>

<form method=post

            action=quot;http://localhost:8080/

                 servlet/springservletquot;>

Name            : <input type=text name=quot;text1quot;> <br><br>

Place          : <input type=text name=quot;text2quot;> <br><br>

Criterion :

    <select name=quot;combo1quot; size=1>

            <option value=quot;namequot;>Name

            <option value=quot;placequot;>Place

    </select>               <br><br>

    <select name=quot;combo2quot; size=1>

            <option value=quot;addquot;>Add

            <option value=quot;deletequot;>Remove

            <option value=quot;findquot;>Find
<option value=quot;updatequot;>Update

  </select>           <br><br>

  <input type=submit>

</form>

</body>

</html>

The deployment procedure is same as before compile the all the files datacon.java,
dataconimpl.java and springservlet.java and copy all the class files and the xml file
datacon.xml to g:tomcat5webappsrootweb-infclasses. Copy the html file to
g:tomcat5webappsroot. Add entry to web.xml file.

Start Tomcat server and open browser

and type url as http://localhost:8080/ servletclient.htm. We will get a two textboxes,
two comboboxes and a 'submit' button. Type name and place in textboxes, select 'add'
from combobox and click 'submit' button. We will get message as 'Record Added'

----------------------------------------
Spring provides integration for many of the ORM frameworks like Hibernate, JDO,
Apache OJB and iBATIS SQL Maps.

For mapping the hibernate resources,an instance of 'SessionFactory' is needed,
'LocalSessionFactoryBean' is used for this purpose and its properties
'hibernateProperties', 'mappingResources' and 'mappingDirectoryLocation'are set.
Like Spring's DAO framework,here we have 'HibernateTemplate' to create an object of
'SessionFactory'. To access the data with 'HibernateTemplate'
'execute(HibernateCallback)' method is used.

Similar to the 'SessionFactory' of hibernate, JDO has 'PersistenceManager Factory'. It
can be configured by using 'LocalPersistenceManagerFactoryBean'.Also
'JDOTemplate' to create an object of 'PersistenceManagerFactory'.To access the data
with 'JDOTemplate' 'execute(JDOCallback)' method is used.

For iBATIS, we have to configure a 'SQLMapClient' by using
'SQLMapClientFactoryBea and its properties 'configLocation' and 'dataSource' are
                           n'
set. Here also we have 'SQLMapClientTemplate'.

To access the data 'execute(SQLMapClientCallback)' method is used.

The only property that we need to change to integrate Spring with OJB is
'ConnectionFactoryClass and it is done by using
                       '
 'LocalDataSourceConnectionFactory   '.

 In the next article we shall see how to use a RMI service in Spring and how to export any
 Spring managed bean as RMI.

PUBLISHED IN DEVELOPER IQ - September2005)
Spring supports remoting for six different RPC models:

1. Remote Method Invocation (RMI)

2. Hessian

3. Burlap

4. HTTP invoker

5. EJB

6. JAX-RPC

In all the models, services are configured into the application through spring configuration
file as spring managed beans. This is accomplished by using a proxy factory bean that
enable us to wire remote services into the properties of our beans as if they were local
objects.

Spring provides 'RmiProxyFactoryBean' to use the RMI service and
'RmiServiceExporter' to export any spring managed bean as a RMI service.

For wiring a Hessian based service to Spring client, Spring's'HessianProxyFactory Bean' is used.
To export a Hessian Service 'HessianServiceExporter' is used and similarly for wiring a Burlap service
'BurlapProxyFactoryBean' is used and 'BurlapServiceExporter' is used to export a burlap service.

For exporting beans as HTTP invoker services, 'HttpInvokerServiceExporter' is used .To
access an HTTP invoker service 'HttpInvokerProxyFactoryBean can be used.
                                                              '

Spring provides two proxy factory beans to access the Enterprise Java Beans.
'LocalStatelessSessionProx  yFactoryBean' is used to access the EJB in the same
container(local) and another one is

'SimpleRemoteStatelessSessionProxyFactoryBean'which is used to access the remote EJBs.

For all the above models spring provides service exporter classes that exports Java Beans
as remote service. Spring does not provide any EJB Service Exporter and it provides four
abstract support classes to make the development of Spring enabled EJB. They are
1. AbstractMessageDrivenBeanto develop MDBs that accept sources other than JMS.

2. AbstractJmsMessageDrivenBean to develop MDBs that accept messages from JMS sources.

3. AbstractStatelessSessionBeanto develop stateless session bean.

4. AbstractStstefulSessionBean to develop stateful session bean.

'JaxRpcPostProxyFactoryBean'is used to wire a web service into the spring application.

The client makes calls to the proxy to provide the service and the proxy calls the remote
service on behalf of the client.

--------------------------------------------

Now we shall see how to wire other RMI services into spring application and also how to
export our own service.

Remote Method Invocation (RMI) Model:

RMI was first introduced in JDK 1.1. But developing and accessing RMI services
involves various steps and also have lookups which makes the code hard to test. Spring
simplifies the RMI by providing a 'proxy factory bean' that enables us to wire the RMI
services into spring application as if they were local beans. Spring also provides a remote
exporter that converts our 'spring managedbeans' into RMI services.

Spring's 'RmiProxyFactoryBean' is a factory bean that creates a proxy to RMI service. It
is declared spring configuration file under the <bean> tag as follows,

<bean id=quot;service1quot;

      class=quot;org.springframework.remoting.rmi.RmiProxyFactoryBeanquot;>

  <property name=quot;serviceUrlquot;>

    <value>rmi://${hostname}/service1</value>

  </property>

  <property name=quot;serviceInterfacequot;>

    <value>service1</value>

  </property>

</bean>
The url of the RMI service is set through the 'serviceUrl' property. The 'serviceInterface'
property specifies the interface that the service implements and only through that the client
invokes methods on the service.

For using the service the implementation code is wired to the RMI using the following
code,

<bean id=quot;serviceimplquot; class=quot;serviceimplquot;>

    <property name=quot;service1quot;>

      <ref bean=quot;service1quot;/>

    </property>

</bean>

-------------------------------------------

First set the path and classpath as before. Next edit the RMI service.

//f:springdemormserver.java

import java.rmi.*;

public interface rmserver extends Remote

{

    String getresult(String s) throws RemoteException;

}

----------------------------------------------

//f:springdemormserverimpl.java

import java.rmi.*;

import java.rmi.server.*;

public class rmserverimpl extends UnicastRemoteObject

                     implements rmserver

{
public static void main(String args[])

    {

        try

        {

            rmserverimpl ob = new rmserverimpl();

            Naming.rebind(quot;rmserverquot;,ob);

            System.out.println(quot;readyquot;);

        }

        catch(Exception e1)

            {System.out.println(quot;quot;+e1);}

    }

    public rmserverimpl() throws RemoteException

    {

    System.out.println(quot;constructor okquot;);

    }

    public String getresult(String a) throws RemoteException

    {

        return quot;Hai...quot;+a;

    }

}

----------------------------------------------

//f:springdemormserver.xml

<?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>

<!DOCTYPE beans PUBLIC quot;-//SPRING//DTD BEAN//ENquot;
quot;http://www.springframework.org/dtd/

spring-beans.dtdquot;>

<beans>

 <bean id=quot;rmserverquot;

      class=quot;org.springframework.remoting. mi.RmiProxyFactoryBeanquot;>
                                         r

  <property name=quot;serviceUrlquot;>

     <value>rmi://localhost/rmserver</value>

  </property>

  <property name=quot;serviceInterfacequot;>

     <value>rmserver</value>

  </property>

 </bean>

 <bean      id=quot;rmserverimplquot; class=quot;rmserverimplquot;>

    <property name=quot;rmserverquot;>

       <ref bean=quot;rmserverquot;/>

    </property>

 </bean>

</beans>

---------------------------------------------

//f:springdemormspring.java

import java.rmi.*;

import org.springframework.beans.factory.*;

import org.springframework.beans.factory.xml*;
                                           .

import org.springframework.core.io.*;
public class rmspring

{

    public static void main(String args[])

    {

        try

        {

            System.out.println(quot;Wait..quot;);

            Resource     res = new ClassPathResource(quot;rmi.xmlquot;);

            BeanFactory factory = new XmlBeanFactory(res);

            rmserver bean1 = (rmserver) factory.getBean(quot;rmserver
                                                                quot;);

            String r=bean1.getresult(args[0]);

            System.out.println(r);

        }

        catch(Exception e1)

            {System.out.println(quot;quot;+e1);}

    }

}

---------------------------------------

To run:

f:springdemo>javac rmserver.java

f:springdemo>javac rmserverimpl.java

f:springdemo>rmic rmserverimpl (To create stub and skeleton)

f:springdemo>javac rmspring.java

f:springdemo>start rmiregistry (a blank window will appear)
f:springdemo>java rmserverimpl

Open another Window and run the client code by giving the argument

f:springdemo>java rmspring quot;samquot;

We will get the output as:

Wait..
......
Hai... sam

Here we have removed the 'lookup' code in the client side.

-----------------------------------------------------------------

Spring also supports the server side of RMI. Here the service itself is written with spring
and it is exposed as an RMI service. Here the bean is written as a simple JavaBean. Also
we need not generate the stub and skeleton using 'rmic' command and manually add it to
RMI registry. Instead of these traditional procedure 'RmiServiceExporter' is used to
export any Spring managed bean as an RMI service. It wrapps the bean in an adapter class.
The adapter class is then bound to RMI registry and the proxies request the service.

<bean        class=quot;org.springframework.remoting.rmi.RmiServiceExporterquot;>

  <property name=quot;service1quot;>

     <ref bean=quot;service1quot;/>

  </property>

  <property name=quot;serviceNamequot;>

      <value>service1</value>

  </property>

  <property name=quot;serviceInterfacequot;>

      <value>service1</value>

  </property>

</bean>

The 'serviceName property' indicates the name of service and 'serviceInterface' specifies
the interface implemented by the service. There is no need of 'serviceUrl' here
First set the path and classpath as before. Next edit the service.

//f:springdemormservice.java

public interface rmservice

{

    String     getresult(String s);

}
------------------------------------------

//f:springdemormserviceimpl.java

public class rmserviceimpl implements rmservice

{

    public static void main(String args[])

    {

        System.out.println(quot;readyquot;);

    }

    public rmserviceimpl()

    {

        System.out.println(quot;constructor okquot;);

    }

    public String getresult(String a)

    {

        return quot;Haiquot;+a;

    }

}

------------------------------------------
//f:springdemormservice.xml

<?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>

<!DOCTYPE beans PUBLIC quot;-//SPRING//DTD BEAN//ENquot;

quot;http://www.springframework.org/dtd spring-beans.dtdquot;>
                                   /

 <beans>

  <bean class=quot;org.springframework. emoting.rmi.RmiServiceEx
                                  r                         porterquot;>

  <property name=quot;servicequot;>

     <value>rmservice</value>

  </property>

  <property name=quot;serviceNamequot;>

     <value>service1</value>

  </property>

  <property name=quot;serviceInterfacequot;>

     <value>rmservice</value>

  </property>

  </bean>

  <bean id=quot;rmservicequot; class=quot;rmserviceimplquot;>

  </bean>

</beans>

------------------------------------------

//f:springdemormserviceclient.java

import java.io.*;

import org.springframework.beans.factory.*;

import org.springframework.beans.factory.xml*;
                                           .
import org.springframework.core.io.*;

class rmserviceclient

{

    public static void main(String args[])

    {

        try

        {

            System.out.println(quot;Wait..quot;);

            Resource res = new ClassPathResource(quot;rmservice.xmlquot;);

            BeanFactory factory = new XmlBeanFactory(res);

            System.out.println(quot;factory createdquot;);

            rmservice bean1 = (rmservice)factory.getBean(quot;r servicequot;);
                                                          m

            String s = bean1.getresult(args[0]);

            System.out.println(s);

        }

            catch(Exception e1)

                {System.out.println(quot;quot;+e1);}

    }

}

---------------------------------------

To run:

f:springdemo>javac rmservice.java

f:springdemo>javac rmserviceimpl.java

f:springdemo>javac rmserviceclient.java
f:springdemo>java rmsserviceclient

We will get Output as:

Wait..

Aug 12, 2002 10:55:07 PM

   org.springframework.beans.factory.

   xml.XmlBeanDefinitionReader

   loadBeanDefinitions

INFO: Loading XML bean definitions from

   class path resource[rmservice.xml]

Aug 12, 2002 10:55:07 PM

   org.springframework.beans.factory.

   support.AbstractBeanFactory getBean

INFO: Creating shared instance of

   singleton bean 'rmservice'

constructor ok

Hai...sam

Here the service interface doesn't extend the 'java.rmi.Remote' method and
'RemoteException' is not thrown by the methods. There is no binding in the
implementation code. Also we can direcly run the client. No run to run 'rmserverimpl' first.
Also there is no need to run the RMI registry.

Weitere ähnliche Inhalte

Was ist angesagt?

Spring Framework
Spring FrameworkSpring Framework
Spring Frameworknomykk
 
Introduction Java Web Framework and Web Server.
Introduction Java Web Framework and Web Server.Introduction Java Web Framework and Web Server.
Introduction Java Web Framework and Web Server.suranisaunak
 
Whats Next for JCA?
Whats Next for JCA?Whats Next for JCA?
Whats Next for JCA?Fred Rowe
 
Introduction to Java EE (J2EE)
Introduction to Java EE (J2EE)Introduction to Java EE (J2EE)
Introduction to Java EE (J2EE)Atit Patumvan
 
Spring framework
Spring frameworkSpring framework
Spring frameworkvietduc17
 
Spring core module
Spring core moduleSpring core module
Spring core moduleRaj Tomar
 
Hennessey An Open Source Eye Gaze Interface Expanding The Adoption Of Eye Gaz...
Hennessey An Open Source Eye Gaze Interface Expanding The Adoption Of Eye Gaz...Hennessey An Open Source Eye Gaze Interface Expanding The Adoption Of Eye Gaz...
Hennessey An Open Source Eye Gaze Interface Expanding The Adoption Of Eye Gaz...Kalle
 
Spring framework Introduction
Spring framework IntroductionSpring framework Introduction
Spring framework IntroductionAnuj Singh Rajput
 
JPA Performance Myths -- JavaOne 2013
JPA Performance Myths -- JavaOne 2013JPA Performance Myths -- JavaOne 2013
JPA Performance Myths -- JavaOne 2013richardgcurtis
 
Java Enterprise Edition 6 Overview
Java Enterprise Edition 6 OverviewJava Enterprise Edition 6 Overview
Java Enterprise Edition 6 OverviewEugene Bogaart
 
Hibernate complete notes_by_sekhar_sir_javabynatara_j
Hibernate complete notes_by_sekhar_sir_javabynatara_jHibernate complete notes_by_sekhar_sir_javabynatara_j
Hibernate complete notes_by_sekhar_sir_javabynatara_jSatya Johnny
 
Designing JEE Application Structure
Designing JEE Application StructureDesigning JEE Application Structure
Designing JEE Application Structureodedns
 

Was ist angesagt? (20)

Spring Framework
Spring FrameworkSpring Framework
Spring Framework
 
Introduction Java Web Framework and Web Server.
Introduction Java Web Framework and Web Server.Introduction Java Web Framework and Web Server.
Introduction Java Web Framework and Web Server.
 
Spring notes
Spring notesSpring notes
Spring notes
 
Whats Next for JCA?
Whats Next for JCA?Whats Next for JCA?
Whats Next for JCA?
 
Introduction to Java EE (J2EE)
Introduction to Java EE (J2EE)Introduction to Java EE (J2EE)
Introduction to Java EE (J2EE)
 
Spring framework
Spring frameworkSpring framework
Spring framework
 
Spring ppt
Spring pptSpring ppt
Spring ppt
 
Java Spring
Java SpringJava Spring
Java Spring
 
Spring core module
Spring core moduleSpring core module
Spring core module
 
Hennessey An Open Source Eye Gaze Interface Expanding The Adoption Of Eye Gaz...
Hennessey An Open Source Eye Gaze Interface Expanding The Adoption Of Eye Gaz...Hennessey An Open Source Eye Gaze Interface Expanding The Adoption Of Eye Gaz...
Hennessey An Open Source Eye Gaze Interface Expanding The Adoption Of Eye Gaz...
 
J2ee seminar
J2ee seminarJ2ee seminar
J2ee seminar
 
Java J2EE
Java J2EEJava J2EE
Java J2EE
 
Spring framework Introduction
Spring framework IntroductionSpring framework Introduction
Spring framework Introduction
 
JPA Performance Myths -- JavaOne 2013
JPA Performance Myths -- JavaOne 2013JPA Performance Myths -- JavaOne 2013
JPA Performance Myths -- JavaOne 2013
 
Spring 2
Spring 2Spring 2
Spring 2
 
Chapter2 j2ee
Chapter2 j2eeChapter2 j2ee
Chapter2 j2ee
 
Java Enterprise Edition 6 Overview
Java Enterprise Edition 6 OverviewJava Enterprise Edition 6 Overview
Java Enterprise Edition 6 Overview
 
Hibernate complete notes_by_sekhar_sir_javabynatara_j
Hibernate complete notes_by_sekhar_sir_javabynatara_jHibernate complete notes_by_sekhar_sir_javabynatara_j
Hibernate complete notes_by_sekhar_sir_javabynatara_j
 
Designing JEE Application Structure
Designing JEE Application StructureDesigning JEE Application Structure
Designing JEE Application Structure
 
J2ee
J2eeJ2ee
J2ee
 

Andere mochten auch

Building enterprise web applications with spring 3
Building enterprise web applications with spring 3Building enterprise web applications with spring 3
Building enterprise web applications with spring 3Abdelmonaim Remani
 
Spring Certification Questions
Spring Certification QuestionsSpring Certification Questions
Spring Certification QuestionsSpringMockExams
 
Enterprise Integration Patterns - Spring way
Enterprise Integration Patterns - Spring wayEnterprise Integration Patterns - Spring way
Enterprise Integration Patterns - Spring wayDragan Gajic
 
Spring Basics
Spring BasicsSpring Basics
Spring BasicsEmprovise
 
Enterprise Messaging With Spring JMS
Enterprise Messaging With Spring JMSEnterprise Messaging With Spring JMS
Enterprise Messaging With Spring JMSBruce Snyder
 
1 Introduction To Java Technology
1 Introduction To Java Technology 1 Introduction To Java Technology
1 Introduction To Java Technology dM Technologies
 
Enterprise Integration Patterns with Spring integration!
Enterprise Integration Patterns with Spring integration!Enterprise Integration Patterns with Spring integration!
Enterprise Integration Patterns with Spring integration!hegdekiranr
 
Beyond Horizontal Scalability: Concurrency and Messaging Using Spring
Beyond Horizontal Scalability: Concurrency and Messaging Using SpringBeyond Horizontal Scalability: Concurrency and Messaging Using Spring
Beyond Horizontal Scalability: Concurrency and Messaging Using SpringBruce Snyder
 
Effective java
Effective javaEffective java
Effective javaEmprovise
 
Showdown: Integration Framework (Spring Integration, Apache Camel) vs. Enterp...
Showdown: Integration Framework (Spring Integration, Apache Camel) vs. Enterp...Showdown: Integration Framework (Spring Integration, Apache Camel) vs. Enterp...
Showdown: Integration Framework (Spring Integration, Apache Camel) vs. Enterp...Kai Wähner
 
Data Preparation vs. Inline Data Wrangling in Data Science and Machine Learning
Data Preparation vs. Inline Data Wrangling in Data Science and Machine LearningData Preparation vs. Inline Data Wrangling in Data Science and Machine Learning
Data Preparation vs. Inline Data Wrangling in Data Science and Machine LearningKai Wähner
 

Andere mochten auch (14)

Building enterprise web applications with spring 3
Building enterprise web applications with spring 3Building enterprise web applications with spring 3
Building enterprise web applications with spring 3
 
Future of Java
Future of JavaFuture of Java
Future of Java
 
Spring Certification Questions
Spring Certification QuestionsSpring Certification Questions
Spring Certification Questions
 
The Eschatology of Java
The Eschatology of JavaThe Eschatology of Java
The Eschatology of Java
 
Enterprise Integration Patterns - Spring way
Enterprise Integration Patterns - Spring wayEnterprise Integration Patterns - Spring way
Enterprise Integration Patterns - Spring way
 
Spring Basics
Spring BasicsSpring Basics
Spring Basics
 
Enterprise Messaging With Spring JMS
Enterprise Messaging With Spring JMSEnterprise Messaging With Spring JMS
Enterprise Messaging With Spring JMS
 
1 Introduction To Java Technology
1 Introduction To Java Technology 1 Introduction To Java Technology
1 Introduction To Java Technology
 
Enterprise Integration Patterns with Spring integration!
Enterprise Integration Patterns with Spring integration!Enterprise Integration Patterns with Spring integration!
Enterprise Integration Patterns with Spring integration!
 
Beyond Horizontal Scalability: Concurrency and Messaging Using Spring
Beyond Horizontal Scalability: Concurrency and Messaging Using SpringBeyond Horizontal Scalability: Concurrency and Messaging Using Spring
Beyond Horizontal Scalability: Concurrency and Messaging Using Spring
 
Effective java
Effective javaEffective java
Effective java
 
Linux Internals - Interview essentials 4.0
Linux Internals - Interview essentials 4.0Linux Internals - Interview essentials 4.0
Linux Internals - Interview essentials 4.0
 
Showdown: Integration Framework (Spring Integration, Apache Camel) vs. Enterp...
Showdown: Integration Framework (Spring Integration, Apache Camel) vs. Enterp...Showdown: Integration Framework (Spring Integration, Apache Camel) vs. Enterp...
Showdown: Integration Framework (Spring Integration, Apache Camel) vs. Enterp...
 
Data Preparation vs. Inline Data Wrangling in Data Science and Machine Learning
Data Preparation vs. Inline Data Wrangling in Data Science and Machine LearningData Preparation vs. Inline Data Wrangling in Data Science and Machine Learning
Data Preparation vs. Inline Data Wrangling in Data Science and Machine Learning
 

Ähnlich wie The Complete Spring Tutorial

Spring Framework Tutorial | VirtualNuggets
Spring Framework Tutorial | VirtualNuggetsSpring Framework Tutorial | VirtualNuggets
Spring Framework Tutorial | VirtualNuggetsVirtual Nuggets
 
Spring presentecion isil
Spring presentecion isilSpring presentecion isil
Spring presentecion isilWilly Aguirre
 
Spring presentecion isil
Spring presentecion isilSpring presentecion isil
Spring presentecion isilWilly Aguirre
 
TheSpringFramework
TheSpringFrameworkTheSpringFramework
TheSpringFrameworkShankar Nair
 
Comparison of spring and other frameworks.!
Comparison of spring and other frameworks.!Comparison of spring and other frameworks.!
Comparison of spring and other frameworks.!Sibu Stephen
 
Spring framework-tutorial
Spring framework-tutorialSpring framework-tutorial
Spring framework-tutorialvinayiqbusiness
 
How Spring Framework Really Works?
How Spring Framework Really Works?How Spring Framework Really Works?
How Spring Framework Really Works?NexSoftsys
 
Spring framework
Spring frameworkSpring framework
Spring frameworkKani Selvam
 
Spring boot vs spring framework razor sharp web applications
Spring boot vs spring framework razor sharp web applicationsSpring boot vs spring framework razor sharp web applications
Spring boot vs spring framework razor sharp web applicationsKaty Slemon
 
Spring basics for freshers
Spring basics for freshersSpring basics for freshers
Spring basics for freshersSwati Bansal
 
Project report for final year project
Project report for final year projectProject report for final year project
Project report for final year projectsuneel singh
 
J2EE Batch Processing
J2EE Batch ProcessingJ2EE Batch Processing
J2EE Batch ProcessingChris Adkin
 
Spring Book – Chapter 1 – Introduction
Spring Book – Chapter 1 – IntroductionSpring Book – Chapter 1 – Introduction
Spring Book – Chapter 1 – IntroductionTomcy John
 
Spring Architecture | Advanced Java
Spring Architecture | Advanced JavaSpring Architecture | Advanced Java
Spring Architecture | Advanced JavaVISHAL DONGA
 
Introduction to j2 ee frameworks
Introduction to j2 ee frameworksIntroduction to j2 ee frameworks
Introduction to j2 ee frameworksMukesh Kumar
 

Ähnlich wie The Complete Spring Tutorial (20)

Spring Framework Tutorial | VirtualNuggets
Spring Framework Tutorial | VirtualNuggetsSpring Framework Tutorial | VirtualNuggets
Spring Framework Tutorial | VirtualNuggets
 
Spring Framework Rohit
Spring Framework RohitSpring Framework Rohit
Spring Framework Rohit
 
Spring presentecion isil
Spring presentecion isilSpring presentecion isil
Spring presentecion isil
 
Spring presentecion isil
Spring presentecion isilSpring presentecion isil
Spring presentecion isil
 
TheSpringFramework
TheSpringFrameworkTheSpringFramework
TheSpringFramework
 
Comparison of spring and other frameworks.!
Comparison of spring and other frameworks.!Comparison of spring and other frameworks.!
Comparison of spring and other frameworks.!
 
Spring framework-tutorial
Spring framework-tutorialSpring framework-tutorial
Spring framework-tutorial
 
Ejb notes
Ejb notesEjb notes
Ejb notes
 
How Spring Framework Really Works?
How Spring Framework Really Works?How Spring Framework Really Works?
How Spring Framework Really Works?
 
Month 3 report
Month 3 reportMonth 3 report
Month 3 report
 
Spring framework
Spring frameworkSpring framework
Spring framework
 
Spring Mvc
Spring MvcSpring Mvc
Spring Mvc
 
Spring boot vs spring framework razor sharp web applications
Spring boot vs spring framework razor sharp web applicationsSpring boot vs spring framework razor sharp web applications
Spring boot vs spring framework razor sharp web applications
 
Spring basics for freshers
Spring basics for freshersSpring basics for freshers
Spring basics for freshers
 
Project report for final year project
Project report for final year projectProject report for final year project
Project report for final year project
 
Spring framework
Spring frameworkSpring framework
Spring framework
 
J2EE Batch Processing
J2EE Batch ProcessingJ2EE Batch Processing
J2EE Batch Processing
 
Spring Book – Chapter 1 – Introduction
Spring Book – Chapter 1 – IntroductionSpring Book – Chapter 1 – Introduction
Spring Book – Chapter 1 – Introduction
 
Spring Architecture | Advanced Java
Spring Architecture | Advanced JavaSpring Architecture | Advanced Java
Spring Architecture | Advanced Java
 
Introduction to j2 ee frameworks
Introduction to j2 ee frameworksIntroduction to j2 ee frameworks
Introduction to j2 ee frameworks
 

Kürzlich hochgeladen

So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxGenerative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxfnnc6jmgwh
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Kaya Weers
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 

Kürzlich hochgeladen (20)

So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxGenerative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 

The Complete Spring Tutorial

  • 1. Spring is grate framework for development of Enterprise grade applications. Spring is a light-weight framework for the development of enterprise-ready applications. Spring can be used to configure declarative transaction management, remote access to your logic using RMI or web services, mailing facilities and various options in persisting your data to a database. Spring framework can be used in modular fashion, it allows to use in parts and leave the other components which is not required by the application. Features of Spring Framework:  Transaction Management: Spring framework provides a generic abstraction layer for transaction management. This allowing the developer to add the pluggable transaction managers, and making it easy to demarcate transactions without dealing with low-level issues. Spring's transaction support is not tied to J2EE environments and it can be also used in container less environments.  JDBC Exception Handling: The JDBC abstraction layer of the Spring offers a meaningful exception hierarchy, which simplifies the error handling strategy  Integration with Hibernate, JDO, and iBATIS: Spring provides best Integration services with Hibernate, JDO and iBATIS.  AOP Framework: Spring is best AOP framework  MVC Framework: Spring comes with MVC web application framework, built on core Spring functionality. This framework is highly configurable via strategy interfaces, and accommodates multiple view technologies like JSP, Velocity, Tiles, iText, and POI. But other frameworks can be easily used instead of Spring MVC Framework.. Spring Architecture Spring is well-organized architecture consisting of seven modules. Modules in the Spring framework are: 1. Spring AOP One of the key components of Spring is the AOP framework. AOP is used in Spring:  To provide declarative enterprise services,especially as a replacement for EJB declarative services. The most important such service is declarative transaction management, which builds on Spring's transaction abstraction.  To allow users to implement customaspects, complementing their use of OOP with AOP 2. Spring ORM The ORM package is related to the database access. It provides integration layers for popular object-relational mapping APIs, including JDO, Hibernate and iBatis. 3. Spring Web The Spring Web module is part of Spring’s web application development stack,
  • 2. which includes Spring MVC. 4. Spring DAO The DAO (Data Access Object) support in Spring is primarily for standardizing the data access work using the technologies like JDBC, Hibernate or JDO. 5. Spring Context This package builds on the beans package to add support for message sources and for the Observer design pattern, and the ability for application objects to obtain resources using a consistent API. 6. Spring Web MVC This is the Module which provides the MVC implementations for the web applications. 7. Spring Core The Core package is the most import component of the Spring Framework. This component provides the Dependency Injection features. The BeanFactory provides a factory pattern which separates the dependencies like initialization, creation and access of the objects from your actual program logic. The following diagram represents the Spring FrameworkArchitecture
  • 3. (PUBLISHED IN DEVELOPER IQ - September2005) Spring is an open-source application framework, introduced and developed in 2004. The main ideas were suggested by an experienced J2EE architect, Rod Johnson. He had earlier, written a book titled 'J2EE Develoment without using EJB' and had introduced the concept of Light-weight container. Primarily, his argument is that while EJB has its merits, it is not always necessary and suitable in all applications. Just as Hibernate attacks CMP as primitive ORM technology, Spring attacks EJB as unduly complicated and not susceptible to unit-testing. Instead of EJB, Spring suggests that we make use of ordinary Java beans, with some slight modifications, to get all the supposed advantages of EJB environment. Thus, Spring is posed as an alternative to EJB essentially. However, as a concession to the existing EJB investments, Spring is designed to operate with EJB if required. Much of the philosophy and approach of Spring framework, however, predates , the latest EJB vesrion (ie) EJB-3, about to arrive shortly. It is said that EJB-3 has absorbed a number of new ideas suggested by Spring and some more, to answer the criticisms. There is a debate going on in the Java community about Spring and EJB-3. Spring is not a Persistence technolgy but a framework which allows plug in of other such technol gies. But EJB-3 is o
  • 4. primarily focussed on Persistence Technology and has now incorporated Hi ernate, the b best ORM todate.Talks are going on to incorpotrate another equally nice ORM Technology known as JDO, which provides for Object Database also. Moreoveer, EJB-3 's Attribute- Orientaed Meta tags, help in vastly reducing the size of XML lines. Some have complained that Spring is still too dependent on XML files. In this tutorial, any reference to EJB, is only to EJB-2.My aim in presenting this tutorial is not to advocate the choiceof either Spring or EJB-3, a topic still being devbated by experts but to sharemy perception with our readers. In spring, we can make use of plain Java Beans to achieve things that were previously possible with EJB only. The main aim of Spring is to simplify the J2EE development and testing. EJB has been around since 1988 and is an established standard and specification in Enterprise world. Though there have been numerous Open-source Javatechnologies recently, no other technology has claimed to be superior to EJB, in its total features. Rod Johnson, in his book, critices a number of features in EJB. Significantly, he has also spoken approvingly of some features of EJB and has recommended its use in some special circumstances. EJB is a standard with wide Enterprise-level Industry support.It has been deployed in thousands of successful applications around the world. TheEJB specification is a fixed target and so tool-developers are able to develop wizards, which can make ejb development quick and easy. There are many vendors for EJB application server like IBM (Web- Sphere), BEA (Weblogic), Oracle (JDeveloper) etc. To quote from another book on Spring (quot;Springin Actionquot; - Craig Walls-Manning press) quot; EJB is complex quot;, as the author put it nicely, quot;not for just being complex'. It is complex because it attempts to provide solutions for complex problemsquot;. EJB is developed mainly for the remote transaction and distributed objects. But a number of enterprise projects do not have this level of complexity and still use EJBs and even the simple application becomes complex. In such cases Spring claims to be an alternative. Since Spring comes with rich support to enterprise level services, it claims to be an alternative to EJB It is worthwhile to begin with a comparison of EJB-2 and Spring, in some main features. The main advantages of EJB are : a) Transaction Management b) Declarative Transaction support c) Persistence ( CMP & BMP) d) Declarative Security e) Distributed Computing (Container managed RPC) Spring does not attempt to do everythi g by itself but supports the best of breed n technologies for each of these requirements.
  • 5. For example, instead of CMP & BMP, it supports several persistence technologies like JDO, Hibernate and OJB. These ORM toools are far more capable than the implementation in CMP.To simplify JDBC coding, there are tools like iBatis and Spring supports iBatis also. Spring makes use of Acegi, an open-source Security framework and provides declarative security through spring configuration file or class metadata while in EJB declarative security is configured through deployment descriptor. Spring provides proxying for RMI (special remoting technologies like Burlap) JAX- RPC & web-service while EJB provides container-managed remote method calls. Spring can offer declarative transaction like EJB. But spring provides declarative rollback behavior also ,for methods and exceptions Thus, while EJB is monolithic and attempts to do many things, some tasks fairly well and some others not so well, Spring uses ordinary Java beans only and through special techniques provides many of the functionalities of EJB, by integrating with a number of open-source technologies. Thereby, it gives the following advantages over EJB2. a) testing is easier. We do not need to start the EJB container , for testing. b) As Spring is based on the standard JavaBeans naming convention, programmers find it easy to work with. c) It makes use of AOP(Aspect-Oriented Programming) which is a very recent and useful paradigm., in addition to classic OOP and preserves the purity of OOP. d) It is flexible. Spring's goal is to be an entire Application Framework. Other popular framewoks like Struts, Tapestry, JSF etc., are very good web tier frameworks but when we use these framework, we have to provide additional framework to deal with enterprise tier that integrates well with these framework. Spring tries to alleviate this problem by providing a comprehensive framework, which includes a core bean container, an MVC framework, an AOP integration framework, a JDBC integration framework and an EJB integration framework. It also provides integration modules for O/R mapping tools like Hibernate and JDO. Thus spring framework can be thought of as a layered architecture consisting of seven well defined modules. The function of each component is as follows: 1. Core Container: The core container provides the fundamental functionality of Spring. It's primary component is the 'BeanFactory', an implementation of the Factory pattern. The BeanFactory applies the IOC pattern to separate an application's configuration and dependency specification from the actual application code. 2. Spring Context/Application Context: The Spring context is a configuration file that provides context information to the Spring
  • 6. framework . The Spring context supplies enterprise services such asJNDI access, EJB integration, e-mail, internalization, validation, and scheduling functionality. 3. Spring AOP:(Aspect-Oriented) The Spring AOP module integrates aspect-oriented programming functionality directly into the Spring framework, through its configuration management feature. As a result we can easily AOP-enable any object managed by the Spring framework. The Spring AOP module provides transaction management services for objects in any Spring-based application. With Spring AOP we can incorporate declarative transaction management into our applications without relying on EJB components. The Spring AOP module also introduces metadata programming to Spring. Using this we can add annotation to the source code that instructs Spring on where and how to apply aspects. 4. Spring DAO: The Spring's JDBC and DAO abstraction layer offers a meaningful exception h ierarchy for managing the databaase connection, exception handling and error messages thrown by different database vendors. The exception hierarchy simplifies error handling and greatly reduces the amount of code that we need to write, such as opening and closing connections. This module also provide transaction management services for objects in a spring application. 5. Spring ORM: The Spring framework can be integrated to several ORM frameworks to provide Object Relational tool, including JDO, Hibernate, OJB and iBatis SQL Maps. 6. Spring Web module: The Web context module builds on top of the application context module, providing contexts for Web-based applications. As a result, the Spring framework supports integration with Jakarta Struts, JSF and webworks. The Web module also eases the tasks of handling multipart requests and binding request parameters to domain objects. 7. Spring MVC Framework: The MVC framework is a full-featured MVC implementation for building Web applications. The MVC framework is highly configurable via strategy interfaces and accommodates numerous view technologies including JSP, Velocity, Tiles and the generation of PDF and Excel Files. -------------------------------------------- I would venture to suggest that Spring will win sure acceptance among j2ee devcelopers , very soon because of its ready-made adapters for various hot web-tier and presentation technologies.! For example, there is a great varierty of technologies in the web-tier like MVC PATTERN, STRUTS, JSF, WEB-WORK, JSP, TAPESTRY,FREEMARKER etc. Developers are now puzzled and confused about the relative meritsand demerits of all these. Once they choose a technology and start implementing and later want to change over to another technology, it is very difficult. But, as Spring offers modules for aall the above technologies, it is most often simply changi g the configuraion file. With this approach, it n
  • 7. is even possible for a development team to try and test a given task in all the above forms and see the effect and performance before deciding the choice. Spring offers its own version of MVC architecture. It also offers adapters for Struts. In the MVC adapter, it offers the following View choices. JSP is default view template. 'InternalResouceViewResolver'can be used for this purpose. Spring can be integrated with other template solutions like Velocity, FreeMarker, tiles etc., Also Spring can be used to produce dynamic binary Excel spreadsheet, PDF documents etc., To configure the velocity engine 'VelocityConfigurer' bean is declared in spring configuration. The view resolver is configured by 'VelocityViewResolver' bean. To configure the FreeMarker engine 'FreeMarkerConfigurer' bean is declared in spring configuration. The view resolver is configured by 'FreeMarkerViewResolver' bean. 'TilesConfigurer' can used to used to load Ti es configuration file for rendering Tiles l view. 'AbstractExcelView' is used to generate Excel SpreadSheet as views. 'AbstactPdfView' supports the creation of PDF as views. 'buildPdfDocument()' is used to create PDF decument. Similarly we have 'buildExcelDocument()' to create the excel document. For delegation purpose, Spring provides 'DelegatingRequestProcessor' and to use the tiles 'DelegatingTilesRequestProcessor'is used. 'SpringTapestryEngine' is used for integrating Tapestry to Spring. 'FacesSpringVariableResolver'is used to resolve spring- managed beans in JSF. ----------------------------------------------------------------------------- Next we shall see the main concepts of Spring, Inversion of Control (IoC) and Aspect Oriented Programming. Spring is based on dependency injection type of IoC . We don't directly connect our components and services toget er in code but describe which services h are needed by which components in a configuration file. A container is responsible for hooking it up. This concept is similar to 'Declarative Management' IOC is a broad . concept. the two main types are 1. Dependency Lookup: The container provides callbacks to components and a lookup context. The managed objects are responsible for their other lookups. This is the EJB Approach. The Inversion of Control is limited to the Container involved callback methods that the codecan use to obtain resources. Here we need to use JNDI to look up other EJBs and resources. Because of this reason EJB is not branded as 'IOC framework'.There are some problems in this implementation. The class needs a application server environment as it is dependent on JNDI and it is hard to test as we need to provide a dummy JNDI contest for testing purpose. 2. Dependency Injection:
  • 8. In this application objects is not responsible for looking up resources they depend on. Instead IoC container configures the object externalizing resource lookup from application code into the container. That is, dependencies are injected into objects. Thus lookups are completely removed from application objects and it can be used outside the container also. ---- In this method, the objects can be populated via Setter Injection (Java-Beans properties) or Constructor Injection (constructor arguments). Each method has its own advantage and disadvantage. Normally in all the java beans, we will use setter and getter method to set and get the value of property as follows public class namebean { String name; public void setName(String a) { name = a; } public String getName() { return name; } } We will create an instance of the bean 'namebean' (say bean1) and set property as bean1.setName(quot;tomquot;); Here in setter injection, we will set the property 'name' by using the <property> subelement of <bean> tag in spring configuration file as showm below, <bean id=quot;bean1quot; class=quot;namebeanquot;>
  • 9. <property name=quot;namequot; > <value>tom</value> </property> </bean> The subelement <value> sets the 'name' property by calling the set method as setName(quot;tomquot;); This process is called setter injection. For constructor injection, we use constructor with parameters as shown below, public class namebean { String name; public namebean(String a) { name = a; } } We will set the property 'name' while creatinf an instance of the bean 'namebean' as namebean bean1 = new namebean(quot;tomquot;); Here we use the <constructor-arg> element to set the the property by construct ro injection as <bean id=quot;bean1quot; class=quot;namebeanquot;> <constructor-arg> <value>My Bean Value</value>
  • 10. </constructor-arg> </bean> To set properties that reference other beans <ref>, subelement of <property> is used as shown below, <bean id=quot;bean1quot; class=quot;bean1implquot;> <property name=quot;gamequot;> <ref bean=quot;bean2quot;/> </property> </bean> <bean id=quot;bean2quot; class=quot;bean2implquot; /> Aspect-Oriented Programming --------------------------- Aspect Oriented programming is a new programming technique that promotes separation of concerns within the system. System are composed of several components each responsible for a specific piece of functionality. Whatever may be the core function of the program, the system service like logging, transaction management, security etc., must be included in the program. These system services are commonly refered to as 'cross-cutting concerns' as they tend to cut across multiple components in a system. AOP makes it possible to modularize and separate these services and then apply them declaratively to the components and we can focus on our own specific concerns. In spring, aspects are wired into objects in the spring XML file in the same way as JavaBean. This process is known as 'Weaving'. ---------------------------------------- The container is at the core of Spring Container. In manages the life cycle and configuration of application objects. We can configure how each of our beans should be created either to create a single instance of bean or produce a new instance every time and how they should be associated with each other. Spring should not, however, be confused with traditionally heavyweight EJB containers, which are often large. The Spring actually comes with two distinct containers: Bean Factories-defined by quot;org.springframework. beans.factory.BeanFactoryquot; are the simplest containers, providing support for dependency injection. Application contexts - defined by quot;org.springframework.context.Application Contextquot; provides application framework
  • 11. services. BEAN FACTORY: Bean factory is an implementation of the factory design pattern and its function is to create and dispense beans. As the bean factory knows about many objects within an application, it is able to create association between collaborating objects as they are instantiated. This removes the burden of configuration from the bean and the client. There are several implementation of BeanFactory. The most useful one is quot;org.springframework.beans.factory.xml. XmlBeanFactoryquot;. It loads its beans based on the definition contained in an XML file. To create an XmlBeanFactory, pass a InputStream to the constructor. The resource will provide the XML to the factory. BeanFactory factory = new XmlBeanFactory(new FileInputStream(quot;myBean.xmlquot;)); This line tells the bean factory to read the bean definition from the XML file. The bean definition includes the description of beans and their properties. But the bean factory doesn't instantiate the bean yet. To retrieve a bean from a 'BeanFactory', the getBean() method is called. When getBean() method is called, factory will instantiate the bean and begin setting the bean's properties us dependency injection. ing myBean bean1 = (myBean)factory.getBean(quot;myBeanquot;); APPLICATION CONTEXT: While Bean Factory is used for simple applications, the Application Context is spring's more advanced container. Like 'BeanFactory' it can be used to load bean definitions, wire beans together and dispense beans upon request. It also provide 1) a means for resolving text messages, including support for internationalization. 2) a generic way to load file resources. 3) events to beans that are registered as listeners. Because of additional functionality, 'Application Context' is preferred over a BeanFactory. Only when the resource is scarce like mobile devices, 'BeanFactory' is used. The three commonly used implementation of 'Application Context' are 1. ClassPathXmlApplicationContext : It Loads context definition from an XML file located in the classpath, treating context definitions as classpath resources. The application context is loaded from the application's classpath by using the code ApplicationContext context = new ClassPathXmlApplicationContext(quot;bean .xmlquot;); 2. FileSystemXmlApplicationContext : It loads context definition from an XML file in the filesystem. The application context is loaded from the file system by using the code ApplicationContext context = new FileSystemXmlApplicationContext(quot;b ean.xmlquot;); 3. XmlWebApplicationContext : It loads contex definition from an XML file contained t
  • 12. within a web application. Spring is lightweight in terms of both size and overhead. The entire Spring framework can be distributed in a single JAR file that weighs just over 1.7 MB. And the processing overhead required by Spring is negligible. Also Spring is nonintrusive:(ie) objects in a Spring-enabled application typically have no dependencies on Spring-specific classes. There are other lightweight containers like HiveMind, Avalon, PicoContainer etc., Avalon was one of the first IoC containers. Avalon mainly provides interface-dependent IoC. so, we much change our code in order to use a different container. This couples your code to a particular framework which is an undesirable feature. PicoContainer is a minimal (very small size nearly 50k) lightweight container that provides IoC in the form of constructor and setter injection. By using PicoContainer we can only assemble components programmaticallythrough PicoContainer's API. But it allows only one instance of any particular type to be present in the registry. Also PicoContainer is only a container. It does not offer various special features as spring like integration. HiveMind is relatively new IoC container. Like PicoContainer, it focuses on wiring with support for both constructor and setter injections. It also allows us to define our configuration in an XML file. Like PicoContainer, HiveMind is only a container. It does not offer integration with other technology. Thus Spring makes it possible to configure and compose complex applications from simpler components. In Spring, application objects are composed declaratively, typically in an XML file. Spring also provides much infrastructure functionality like transaction management, persistence framework integration, etc., leaving the development of application logic to us. With this inroduction, we shall see a simple example in Spring in next article. ------------------------------------------- BOOKS FOR REFERENCE: 1.'Spring in Action' - Craig Walls and Ryan Breidenbach. 2.'J2EE Development without EJB' - Rod Johnson PART-II ----------------- (PUBLISHED IN DEVELOPER IQ - September2005) The Spring Framework comes in the form of ZIP file with the necessary jars, examples etc., The Spring framework can be downloaded from http://www.springframework.org . There will be two zip files one with dependencies and other wit out. The spring framework h with dependencies is larger and includes all dependent libraries. Download Spring framework 1.2 without dependency and unzip on the hard disk as spring12 Inside the folder spring12 we can find 7 folders. The name and the contents of all the
  • 13. folders are given below, 1. dist: It contains various Spring distribution jar files. 2. docs: It contains general documentation and API javadocs. 3. mock: It contains mock JNDI contexts and a set of servlet API mock objects. 4. samples: It contains demo applications and skeletons. 5. src: It contains the Java source files for the framework. 6. test: It contains the Java source files for Spring's test suite. 7. tiger: It contains JDK1.5 examples and test suite. Inside the quot;distquot; directory, we can find all the jar files necessary for compiling and executing the program. The jar files and its contents are listed below: 1. spring.jar : It contains the entire Spring framework including everything in the other JAR files also. 2. spring-core.jar : It contains the core Spring container and its utilities. 3. spring-beans.jar : It contains the bean Spring container and JavaBeans support utilities. 4. spring-aop.jar : It contains Spring's AOP framework, source-level metadata support, AOP Alliance interfaces etc., 5. spring-context.jar : It contains application context, validation framework, JNDI, templating support and scheduling. 6. spring-dao.jar : It contains DAO support and transaction infrastructure. 7. spring-jdbc.jar : It contains the JDBC support. 8. spring-support.jar : It contains JMX support, JCA support, scheduling support, mail support and caching support. 9. spring-web.jar : It contains the web application context, multipart resolver, Struts support, JSF support and web utilities. 10. spring-webmvc.jar : It contains the framework servlets, web MVC framework, web controllers and web views. 11. spring-remoting.jar :It contains remoting support, EJB support and JMS support. 12. spring-orm.jar : It contains iBATIS SQL Maps support, Apache OJB support, TopLink support and JDO support. 13. spring-hibernate.jar : It contains Hibernate 2.1 support, Hibernate 3.x support. 14. spring-mock.jar : It contains JNDI mocks, Servlet API mocks and JUnit support. -------------------------------------------- Now we will run a greeter example in Spring. f:>md springdemo f:>cd springdemo As the entire Spring Framework is included in spring.jar. We use that to run our examples. Copy spring.jar from spring12dist folder to the working folder. Also copy commons- logging.jar from tomcat41serverlib to the working directory. f:springdemo>set path=c:windowscommand;g:jdk1.5bin (* Set path for jdk1.5 or jdk1.4.2 only. ) f:springdemo>set classpath=f:springdemo;
  • 14. f:springdemospring.jar; f:springdemocommons-logging.jar For a typical Spring Application we need the following files 1. An interface that defines the functions. 2. An Implementation that contains properties, its setter and getter methods, functions etc., 3. A XML file called Spring configuration file. 4. Client program that uses the function. Edit 1. hello.java 2. helloimpl.java 3. hello.xml 4. helloclient.java //f:springdemohello.java public interface hello { public String sayhello(String a); } -------------------------------------------- //f:springdemohelloimpl.java public class helloimpl implements hello { private String greeting; public helloimpl() { } public helloimpl(String a) { greeting=a; } public String sayhello(String s)
  • 15. { return greeting+s; } public void setGreeting(String a) { greeting=a; } } -------------------------------------------- //f:springdemohello.xml <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <!DOCTYPE beans PUBLIC quot;-//SPRING//DTD BEAN//ENquot; quot;http://www.springframework.org/dtd/spring-beans.dtdquot;> <beans> <bean id=quot;helloquot; class=quot;helloimplquot;> <property name=quot;greetingquot;> <value>Good Morning!...</value> </property> </bean> </beans> -------------------------------------------- //f:springdemohelloclient.java
  • 16. import java.io.*; import org.springframework.beans.factory.*; import org.springframework.beans.factory.xml.*; import org.springframework.core.io.*; public class helloclient { public static void main(String args[]) throws Exception { try { System.out.println(quot;please Wait.quot;); Resource res = new ClassPathResource(quot;hello.xmlquot;); BeanFactory factory = new XmlBeanFactory(res); hello bean1 = (hello)factory.getBean(quot;helloquot;); String s = bean1.sayhello(args[0]); System.out.println(s); } catch(Exception e1) { System.out.println(quot;quot;+e1); } } } ------------------------------------------- To run: f:springdemo>javac hello.java f:springdemo>javac helloimpl.java f:springdemo>javac helloclient.java f:springdemo>java helloclient quot;samquot; We will get the output as follows: please wait.. Aug 5, 2002 2:10:56 AM org.springframework. beans.factory.xml.XmlBe anDefinitionReader loadBeanDefinitions
  • 17. INFO: Loading XML bean definitions from class path resource [hello.xml] Aug 5, 2002 2:10:57 AM org.springframework. beans.factory.support. AbstractBeanFactorygetBean INFO: Creating shared instance of singleton bean 'hello' Good Morning!...sam ------------------------------------ Thus we have run our first Spring program.Here helloimpl implements the hello interface. Although it is not necessary to hide the implementation behind an interface,it is recommended as a way to seperate implementation from interface. helloimpl has a single property greeting. This property can be set in two different ways: by property's setter method or by the constructor. The XML file hello.xml declares the instance of helloimpl.java in the spring container and configures its property greeting with the value 'Good Morning!...' The root of the hello.xml file is the <beans> element, which is the root element of any Spring configuration file. The <bean> element is used to tell the Spring container about the class and how it should be configured. Here, the id attribute takes the interface name and the class attribute specifies the bean’s fully qualified class name. Within the <bean> element, the <property> element is used to set the property, in this case the greeting property. By using <property>, we’re telling the Spring container to call setGreeting() while setting the property. The value of the greeting is defined within the <value> element. Here we have given 'Good Morning!...' as the value. The container instantiates the 'helloimpl' based on the XML definition as, helloimpl hello = new helloimpl(); helloimpl.setGreeting(quot;Good Morning!...quot;); Similarly, greeting property may be set through the single argument constructor of 'helloimpl' as, <bean id=quot;helloquot; class=quot;helloimplquot;> <constructor-arg> <value>Good Morning!...</value> </constructor-arg> </bean> Now the container instantiates the 'helloimpl' based on the XML definition as, helloimpl hello = new helloimpl(quot;Good Morning...quot;);
  • 18. In the client program, 'BeanFactory' class is used which is the Spring container. Then the 'getBean()' method is called to get the reference to the 'hello'. With this reference, sayhello() method is called. ------------------------------------------ We can also use a frame client. The code is very much similar to console client except the GUI code. //f:springdemohelloframe.java import java.io.*; import java.awt.*; import org.springframework.beans.factory.*; import org.springframework.beans.factory.xml.*; import org.springframework.core.io.*; public class helloframe extends Frame { TextField text1; TextArea area1; Label label1; Button button1; public static void main(String args[]) { helloframe app = new helloframe(); app.setSize(700,500); app.setVisible(true); } helloframe() { setLayout(new FlowLayout());
  • 19. setBackground(Color.green); label1=new Label(quot;Type Name: quot;); text1=new TextField(25); area1=new TextArea(10,50); button1=new Button(quot;Exitquot;); button1.setBackground(Color.red); add(label1); add(text1); add(area1); add(button1); } public boolean action (Event e,Object c) { if(e.target==text1) { try { area1.append(quot;Please Wait..nquot;); Resource res = new ClassPathResource(quot;hello.xmlquot;); BeanFactory factory = new XmlBeanFactory(res); hello bean1 = (hello)factory.getBean(quot;helloquot;); String s = bean1.sayhello(text1.getText()); area1.append(s); } catch(Exception e1) {area1.append(quot;quot;+e1);} }
  • 20. if(e.target==button1) { System.exit(0); } return true; } Then compile and run the frame client program. We will a textbox, a exit button and a text area. Type a name (say 'tom') in text area and press enter. 'Good Morning!... tom' will appear in the text area -------------------------------------------- Next we shall see how to run this program as a servlet. Consider Tomcat-5 is installed in g drive. First copy g:spring12spring.jar to g:tomcat5commonlib and start tomcat server. Then set classpath as shown below and edit the servletclient.java. f:springdemo>set classpath=f:springdemo; f:springdemospring.jar; f:springdemocommons-logging.jar; g:tomcat5commonlibservlet-api.jar //f:springdemoservletclient.java import java.io.*; import org.springframework.beans.factory.*; import org.springframework.beans.factory.xml*; . import org.springframework.core.io.*; import javax.servlet.*; import javax.servlet.http.*; public class servletclient extends HttpServlet {
  • 21. public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException { resp.setContentType(quot;text/htmlquot;); PrintWriter out =resp.getWriter(); String a = req.getParameter(quot;text1quot;); try { System.out.println(quot;Please wait.quot;); Resource res = new ClassPathResource(quot;hello.xmlquot;); System.out.println(quot;Resource okquot;); BeanFactory factory = new XmlBeanFactory(res); System.out.println(quot;BeanFactory okquot;); hello bean1 = (hello)factory.getBean(quot;helloquot;); String s = bean1.sayhello(a); out.println(s); } catch(Exception e1)
  • 22. {System.out.println(quot;quot;+e1);} } } -------------------------------------------- //f:springdemoservletclient.htm <html> <body> <form method=post action=quot;http://localhost:8080/ servlet/servletclientquot;> <input type=text name=quot;text1quot;> <input type=submit> </form> </body> </html> -------------------------------------------- Then compile the servlet and copy all the class files ie., hello.class, helloimpl.class, servletclient.class and the xml file hello.xml to g:tomcat5webappsrootweb-infclasses. Copy html file servletclient.htm to g:tomcat5webappsroot. Add entry to web.xml file. Restart Tomcat server and open browser and type url as http://localhost:8080/servletclient.htm. We will get a text box and a button. Type a name (say 'tom') and click the 'submit' button. Good Morning!... tom will appear In the next article, we shall see how to contact the database from Spring.
  • 23. PART-III (PUBLISHED IN DEVELOPER IQ - September2005) Now we will move on to the main process of any enterprise application: Data Persistence. For this we have to initialize our data access framework, manage resources, handle various exceptions and if anything goes wrong, we must roll-back so as to save the existing data. Spring comes with a family of data access frameworks that integrates well will variety of data access technologies like JDBC, Java Data Objects and Object Relational Mapping (ORM) tools like Hibernate, OJB, iBatis etc., Many J2EE application servers and even web servers provide a 'dataSource' via Jndi name. To configure the spring bean with the Jndi name of our 'dataSource' and use its connection pooling facility 'JndiObjectFactoryBean' is used. When a DataSource is not present, we need a connection pooling bean that implements 'dataSource'. For this purpose we use 'dbcp.BasicDataSource' is used. By using this we can have a 'dataSource' with connection pooling independent of application server. To perform unit-tests in our data access code, spring comes with a very lightweight 'dataSource' implementation class: 'DriverManagerDataSource'. This class can be easily configured for unit tests as, DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); These properties can be configured in the spring configuration file also. ---------------------------------------------- Spring comes with its own data access framework. Spring separates the fixed andvariant parts of data access process into two distinct classes : template and callback. Template manages the fixed part of our framework like data connection, managing resources, controlling transaction etc., while the Callback defines the things that are specific to our application like creating statements, binding parameters etc., The template class of Spring is 'JdbcTemplate'. A 'dataSource' is provided inside
  • 24. JdbcTemplate. An example of database connection using 'JdbcTemplate' is shown below. Here we are using 'MySql' database. The MySql database can be downloaded from http://www.mysql.com. Download mysql4.1 and MyODBC-3.51 (ODBC Connector) install these in the hard disk. For Mysql give a username('root') and a password ('sql'). Then start the 'My Sql Console Line Client' from programs and type the password. The prompt will be changed to mysql, mysql> show databases; Two databases will be present default: mysql and test. mysql> use test; We will get message as 'Database changed'. Next create table in test database as follows mysql> create table table1(name text, place text); We will get the message 'Query OK, 0 rows affected'. Now we have created a table in mysql database, set the path and classpath as before and edit the program ----- f:sprindemodatacon.java import javax.sql.*; public interface datacon { public DataSource dbcon(); } ---------------------------------------- f:sprindemodataconimpl.java import org.springframework.j dbc.core.*; import org.springframework.j dbc.datasource.*;
  • 25. import org.springframework.j dbc.object.*; import org.springframework.j dbc.support.*; import javax.sql.*; public class dataconimpl implements datacon { private DataSource dataSource; public void setDataSource(DataSource ds) { dataSource = ds; } public DataSource dbcon() { return dataSource; } } ---------------------------------------- f:sprindemodatacon.xml <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <!DOCTYPE beans PUBLIC quot;-//SPRING//DTD BEAN//ENquot; quot;http://www.springframework.org/dtd/spring-beans.dtdquot;> <beans> <bean id=quot;dataSourcequot; class=quot;org.springframework.jdbc.datasource.DriverManagerDataSourcequot; >
  • 26. <property name=quot;driverClassNamequot;> <value>sun.jdbc.odbc.JdbcOdbcDriver</value> </property> <property name=quot;urlquot;> <value>jdbc:odbc:test</value> </property> <property name=quot;usernamequot; > <value>root</value> </property> <property name=quot;passwordquot;> <value>sql</value> </property> </bean> <bean id=quot;dataconquot; class=quot;dataconimplquot;> <property name=quot;dataSourcequot;> <ref local=quot;dataSourcequot;/> </property> </bean> </beans> ---------------------------------------- f:sprindemospringservlet.java import java.io.*; import javax.sql.*;
  • 27. import java.sql.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import org.springframework.beans.factory.*; import org.springframework.beans.factory.xml.*; import org.springframework.core .io.*; import org.springframework.j dbc.core.*; import org.springframework.j dbc.datasource.*; import org.springframework.j dbc.object.*; import org.springframework.j dbc.support.*; public class springservlet extends HttpServlet { public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException { resp.setContentType(quot;text/htmlquot;); PrintWriter out = resp.getWriter(); String a = req.getParameter(quot;text1quot;); String b = req.getParameter(quot;text2quot;); String c = req.getParameter(quot;combo1quot;); String d = req.getParameter(quot;combo2quot;); try
  • 28. { System.out.println(quot;Wait...quot;); Resource res = new ClassPathResource(quot;datacon.xmlquot;); BeanFactory factory = new XmlBeanFactory(res); datacon bean1 = (datacon)factory.getBean(quot;dataconquot;); DataSource ds=bean1.dbcon(); if(d.equals(quot;addquot;)) { JdbcTemplate jt = new JdbcTemplate(ds); jt.execute(quot;insert into table1 values('quot;+a+quot;','quot;+b+quot;') quot;); out.println(quot;Record Addedquot;); } if(d.equals(quot;deletequot;)) { JdbcTemplate jt = new JdbcTemplate(ds); jt.execute(quot;delete from table1 where name='quot;+a+quot;' quot;); out.println(quot;Record Deletedquot;); } if(d.equals(quot;findquot;)) { List list1; JdbcTemplate jt = new JdbcTemplate(ds); list1=jt.queryForList(quot;select * from table1 where name='quot;+a+quot;'quot;);
  • 29. Iterator i=list1.iterator(); while(i.hasNext()) { Object ob = i.next(); out.println(ob.toString()); } } if(d.equals(quot;updatequot;)) { if(c.equals(quot;namequot;)) { JdbcTemplate jt = new JdbcTemplate(ds); jt.execute(quot;update table1 set table1.place='quot;+b+quot;'where table1.name='quot;+a+quot;' quot;); } if(c.equals(quot;placequot;)) { JdbcTemplate jt = new JdbcTemplate(ds); jt.execute(quot;update table1 set table1.name='quot;+a+quot;'where table1.place='quot;+b+quot;' quot;); } out.println(quot;Record Updatedquot;); }
  • 30. } catch(Exception e1) {System.out.println(quot;quot;+e1);} } } ---------------------------------------- f:sprindemospringservlet.htm <html> <body bgcolor=quot;pinkquot;> <form method=post action=quot;http://localhost:8080/ servlet/springservletquot;> Name : <input type=text name=quot;text1quot;> <br><br> Place : <input type=text name=quot;text2quot;> <br><br> Criterion : <select name=quot;combo1quot; size=1> <option value=quot;namequot;>Name <option value=quot;placequot;>Place </select> <br><br> <select name=quot;combo2quot; size=1> <option value=quot;addquot;>Add <option value=quot;deletequot;>Remove <option value=quot;findquot;>Find
  • 31. <option value=quot;updatequot;>Update </select> <br><br> <input type=submit> </form> </body> </html> The deployment procedure is same as before compile the all the files datacon.java, dataconimpl.java and springservlet.java and copy all the class files and the xml file datacon.xml to g:tomcat5webappsrootweb-infclasses. Copy the html file to g:tomcat5webappsroot. Add entry to web.xml file. Start Tomcat server and open browser and type url as http://localhost:8080/ servletclient.htm. We will get a two textboxes, two comboboxes and a 'submit' button. Type name and place in textboxes, select 'add' from combobox and click 'submit' button. We will get message as 'Record Added' ---------------------------------------- Spring provides integration for many of the ORM frameworks like Hibernate, JDO, Apache OJB and iBATIS SQL Maps. For mapping the hibernate resources,an instance of 'SessionFactory' is needed, 'LocalSessionFactoryBean' is used for this purpose and its properties 'hibernateProperties', 'mappingResources' and 'mappingDirectoryLocation'are set. Like Spring's DAO framework,here we have 'HibernateTemplate' to create an object of 'SessionFactory'. To access the data with 'HibernateTemplate' 'execute(HibernateCallback)' method is used. Similar to the 'SessionFactory' of hibernate, JDO has 'PersistenceManager Factory'. It can be configured by using 'LocalPersistenceManagerFactoryBean'.Also 'JDOTemplate' to create an object of 'PersistenceManagerFactory'.To access the data with 'JDOTemplate' 'execute(JDOCallback)' method is used. For iBATIS, we have to configure a 'SQLMapClient' by using 'SQLMapClientFactoryBea and its properties 'configLocation' and 'dataSource' are n' set. Here also we have 'SQLMapClientTemplate'. To access the data 'execute(SQLMapClientCallback)' method is used. The only property that we need to change to integrate Spring with OJB is
  • 32. 'ConnectionFactoryClass and it is done by using ' 'LocalDataSourceConnectionFactory '. In the next article we shall see how to use a RMI service in Spring and how to export any Spring managed bean as RMI. PUBLISHED IN DEVELOPER IQ - September2005) Spring supports remoting for six different RPC models: 1. Remote Method Invocation (RMI) 2. Hessian 3. Burlap 4. HTTP invoker 5. EJB 6. JAX-RPC In all the models, services are configured into the application through spring configuration file as spring managed beans. This is accomplished by using a proxy factory bean that enable us to wire remote services into the properties of our beans as if they were local objects. Spring provides 'RmiProxyFactoryBean' to use the RMI service and 'RmiServiceExporter' to export any spring managed bean as a RMI service. For wiring a Hessian based service to Spring client, Spring's'HessianProxyFactory Bean' is used. To export a Hessian Service 'HessianServiceExporter' is used and similarly for wiring a Burlap service 'BurlapProxyFactoryBean' is used and 'BurlapServiceExporter' is used to export a burlap service. For exporting beans as HTTP invoker services, 'HttpInvokerServiceExporter' is used .To access an HTTP invoker service 'HttpInvokerProxyFactoryBean can be used. ' Spring provides two proxy factory beans to access the Enterprise Java Beans. 'LocalStatelessSessionProx yFactoryBean' is used to access the EJB in the same container(local) and another one is 'SimpleRemoteStatelessSessionProxyFactoryBean'which is used to access the remote EJBs. For all the above models spring provides service exporter classes that exports Java Beans as remote service. Spring does not provide any EJB Service Exporter and it provides four abstract support classes to make the development of Spring enabled EJB. They are
  • 33. 1. AbstractMessageDrivenBeanto develop MDBs that accept sources other than JMS. 2. AbstractJmsMessageDrivenBean to develop MDBs that accept messages from JMS sources. 3. AbstractStatelessSessionBeanto develop stateless session bean. 4. AbstractStstefulSessionBean to develop stateful session bean. 'JaxRpcPostProxyFactoryBean'is used to wire a web service into the spring application. The client makes calls to the proxy to provide the service and the proxy calls the remote service on behalf of the client. -------------------------------------------- Now we shall see how to wire other RMI services into spring application and also how to export our own service. Remote Method Invocation (RMI) Model: RMI was first introduced in JDK 1.1. But developing and accessing RMI services involves various steps and also have lookups which makes the code hard to test. Spring simplifies the RMI by providing a 'proxy factory bean' that enables us to wire the RMI services into spring application as if they were local beans. Spring also provides a remote exporter that converts our 'spring managedbeans' into RMI services. Spring's 'RmiProxyFactoryBean' is a factory bean that creates a proxy to RMI service. It is declared spring configuration file under the <bean> tag as follows, <bean id=quot;service1quot; class=quot;org.springframework.remoting.rmi.RmiProxyFactoryBeanquot;> <property name=quot;serviceUrlquot;> <value>rmi://${hostname}/service1</value> </property> <property name=quot;serviceInterfacequot;> <value>service1</value> </property> </bean>
  • 34. The url of the RMI service is set through the 'serviceUrl' property. The 'serviceInterface' property specifies the interface that the service implements and only through that the client invokes methods on the service. For using the service the implementation code is wired to the RMI using the following code, <bean id=quot;serviceimplquot; class=quot;serviceimplquot;> <property name=quot;service1quot;> <ref bean=quot;service1quot;/> </property> </bean> ------------------------------------------- First set the path and classpath as before. Next edit the RMI service. //f:springdemormserver.java import java.rmi.*; public interface rmserver extends Remote { String getresult(String s) throws RemoteException; } ---------------------------------------------- //f:springdemormserverimpl.java import java.rmi.*; import java.rmi.server.*; public class rmserverimpl extends UnicastRemoteObject implements rmserver {
  • 35. public static void main(String args[]) { try { rmserverimpl ob = new rmserverimpl(); Naming.rebind(quot;rmserverquot;,ob); System.out.println(quot;readyquot;); } catch(Exception e1) {System.out.println(quot;quot;+e1);} } public rmserverimpl() throws RemoteException { System.out.println(quot;constructor okquot;); } public String getresult(String a) throws RemoteException { return quot;Hai...quot;+a; } } ---------------------------------------------- //f:springdemormserver.xml <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <!DOCTYPE beans PUBLIC quot;-//SPRING//DTD BEAN//ENquot;
  • 36. quot;http://www.springframework.org/dtd/ spring-beans.dtdquot;> <beans> <bean id=quot;rmserverquot; class=quot;org.springframework.remoting. mi.RmiProxyFactoryBeanquot;> r <property name=quot;serviceUrlquot;> <value>rmi://localhost/rmserver</value> </property> <property name=quot;serviceInterfacequot;> <value>rmserver</value> </property> </bean> <bean id=quot;rmserverimplquot; class=quot;rmserverimplquot;> <property name=quot;rmserverquot;> <ref bean=quot;rmserverquot;/> </property> </bean> </beans> --------------------------------------------- //f:springdemormspring.java import java.rmi.*; import org.springframework.beans.factory.*; import org.springframework.beans.factory.xml*; . import org.springframework.core.io.*;
  • 37. public class rmspring { public static void main(String args[]) { try { System.out.println(quot;Wait..quot;); Resource res = new ClassPathResource(quot;rmi.xmlquot;); BeanFactory factory = new XmlBeanFactory(res); rmserver bean1 = (rmserver) factory.getBean(quot;rmserver quot;); String r=bean1.getresult(args[0]); System.out.println(r); } catch(Exception e1) {System.out.println(quot;quot;+e1);} } } --------------------------------------- To run: f:springdemo>javac rmserver.java f:springdemo>javac rmserverimpl.java f:springdemo>rmic rmserverimpl (To create stub and skeleton) f:springdemo>javac rmspring.java f:springdemo>start rmiregistry (a blank window will appear)
  • 38. f:springdemo>java rmserverimpl Open another Window and run the client code by giving the argument f:springdemo>java rmspring quot;samquot; We will get the output as: Wait.. ...... Hai... sam Here we have removed the 'lookup' code in the client side. ----------------------------------------------------------------- Spring also supports the server side of RMI. Here the service itself is written with spring and it is exposed as an RMI service. Here the bean is written as a simple JavaBean. Also we need not generate the stub and skeleton using 'rmic' command and manually add it to RMI registry. Instead of these traditional procedure 'RmiServiceExporter' is used to export any Spring managed bean as an RMI service. It wrapps the bean in an adapter class. The adapter class is then bound to RMI registry and the proxies request the service. <bean class=quot;org.springframework.remoting.rmi.RmiServiceExporterquot;> <property name=quot;service1quot;> <ref bean=quot;service1quot;/> </property> <property name=quot;serviceNamequot;> <value>service1</value> </property> <property name=quot;serviceInterfacequot;> <value>service1</value> </property> </bean> The 'serviceName property' indicates the name of service and 'serviceInterface' specifies the interface implemented by the service. There is no need of 'serviceUrl' here
  • 39. First set the path and classpath as before. Next edit the service. //f:springdemormservice.java public interface rmservice { String getresult(String s); } ------------------------------------------ //f:springdemormserviceimpl.java public class rmserviceimpl implements rmservice { public static void main(String args[]) { System.out.println(quot;readyquot;); } public rmserviceimpl() { System.out.println(quot;constructor okquot;); } public String getresult(String a) { return quot;Haiquot;+a; } } ------------------------------------------
  • 40. //f:springdemormservice.xml <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <!DOCTYPE beans PUBLIC quot;-//SPRING//DTD BEAN//ENquot; quot;http://www.springframework.org/dtd spring-beans.dtdquot;> / <beans> <bean class=quot;org.springframework. emoting.rmi.RmiServiceEx r porterquot;> <property name=quot;servicequot;> <value>rmservice</value> </property> <property name=quot;serviceNamequot;> <value>service1</value> </property> <property name=quot;serviceInterfacequot;> <value>rmservice</value> </property> </bean> <bean id=quot;rmservicequot; class=quot;rmserviceimplquot;> </bean> </beans> ------------------------------------------ //f:springdemormserviceclient.java import java.io.*; import org.springframework.beans.factory.*; import org.springframework.beans.factory.xml*; .
  • 41. import org.springframework.core.io.*; class rmserviceclient { public static void main(String args[]) { try { System.out.println(quot;Wait..quot;); Resource res = new ClassPathResource(quot;rmservice.xmlquot;); BeanFactory factory = new XmlBeanFactory(res); System.out.println(quot;factory createdquot;); rmservice bean1 = (rmservice)factory.getBean(quot;r servicequot;); m String s = bean1.getresult(args[0]); System.out.println(s); } catch(Exception e1) {System.out.println(quot;quot;+e1);} } } --------------------------------------- To run: f:springdemo>javac rmservice.java f:springdemo>javac rmserviceimpl.java f:springdemo>javac rmserviceclient.java
  • 42. f:springdemo>java rmsserviceclient We will get Output as: Wait.. Aug 12, 2002 10:55:07 PM org.springframework.beans.factory. xml.XmlBeanDefinitionReader loadBeanDefinitions INFO: Loading XML bean definitions from class path resource[rmservice.xml] Aug 12, 2002 10:55:07 PM org.springframework.beans.factory. support.AbstractBeanFactory getBean INFO: Creating shared instance of singleton bean 'rmservice' constructor ok Hai...sam Here the service interface doesn't extend the 'java.rmi.Remote' method and 'RemoteException' is not thrown by the methods. There is no binding in the implementation code. Also we can direcly run the client. No run to run 'rmserverimpl' first. Also there is no need to run the RMI registry.