spring bean注入的方式

原创 2015年11月19日 15:18:52

一 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,就只能够使用配置文件方式了。其它的就看实际项目选择了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HBase 官方文档0.97.0

HBase     官方文档中文版0.97.0 Copyright © 2012 Apache Software Foundation。保留所有权利。 Apache Hado...
  • rzhzhz
  • rzhzhz
  • 2013年05月29日 17:57
  • 8723

Think in java 第一章 总结随笔

1.1抽象过程 人们所能够解决的问题的复杂性直接取决于抽象的类型和质量。 Smalltalk(java所基于的语言之一)的五个基本特性 1)万物皆是对象 2) 程序是对象的集合,它们通过发...

Spring中Bean属性为集合的注入方式

实体类CollectionBean{List cityList,Set citySet,String[] cityArray,Map mms,Properties props}   get(),set...

SSM框架项目搭建系列(四)— Spring之bean的XML注入方式

在XML中可使用两种方式进行注入:构造函数注入和setter注入构造函数注入constructor直接传值applicationContext.xml ...

spring的注入bean的几种方式

平常的Java开发中,程序员在某个类中需要依赖其它类的方法。 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理。 Spring提出了依赖注入的思想,即依赖类...

Spring学习(十八)Bean 的三种依赖注入方式介绍

依赖注入:让调用类对某一接口实现类的依赖关系由第三方注入,以移除调用类对某一接口实现类的依赖。 接下来将详细的向大家介绍Spring容器支持的三种依赖注入的方式以及具体配置方法: •    属性注...

Spring的bean注入方式

Spring中依赖注入有三种注入方式: 一、构造器注入; 二、设值注入(setter方式注入); 三、Feild方式注入(注解方式注入)。   一、构造器注入   ...

Spring进阶之路(12)-注解方式实现Bean的注入

鉴于之前的博文中都是通过在xml中对bean进行配置的方式注入的,又加上博友的要求,决定对注解方式进行一个简单的讲解,这里不会涉及太复杂的程序,因为本文的目的是让看到这篇博文的广大博友能懂,而不是云里...

Spring注入Bean的几种方式

首先,Bean的概念需要清晰: Bean是一种符合一定要求的Java类 1 有默认的构造函数 2 对于私有属性,有setter和getter满足了上述的条件,在工程中就可以在XML文件中定义类的...

Spring-2:bean的两种依赖注入方式

在生成实例对象的时候有两种方式为bean中的成员变量赋值,一种是通过调用setter方法,另一种是利用构造器方法。调用setter方法在上一篇helloworld的实验中已经使用,这种方法属于属性注入...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring bean注入的方式
举报原因:
原因补充:

(最多只允许输入30个字)