依赖注入通常有如下两种方式:

①设值注入:IOC容器使用属性的Setter方法来注入被依赖的实例。

设值注入是指IOC容器使用属性的Setter方法来注入被依赖的实例。这种注入方式简单、直观,因而在Spring的依赖注入里大量使用。

②构造注入:IOC容器使用构造器来注入被依赖的实例。

构造注入在构造实例时,已经为其完成了依赖关系的初始化。这种利用构造器来设置依赖关系的方式,被称之为构造注入。

Spring推荐面向接口编程,可以更好的让规范和实现分离,从而提供更好的解耦。

对于一个JAVAEE应用,不管是DAO组件,还是业务逻辑组件,都应该先定义一个接口,该接口定义组件应该实现的功能,但是功能的实现则由其实现类提供。

EX:

定义一个java类:

package com.my.model;

public class User  implements Serializable {
/**
*
*/
private static final long serialVersionUID = -8149950197297816144L;
private int id;
private String u_name;
private String pwd; public User() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getU_name() {
return u_name;
}
public void setU_name(String u_name) {
this.u_name = u_name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
} }

定义2个接口:

package com.my.dao;
import com.my.model.User;
/**
* 用户管理Dao接口
*
* */
public interface IUserDao {
public void saveUser(User u);
}
package com.my.service;

import com.my.model.User;
/**
* 用户管理Service接口
*
* */
public interface IUserService {
public void saveUser(User u);
}
package com.my.service;

import com.lovo.model.User;
/**
* 用户管理Dao实现类
*
* */
public class UserDaoImpl implements IUserDao{
public void saveUser(User u){
//获取session,持久化对象
}
}
package com.my.service;

import com.my.model.User;
/**
* 用户管理Service实现类
*
* */
public class UserServiceImpl implements IUserDao{
private IUserDao userDaoImpl;
public void saveUser(User u){
UserDaoImpl.saveUser(u);
}
/**
*set注入
*/
public void setUserDaoImpl(IUserDao userDaoImpl){
this.userDaoImpl=userDaoImpl;
}
}

最后,我们在applicationContext.xml的<beans></beans>中分别配置2个JAVABEAN实例,并配置其关系管理。如:

<!--由Spring容器创建实例对象,并管理对象之间的关系   -->
<bean id="userDaoImpl" class="com.my.dao.impl.UserDaoImpl"></bean> <!--Spring不仅能注入普通属性,也可以注入关系,不再由调用者管理关系 -->
<bean id="userServiceImpl" class="com.my.dao.impl.UserServiceImpl">
<property name="userDaoImpl" ref="userDaoImpl"></property >
</bean>

在配置文件中,Spring配置Bean实例通常会指定2个属性:

Id:指定该Bean的唯一标识,程序通过ID属性值来访问该BEAN实例。

Class:指定该BEAN的实现类,此处不可再用接口,必须使用实现类,Spring容器会使用XML解析器读取该属性值,并利用反射来创建该实现类的实例。

得到SpringIOC容器的3个基本要点:

1、 应用程序的各组件面向接口编程。面向接口编程可以讲各组件之间的耦合提示到接口层次,从而有利于项目后期的发展。

2、 应用程序的各组件不再由程序主动产生,而是由Spring容器来负责产生、并初始化。

3、 Spring采用配置文件、或Annotation来管理Bean的实现类、依赖关系,Spring容器则根据配置文件、利用反射来创建实例,并为之注入依赖关系。

构造注入:

将上面方法中的Service实现类改为下面的方式:

package com.my.service;

import com.my.model.User;
/**
* 用户管理Service实现类
*
* */
public class UserServiceImpl implements IUserDao{
private IUserDao userDaoImpl;

//默认的构造器,如果要设置有参构造,需要先显示执行无参构造

public UserServiceImpl(){}

/**


* 构造注入所需的带参数的构造器

* @param UserDao

*/

public UserServiceImpl(IUserDao userDao){
this.userDaoImpl=userDao;
}
public void saveUser(User u){
userDaoImpl.saveUser(u);
} }

applicationContext.xml中添加配置为:

<!--由Spring容器创建实例对象,并管理对象之间的关系   -->
<bean id="userDaoImpl" class="com.my.dao.impl.UserDaoImpl"></bean> <!--使用构造注入,为 UserServiceImpl实例注入userDaoImpl实例 -->
<bean id="userServiceImpl" class="com.my.dao.impl.UserServiceImpl">
<constructor-arg ref="userDaoImpl"></constructor-arg>
</bean>

两种注入方式的对比:

Spring同时支持两种依赖注入方式:设置注入和构造注入。两种注入方式,并没有绝对的好坏之分,只是适应的场景有所不同。

相比之下,设置注入具有如下优点:

1、 与传统的JavaBean的写法更相识,程序开发人员更容易理解、接受、通过setter方式设定依赖关系显得更加直观、自然。

2、 对于复杂的依赖关系,如果采用构造注入,会导致构造器过于臃肿,难以阅读。Spring在创建Bean实例时,需要同时实例化其依赖的全部实例,因而导致性能下降。而使用设置注入,则可以避免。

3、 尤其是在某些属性可选的情况下,多参数的构造器更加笨重。

当然,构造注入也不是绝对不如设值注入,某些特定的场合,构造更适合。构造也有如下优点:

1、 构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入,常常需要依赖于Datasource的注入。采用构造注入,可以在代码中清晰地决定注入顺序。

2、 对于依赖关系无须变化的Bean,构造注入更有用处。因为没有setter方法,所有的依赖关系全部在构造器中设定,因此,无须担心后续的代码对依赖关系产生破坏。

3、 依赖关系只能在构造器中设定,则只有组件的创建者才能改变组件的依赖关系。对组件的调用者而言,组件内部的依赖关系完全透明,更符合高内聚的原则。

建议采用以设值注入为主,构造注入为辅的注入策略。对于依赖关系无须变化的注入,尽量采用构造注入;而其他的依赖关系的注入,则考虑采用设值注入。

Spring IOC 注入方式的更多相关文章

  1. Spring IOC 注入方式详解 附代码

    引言 Spring框架作为优秀的开源框架之一,深受各大Java开发者的追捧,相信对于大家来说并不陌生,Spring之所以这么流行,少不了他的两大核心技术IOC和IOP.我们这里重点讲述Spring框架 ...

  2. Spring 依赖注入方式详解

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

  3. Spring 依赖注入方式详解(四)

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

  4. 关于Spring的注入方式

      spring的三种注入方式: 接口注入(不推荐) getter,setter方式注入(比较常用) 构造器注入(死的应用) 关于getter和setter方式的注入: autowire=" ...

  5. Spring bean注入方式

    版权声明:本文为博主原创文章,如需转载请标注转载地址. 博客地址:http://www.cnblogs.com/caoyc/p/5619525.html  Spring bean提供了3中注入方式:属 ...

  6. Spring IOC 实现方式

    Spring 中的 org.springframework.beans 包和 org.springframework.context 包构成了 Spring 框架 IoC 容器的基础. BeanFac ...

  7. Spring学习总结(5)——IOC注入方式总结

    一.构造注入 在类被实例化的时候,它的构造方法被调用并且只能调用一次.所以它被用于类的初始化操作.<constructor-arg>是<bean>标签的子标签.通过其<v ...

  8. spring IOC注解方式详解

    本文分为三个部分:概述.使用注解进行属性注入.使用注解进行Bean的自动定义. 一,概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以 ...

  9. Ioc注入方式写dubbo client(非set beans)

    @Autowired注解的方式注解 Spring框架中进行注入式,使用@Autowired. @Autowired可以对成员变量.方法和构造函数进行标注,来完成自动装配的工作,这里必须明确:@Auto ...

随机推荐

  1. java多线程的几种实现方式记录

    传统的实现线程的方式为三种,分别为继承Thread类,重写run()方法:实现Runable接口,重写run()方法:实现callable接口,重写call()方法:下面来记录一下最基本的三种编码实现 ...

  2. JavaScript的eval函数

    eval() 函数可将字符串转换为代码执行,并返回一个或多个值 函数原型为: 返回值 = eval( codeString ) 函数说明: 如果eval函数在执行时遇到错误,则抛出异常给调用者. 类似 ...

  3. Oracle游标--cursor_01-简单不带参数实现功能

    对于游标这个概念,可以理解为类似我们以前学习的jdbc的结果集对象, 我们可以使用游标对结果集从上到下进行遍历,获取每一行内容 首先我们要分析一下游标的分类 带参数的 书写函数的整体架构 定义游标 开 ...

  4. Appium学习路—脚本篇(启动app)

    启动之前的准备   1.脚本执行前,需要先启动appium的server端, 启动server方法: 打开appium客户端,点击右上角的Launch     2.iOS的测试只能在mac本上做   ...

  5. CRC16 三种算法及c实现

    标准CRC生成多项式如下表: 名称                     生成多项式                           简记式*                 标准引用   CR ...

  6. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  7. Mac OS X的空间去哪儿了

    记得有事儿没事儿看下,/cores/目录的大小. cores目录是存放程序dump的数据,对于绝大部分人时是没有用的.可以删除.如果遇到坑爹的程序,一直生成dump文件,硬盘瞬间就爆满了. 典型:An ...

  8. sdk添加新的C文件编译出错

    make: *** 没有规则可以创建"test.elf"需要的目标"mike.c.o". 停止. 解决方法: 重新建立工程并且编译文件

  9. tunning-Instruments and Flame Graphs

    On mac os, programs may need Instruments to tuning, and when you face too many probe messages, you'l ...

  10. eclipse项目自动发布到tomcat目录,缺文件。

    eclipse项目自动发布到tomcat目录,缺文件. 解决方案: 项目--Properties-->Deployment Assembly-->Add--> Folder Add- ...