您的位置:首页 > 编程语言 > Java开发

Spring Ioc-依赖注入的几种方式

2013-06-20 12:58 627 查看
一 setter方法注入

配置文件如下:

<bean id="helloAction" class="org.yoo.action.SpringSetterHelloAction">

<!-- setter injection using the nested <ref/> element -->

<property name="helloservice"><ref bean="helloService"/></property>

<!--可以不设置类型 -->

<property name="name" value="yoo"></property>

</bean>

action实现类中代码:

private IHelloService helloservice;

private String name ;

public void sayHello(){

helloservice.sayHello();

System.out.println(this.name);

}

public void setHelloservice(IHelloService helloservice) {

this.helloservice = helloservice;

}

public void setName(String name) {

this.name = name;

}

这里的name和helloservice都采用属性的setter方法注入。即类中设置一个全局属性,并对属性有setter方法,以供容器注入。

二 构造器注入

spring也支持构造器注入,也即有些资料中的构造子或者构造函数注入。

先看配置文件:

<!--普通构造器注入-->

<bean id="helloAction" class="org.yoo.action.ConstructorHelloAction">

<!--type 必须为java.lang.String 因为是按类型匹配的,不是按顺序匹配-->

<constructor-arg type="java.lang.String" value="yoo"/>

<!-- 也可以使用index来匹配-->

<!--<constructor-arg index="1" value="42"/>-->

<constructor-arg><ref bean="helloService"/></constructor-arg>

</bean>

action实现类中代码:

private HelloServiceImpl helloservice;

private String name ;

public SpringConstructorHelloAction(HelloServiceImpl helloservice,String name){

this.helloservice = helloservice;

this.name = name ;

}

@Override

public void sayHello() {

helloservice.sayHello();

System.out.println(this.name);

}

同样设置2个属性,然后在构造函数中注入。

三静态工厂注入

配置文件如下:

<!--静态工厂构造注入-->

<!--注意这里的class 带factory-method参数-->

<!--factory-method的值是FactoryHelloAction中的工厂方法名createInstance-->

<bean id="helloAction" class="org.yoo.di.FactoryHelloAction" factory-method="createInstance">

<constructor-arg type="java.lang.String" value="yoo"/>

<constructor-arg><ref bean="helloService"/></constructor-arg>

</bean>

action实现类:

private HelloServiceImpl helloservice;

private String name = null;

private SpringFactoryHelloAction(String name ,HelloServiceImpl helloservice){

this.helloservice = helloservice ;

this.name = name ;

}

public static SpringFactoryHelloAction createInstance(String name ,HelloServiceImpl helloservice) {

SpringFactoryHelloAction fha = new SpringFactoryHelloAction (name,helloservice);

// some other operations

return fha;

}

@Override

public void sayHello() {

helloservice.sayHello();

System.out.println(this.name);

}

四 无配置文件注入(自动注入)

上面三种方法都需要编写配置文件,在spring2.5中还提供了不编写配置文件的ioc实现。需要注意的是,无配置文件指bean之间依赖,不基于配置文件,而不是指没有spring配置文件。

配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

<bean id="helloService" class="org.yoo.service.HelloServiceImpl">

</bean>

<bean id="helloAction" class="org.yoo.action.AutowiredHelloAction">

</bean>

</beans>

可见上面只是设置了helloService和helloAction两个bean,并没有设置helloAction对helloService的依赖。

另外<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>是必须的,有此才支持自动注入。

action实现类:

/*

* 属性自动装载

*/

/*

@Autowired

private HelloService helloservice;

@Override

public void sayHello() {

helloservice.sayHello();



上面代码很简单,在属性上加上 @Autowired注释,spring会自动注入HelloService 。

同样也支持构造器和setteer方法的注入,如下:

构造器自动注入:

/*

* 还可以使用构造函数设置

*/

@Autowired

public SpringAutowiredHelloAction(HelloServiceImpl helloservice){

this.helloservice = helloservice;

}

setter方法自动注入:

/*

* 也可以使用set方法设置

*/

/*

@Autowired

public void setHelloservice(HelloService helloservice) {

this.helloservice = helloservice;

}

最后在spring的reference文档中有提到,如果不使用自动注入,尽量使用setter方法,一般通用的也是使用setter方法。

而使用自动注入还是配置文件方式,如果jdk低于1.5或者spring不是2.5,就只能够使用配置文件方式了。其它的就看实际项目选择了。

分享到:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: