I've been a zone leader with DZone since 2008, and I'm crazy about community. Every day I get to work with the best that JavaScript, HTML5, Android and iOS has to offer, creating apps that truly make at difference, as principal front-end architect at Avego. James is a DZone Zone Leader and has posted 605 posts at DZone. You can read more from them at their website. View Full User Profile

SpringIDE - Using Spring in Eclipse

02.13.2008
| 406150 views |
  • submit to reddit

Creating a New Project

To create a new project, you just need to use the New Spring Project wizard to get going. If you don't do this it's ok -you can just add a "Spring Nature" to your project at a later stage.

It's important to have a few core jars included in your library. Firstly,we want to run the Spring container in our application, so we should include spring.jar from the dist directory of the Spring download.
Additionally, we need two more jars to get running with Spring AOP. If you've downloaded Spring with dependencies, you can find these libraries in lib directory. Jakarta Commons logging is always required by Spring, and you will also need to include cglib.

 

Object Creation

When implementing a bean/object to be held in the Spring container, you will need to first create an interface for
that bean.

public interface ISampleBean 
{
public void setName(String name);
public String getName();

public void setAge(String age);
public String getAge();
}

Following this, we will create an implementation of that interface. Don't forget you can make this very easy on yourself by using the new class wizard, and choosing to implement stubs for the methods in your interface.

public class SampleBean implements ISampleBean
{
private String name;
private String age;

public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getAge()
{
return age;
}
public void setAge(String age)
{
this.age = age;
}
}


Create a New Bean Definition File

Next, we need to make the Spring container aware of this bean. To do this we add a new Spring Bean Definition using the wizard provided by SpringIDE.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

We will be using aspects, as well as beans in our Spring container, we need to select both the AOP and
bean namespaces. There are other namespaces available depending on what you need your Spring container to do, but for this example we don't need any others.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

There is also the option to add this configuation to a Bean Config Set. As we are only using on configuration file,
this is outside of our example. In the Design view (which will be opened by default) for you configuration file, you can easily add elements to represent your beans.

 

 

 

 

 

 

 

 

 

 

 

 

 

The first bean we add is the implementation of the interface defined earlier, as this is the object we wish
to intercept. All we need to do is provide an id for us to reference this bean with, and a class attribute to show
exactly which object this is.

 

 

 

 

 

Add Method Interceptor

The next step is to add a MethodInterceptor implementation. Here all we will do is print out a message when we intercept a method (i.e. when the method has been called).

package com.eclipsezone.spring.aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class Interceptor implements MethodInterceptor {

@Override
public Object invoke(MethodInvocation methodInv) throws Throwable
{
System.out.println("Intercepted method - " + methodInv.getMethod().getDeclaringClass()
+ " - " + methodInv.getMethod().getName());
// TODO Auto-generated method stub

return null;
}

}

This interceptor then needs to be added to the configuration file.

 

 

Once we have added the bean and the interceptor, we need to put it all together. In order to create the bean from the Spring container, we will need to use a ProxyFactoryBean.
This then needs the following properties:

  • proxyInterfaces - This needs to be given the value of the interface defined earlier for the bean
  • interceptorNames - A list of interceptor names, in this case 'interceptor'
  • target - A reference to the id of the bean we wish to access, in this case 'com.eclipsezone.spring.sample'
  • proxyTargetClass - Should be set to true

 

 

 

 

 

 

 

 

 

 

 

For completeness, here is the configuration file in pure XML

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="com.eclipsezone.spring.sample" class="com.eclipsezone.spring.test.SampleBean"></bean>
<bean id="interceptor" class="com.eclipsezone.spring.aop.Interceptor"></bean>
<bean id="proxyBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.eclipsezone.spring.test.ISampleBean</value>
</property>
<property name="interceptorNames">
<list>
<value>interceptor</value></list></property>
<property name="target">
<ref local="com.eclipsezone.spring.sample" /></property>
<property name="proxyTargetClass">
<value>true</value></property>
</bean>
</beans>

Run the Example

So now we need to put it all together and see the example in action. The following code sets up the Spring container within our application, and loads up the bean from the container, using a reference to the proxy. It's important that we do this, as just instantiating the bean using new <instance>(), won't add in the interceptor.

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Tester
{
private static ApplicationContext context;

/**
* Load up the Spring container
*/
private void loadContext()
{
String filename = "beanDefinition.xml";
context = new FileSystemXmlApplicationContext(filename);
}

public static void main(String[] args)
{

Tester test = new Tester();
test.loadContext();
//reference the proxy through the Spring container
SampleBean sb = (SampleBean)context.getBean("proxyBean");
sb.setName("New Name");
}
}

 

It's a pretty simple example, but it shows the possibilities when you use Spring in your application.
Of course there's a lot more to Spring than just AOP - I'd encourage you to try out some of the other
features that Spring gives you.

 

Comments

Sudip Verma replied on Thu, 2008/07/31 - 4:57am

Hi,

I am not able to download the springID update, so caould not process furthe.Can anybody help regarding this?

Glen Ihrig replied on Tue, 2008/08/19 - 5:55pm

Over all, a very helpful tutorial

There seems to be a growing recognition among tutorial authors that Spring is in need of a light-weight introduction. This is a very good sign as it suggests that Spring may truly be accessible to the 'every-day' Java developer, shattering the common belief that frameworks (including Spring) are for enterprise gurus. (Silly developers ;-)

This is the third basic Spring tutorial I have attempted, and the first I have been able to get working. Thanks - I now have reason to believe that I too will realize the benefits of Spring.

This tutorial does have a few issues that had me wondering if I was ever going to get the tutorial, and Spring, to work. Here are the problems I encountered and the solutions that got it working for me.


Creating a New Project

There is no instruction, beyond "use the New Spring Project wizard" on how to start this wizard. Some familiarity with Eclipse is assumed. Of course, a greater knowledge than this will be required to work with Java and Spring later on. Still File->New->Other opens the screen shot shown in the tutorial.

No Project Name is provided. A project name of SpringTest is expected in later steps. Not knowing this caused me a lot of confusion and frustration, when I mistook "SpringTest" to mean ...com/eclipsezone/spring/test.

The paragraph on required libraries could be clearer. The required libraries and their locations (as of Spring 2.5.5) are:

spring-framework-2.5.5/dist/spring.jar
spring-framework-2.5.5/lib/jakarta-commons/commons-logging.jar
spring-framework-2.5.5/lib/cglib/cglib-nodep-2.1_3.jar

Object Creation

The text has no indication where to put the ISampleBean interface code. The following screen shot on creating the SampleBean class shows the Source folder and Package which describe this.

.../SpringTest/src//com/eclipsezone/spring/test/ISampleBean.java

The SampleBean class is incorrectly named "SamplebeanImple" in the screen shot. It is later referred to as SampleBean.


Create a New Bean Definition File

Placing this file in the project root directory "SpringTest" is vital. 
Not knowing this caused me a lot of confusion and frustration, when I mistook "SpringTest" to mean
.../com/eclipsezone/spring/test.

The correct action is: Right click the project root folder, "SpringTest", and select New->Other->Spring->Spring Bean Definition to create the Spring Bean Definition file.

There is a minor typo following the XSD namespace declarations screen shot.

... As we are only using on configuration file, Should be:
... As we are only using one configuration file,


Add Method Interceptor

The code will not compile as listed for class Interceptor. The
"@Override"
annotation is wrong and should be removed. 

Not a problem with the tutorial, but I was unable to get the beanDefinition  xml editor to change the value associated with "value" elements.

e) property
a) name - interceptorNames
e) list
e) value - interceptor

Right clicking the value element provides no "Edit Attribute" function.

The solution I used was to open the beanDefinition.xml file in Source view with the tab at the lower left corner of the editor window, and paste in the code from the tutorial.


Spring Explorer

The paragraph following the Show View screen shot would benefit from a little reorganization:

In this view you can easily add in Config Sets or single Config Files. If you right click on the Config File and choose View Graph, you get to see a nice representation (using Eclipse's GEF) of your Spring configuration file ...

Suggest:

If you right click on the Config File in this view and select Properties, you can easily add in Config Sets or single Config Files.  Choose Open Graph, and you get to see a nice representation (using Eclipse's GEF) 
of your Spring configuration file ...

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

The bottom line is, I got my first working understanding of Spring AOP and Interceptors from this tutorial and I am grateful for that.

Four stars (would be worth five with the above issues fixed).

Thanks!

-Glen

William Willems replied on Mon, 2008/11/17 - 8:30am

Very nice intro to start using the features provided by the Spring IDE. I like it that it is pretty high level and shows some AOP stuff.

Giuseppe Zitelli replied on Mon, 2009/04/27 - 4:38am in response to: Sudip Verma

Hi. please try http://springide.org/updatesite/.

swati gudla replied on Wed, 2009/09/02 - 1:30am

Hello EveryOne,

I tried to download springIDE from the follwoing link  (http://springide.org/updatesite-dev).When i click on this link it gives an error back saying

<Error>
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
<Key>release/IDE-dev</Key>
<RequestId>536B0F024044807C</RequestId>

<HostId>
30YvYelUJVb04zlb6uM+2FSFx+xK8/+xh2x6/Z/VLvQwhzqL0fOeaIdFrDhgXs18
</HostId>
</Error>

Please can someone send me the plgin if some body has it..

I would really apprecitae if some one can send me a reply back..

Thanks,

swati

sachin todkar replied on Fri, 2009/10/30 - 12:23pm

Hi , I am getting the following error when I try to run this sample. I am new to java so apologize if this is silly. INFO: Bean factory for application context [org.springframework.context.support.FileSystemXmlApplicationContext@15eb0a9]: org.springframework.beans.factory.support.DefaultListableBeanFactory@72ffb Oct 30, 2009 1:25:04 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@72ffb: defining beans [com.eclipsezone.spring.test,com.eclipsezone.spring.aop.Interceptor,proxyBean]; root of factory hierarchy Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'proxyBean': FactoryBean threw exception on object creation; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class java.lang.String]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class java.lang.String at org.springframework.beans.factory.support.FactoryBeanRegistrySupport$1.run(FactoryBeanRegistrySupport.java:127) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:116) at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:91) at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1288) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:217) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:880) at com.eclipsezone.spring.test.Tester.main(Tester.java:22) Thanks, Sachin

sachin todkar replied on Fri, 2009/10/30 - 1:05pm in response to: sachin todkar

Please ignore this request I found the problem Thanks, Sachin

Freddy Cruz replied on Wed, 2009/12/16 - 5:17pm in response to: Glen Ihrig

Thanks for you support! I have 3 days reading the spring framework reference, and now...  i test my first project susscefully.

 I will go intro Spring world

Wp Moore-taylor replied on Thu, 2010/02/04 - 3:19am

Hi , I am getting the following error when I try to run this sample, any help would be good

 

INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@199f91c: defining beans [com.eclipsezone.spring.sample,interceptor,proxyBean]; root of factory hierarchy
3
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'proxyBean': FactoryBean threw exception on object creation; nested exception is java.lang.NoSuchMethodError: net.sf.cglib.proxy.Enhancer.setInterceptDuringConstruction(Z)V
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport$1.run(FactoryBeanRegistrySupport.java:127)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:116)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:91)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:217)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:880)
    at spring.test.Tester.main(Tester.java:26)
Caused by: java.lang.NoSuchMethodError: net.sf.cglib.proxy.Enhancer.setInterceptDuringConstruction(Z)V
    at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:182)
    at org.springframework.aop.framework.ProxyFactoryBean.getProxy(ProxyFactoryBean.java:363)
    at org.springframework.aop.framework.ProxyFactoryBean.getSingletonInstance(ProxyFactoryBean.java:317)
    at org.springframework.aop.framework.ProxyFactoryBean.getObject(ProxyFactoryBean.java:243)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport$1.run(FactoryBeanRegistrySupport.java:121)

Phil Hanchet replied on Wed, 2010/08/25 - 7:37am

Brilliant - thanks so much for this James - huge help on a massive topic Phil Hanchet OTG

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.