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

Spring IoC(控制反转)【一】

2014-07-29 09:16 113 查看
需要使用的IoC对象

Spring中需要使用的IoC容器管理的bean都与实际应用的对象一一对应,但是并不是所有对象都需要在IoC中进行管理,

常见的需要使用IoC进行管理的对象有如下几种:

1、服务层对象

服务层对象封装了业务逻辑,用来实现应用中的业务逻辑,称为服务类,往往需要在IoC容器中进行管理。

2、数据访问对象

数据访问对象封装了数据访问逻辑,需要在IoC容器中进行管理。

3、表示层对象

某些表示层对象也常常需要在IoC容器中进行管理,例如Struts2框架中的Action类。

4、工厂类对象

某些工厂类对象常常需要使用IoC容器进行管理,例如Hibernate框架的SessionFactory工厂对象。

5、JMS的Queue、Topic对象

消息处理中的Queue以及Topic对象也常常需要在IoC容器中进行管理。

值得注意的是,并不是只有上述的对象可以使用IoC容器管理,任何对象都可以使用IoC管理。

然而,在实际JavaEE应用中,上述几种对象使用IoC管理的情况较多。

如何实例化bean

使用IoC容器管理bean,主要包括实例化bean以及装配bean两个方面。

装配bean之前,首先需要能够实例化bean才行。

在applicationContext.xml中指定IoC容器实例化bean对象的不同方法。

IoC容器通常有以下三种实例化bean的方法:

1、通过无参构造方法实例化

如果在配置文件中只使用id和class属性配置bean,则默认调用类的无参构造方法实例化

<bean id="customer" class="vo.Customer"></bean>
上述配置将调用Customer类的无参构造方法创建Customer实例。

2、通过静态工厂方法实例化

有些类中提供了静态工厂方法返回实例,假设Course类中有如下静态工厂方法:

public static Course createCourse(){
System.out.println("invoke createCourse()");
return new Course();
}
在配置文件中可以使用factory-method属性调用该静态工厂方法,创建Course实例,代码如下:

<bean id="course" class="vo.Course" factory-method="createCourse"></bean>


3、通过非静态工厂方法实例化

有些类中可能提供了非静态工厂方法返回实例,假设存在一个类CoureseFactory,其中提供了非静态的工厂方法以返回Course实例

public class CourseFactory{
public Course createCourse(){
System.out.println("invoke CourseFactory createCourse()");
return new Course();
}
}
通过下面的配置,可以调用CourseFactory的createCourse工厂方法创建Course实例:

<bean id="courseFactory" class="factory.CourseFactory" ></bean>
<bean id ="course" class ="vo.Course" factory-method="createCourse" factory-bean="courseFactory"></bean>
上述配置文件中,先实例化了工厂类CourseFactory的实例courseFactory,然后通过factory-bean指定使用该工厂bean,并通过factory-method指定使用工厂方法createCourse实例化Course的实例。

setter注入和构造器注入

对象实例化后,往往需要对其依赖的属性进行赋值,称为依赖注入。

Spring中主要有两种注入方法,即setter注入和构造器注入。

setter注入:

例Course类中存在如下setter方法:

public void setId(){
this.id=id;
}
在配置文件的bean元素下,可以使用property元素指定属性名,进而调用对应的setter方法注入具体值

<bean id="course" class="vo.Course">
<property name="id">
<value>1</value>
</property>
</bean>
上述配置信息中,property的name属性值必须与setter方法名对应,规则与JavaBean相同,即property的name值是对应的setXXX方法名的set后的单词,且首字母必须小写。

属性值使用<value>元素指定,通过<value>元素指定的都是内置类型的值,如Integer、double、String等类型,

例如上述配置中<value>1</value>将把值作为实际参数传给setId方法对属性赋值。

构造方法注入:

例Course类中有如下构造方法:

public Course(Integer id,String title,double price){
super();
this.id=id;
this.title=title;
this.price=price;
}
配置文件中可以通过如下配置,使用上述构造方法对Course实例注入属性:

<bean id="course" class="vo.Course">
<constructor-arg index="0">
<value>4</value>
</constructor-arg>
<constructor-arg index="1">
<value>Java</value>
</constructor-arg>
<constructor-arg index="2">
<value>1000</value>
</constructor-arg>
</bean>


上述配置信息中,<constructor-arg>表示构造方法的参数,index表示构造方法中参数的索引值,例如<constructor-arg index="0">表示构造方法的第一个参数。

<value>元素用来指定构造方法的参数值,和<property>的子元素<value>一样,只能用来赋值内置类型的值。

在实际应用开发中,使用setter方式注入的情况较多因为构造方法注入的方式容易产生混淆和歧义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: