Apache Struts 2 Documentation > Home > Guides > Plugin Developers Guide > Spring Plugin |

Apache Struts 2 Documentation
Spring Plugin
Edit Page Browse Space Add Page Add News
Added by ctran, last edited by Ted Husted on Feb 04, 2007 (view change)

| Spring is a lightweight container, providing centralized, automated configuration and wiring of your application objects, using a technique called "Dependency Injection"

The Spring Plugin works by overriding the Struts ObjectFactory to enhance the creation of core framework objects. When an object is to be created, it uses the `class` attribute in the Struts configuration to correspond to the `id` attribute in the Spring configuration. If not found, the class will try to be created as usual, then be autowired by Spring. In the case of Actions, Spring 2's bean scope feature can be used to scope an Action instance to the session, application, or a custom scope, providing advanced customization above the default per-request scoping.

| Spring Actions are Optional! Remember: registering Actions with Spring is not required. The Spring alternative is there if you need it, but the framework will automatically create Actions objects from the action mappings. But, if you want to use Spring to inject your Actions, the option is there.

#### Features

- Allow Actions, Interceptors, and Results to be created by Spring
- Struts-created objects can be autowired by Spring after creation
- Provides two interceptors that autowire actions, if not using the Spring ObjectFactory

## Usage

To enable Spring integration, simply include struts2-spring-plugin-x-x-x.jar in your application.

If you are using more than one object factory, (for example, by including both the Spring and Plexus plugins in your application,) you will need to set the struts.objectFactory property in struts.properties or in one of several XML files via Constant Configuration:

struts.properties

    struts.objectFactory = spring

struts.xml

    <struts>
      <constant name="struts.objectFactory" value="spring" />
      ...
    </struts>

#### Autowiring

The framework enables "autowiring" by default. (Autowiring means to look for objects defined in Spring with the same name as your object property). To change the wiring mode, modify the `spring.autowire` property.

Wiring Mode

    struts.objectFactory.spring.autoWire = type

The `autowire` property can be set to several options.

name | Auto-wire by matching the name of the bean in Spring with the name of the property in your action. This is the default
type | Auto-wire by looking for a bean registered with Spring of the same type as the property in your action. This requires you to have only one bean of this type registered with Spring
auto | Spring will attempt to auto-detect the best method for auto-wiring your action
constructor | Spring will auto-wire the parameters of the bean's constructor

By default, the framework will at least try to use Spring to create all its objects. If the object cannot be created by Spring, then the framework will create the object itself.

Enabling Spring integration for other application objects is a two-step process.

- Configure the Spring listener

web.xml

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

- Register your objects via the Spring configuration

applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans default-autowire="autodetect">
        <bean id="personManager" class="com.acme.PersonManager"/>
        ...
    </beans>

| More applicationContext configuration files needed? Since the Spring integration uses a standard Listener, it can be configured to support configuration files other than `applicationContext.xml`. Adding the following to your web.xml will cause Spring's ApplicationContext to be inititalized from all files matching the given pattern:
    <!-- Context Configuration locations for Spring XML files -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>
    </context-param>
See the Spring documentation for a full description of this parameter.

#### Initializing Actions from Spring

Normally, in `struts.xml` you specify the class for each Action. When using the default SpringObjectFactory, the framework will ask Spring to create the Action and wire up dependencies as specified by the default auto-wire behavior.

| We strongly recommend that you find declarative ways of letting Spring know what to provide for your actions. This includes making your beans able to be autowired by either naming your dependent properties on your action the same as the bean defined in Spring which should be provided (to allow for name-based autowiring), or using autowire-by-type and only having one of the required type registered with Spring. It also can include using JDK5 annotations to declare transactional and security requirements rather than having to explicitly set up proxies in your Spring configuration. If you can find ways to let Spring know what it needs to do for your action without needing any explicit configuration in the Spring `applicationContext.xml`, then you won't have to maintain this configuration in both places.

However, sometimes you might want the bean to be completely managed by Spring. This is useful, for example, if you wish to apply more complex AOP or Spring-enabled technologies, such as Acegi, to your beans. To do this, all you have to do is configure the bean in your Spring `applicationContext.xml` and then change the class attribute from your Action in the `struts.xml` to use the bean name defined in Spring instead of the class name.

Your `struts.xml` file would then have the Action class attributes changed.

struts.xml

    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
        <include file="struts-default.xml"/>

        <package name="default" extends="struts-default">
            <action name="foo" class="com.acme.Foo">
                <result>foo.ftl</result>
            </action>
        </package>

        <package name="secure" namespace="/secure" extends="default">
            <action name="bar" class="bar">
                <result>bar.ftl</result>
            </action>
        </package>
    </struts>

Where you have a Spring bean defined in your `applicationContext.xml` named "bar". Note that the `com.acme.Foo` Action did not need to be changed, because it can be autowired.

A typical spring configuration for bar could look as following.

applicationConext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans default-autowire="autodetect">
        <bean id="bar" class="com.my.BarClass" singleton="false"/>
        ...
    </beans>

To use session-scoped components with Spring and Struts, see the Spring Session Components Workarounds analysis.

#### Settings

The following settings can be customized. See the developer guide.

Setting | Description | Default | Possible Values
--- | --- | --- | ---
`struts.objectFactory.spring.autoWire` | The autowire strategy | `name` | `name`,`type`,`auto`, or `constructor`
`struts.objectFactory.spring.useClassCache` | Whether to have Spring use its class cache or not | `true` | `true` or `false`

#### Installation

This plugin can be installed by copying the plugin jar into your application's `/WEB-INF/lib` directory. No other files need to be copied or created.