Spring IoC(控制反转)【一】

需要使用的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方式注入的情况较多因为构造方法注入的方式容易产生混淆和歧义。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值