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

spring ioc注入的三种方式

2018-02-06 09:27 405 查看
转载,连接http://blog.csdn.net/frightingforambition/article/details/47984711


一、spring ioc注入有哪三种方式:

a  setter
原理 : 在目标对象中,定义需要注入的依赖对象对应的属性和setter方法;“让ioc容器调用该setter方法”,将ioc容器实例化的依赖对象通过setter注入给目标对象,封装在目标对象的属性中。

b  构造器
原理 : 为目标对象提供一个构造方法,在构造方法中添加一个依赖对象对应的参数。ioc容器解析时,实例化目标对象时会自动调用构造方法,ioc只需要为构造器中的参数进行赋值;将ioc实例化的依赖对象作为构造器的参数传入。

【接口注入
原理 : 为依赖对象提供一个接口实现,将接口注入给目标对象,实现将接口的实现类注入的效果。比如HttpServletRequest  HttpServletResponse接口
注意:这是ioc提供的方式,spring中的ioc技术并没有实现该种注入方式】

c  方法注入
原理 : 在目标对象中定义一个普通的方法,将方法的返回值设置为需要注入的依赖对象类型。通过ioc容器调用该方法,将其创建的依赖对象作为方法的返回值返回给目标对象。


二、具体实现

三种方法在实现上主要是被注入类以及applicationContext.xml不同,具体写法包括参数配置如下: 
action:

package com.etoak.action;

import com.etoak.dao.UserDaoImpl;

public class LoginAction {
/*
* 1 setter注入   struts2表单项封装就是用了setter注入
*
private UserDaoImpl ud;

public void setUd(UserDaoImpl ud,String name) {
this.ud = ud;
}
*/
/*
* 2 构造器方式   构造器参数不固定,在xml中描述
private UserDaoImpl ud;
private String name;

public LoginAction(UserDaoImpl ud,String name){
this.ud = ud;
this.name = name;
}
*/
/*
* 3 方法注入:方法的返回值为要注入的对象类型
*/
public UserDaoImpl etoak(){
return null;
}
public void init(){
System.out.println("loginActoin初始化了");
}
public String execute() throws Exception{
etoak().login();
/*ud.login();
System.out.println("name---->"+name);*/
return "success";
}
}
applicationContext.xml:
<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-3.2.xsd" default-lazy-init="true">
<!--
default-lazy-init="true"
将bean对象初始化延迟到getBean(),而不是容器启动时自动初始化
-->

<!--
目的:使用spring的ioc技术管理LoginAction、UserDaoImpl
实现被动注入
被动注入前提:两个对象都需要交由ioc容器管理
init-method:在bean初始化时自动执行
property:setter方法注入
constructor-arg : 为当前调用的构造器赋值
index值为构造器第几个参数
ref: 表示赋值的类型为自定义的类型(引用)
value: 为String 、 基本数据类型、 class类型赋值
lookup-method  : 方法注入,bean值为要注入的对象, name为方法名
scope : singleton 单例
prototype 原型
request   ioc实例化的bean对象存储在request还是在session范围内,这两个取值仅在web环境下
session
-->
<bean id="action" class="com.etoak.action.LoginAction" init-method="init" lazy-init="true" scope="singleton">
<!-- <property name="ud" ref="dao"></property>  setter注入-->
<!-- <constructor-arg index="0" ref="dao"></constructor-arg> 构造器注入:有几个参数赋几个
<constructor-arg index="1" value="aaa"></constructor-arg>    -->
<lookup-method name="etoak" bean="dao"/> <!-- 方法注入 -->
</bean>  <!-- lazy-init单独这个bean延迟初始化 -->
<bean id="dao" class="com.etoak.dao.UserDaoImpl"></bean>
</beans>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: