spring的DI.IoC是什么

最近要搞spring的单元测试,不得已啊啊啊啊啊啊啊啊啊又要开始搞spring……

日目晶……

搞这几个概念,先甩一部分代码:

UserDao 接口

package com.itheima.ioc;
public interface UserDao {
	public void say();
}

 

该接口实现类UserDaoImpl

package com.itheima.ioc;
public class UserDaoImpl implements UserDao {
	@Override
	public void say() {
		// TODO Auto-generated method stub
		System.out.println("userDao say hello world");
	}
}

 

  • 控制反转的概念

在一般的设计中,如果要调用UserDaoImpl的say()方法,就要new一个UserDaoImpl类出来,比如以下的方法:

……
UserDaoImpl userDao = new UserDaoImpl();
userDao.say();
……  

在spring中呢,有个概念叫IoC(Inversion  of Control 即控制反转),它通过框架设定,可以通过配置文件,在spring的容器(可以理解为一个装满了对象的瓶子)中取一个现成的UserDaoImpl的实例出来,而不需要new一个。

具体做法:

编辑applicationContext.xml,添加一个userDao的bean(可以理解为一个类,添加之后,spring容器中就有这个类的对象)

<?xml version="1.0" encoding="UTF-8"?>
<beans ……>
	<!-- 添加UserDaoImpl实例,id=userDao -->
	<bean id = "userDao" class = "com.itheima.ioc.UserDaoImpl"/>
</beans>

  

调用userDaoImpl的say()方法代码如下:

package com.itheima.ioc;
/**
 * 通过Spring容器来获取实现类对象
 * 而不是通过new
 */
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIoc {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext applicationContext =
				new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao userDao = (UserDao) applicationContext.getBean("userDao");
		userDao.say();
	}
}

  

  • 依赖注入的概念

UserService代码:

package com.itheima.ioc;
public interface UserService {
	public void say();
}

 

UserServiceImpl 实现类:

这里的实现类中,我们要重写say()方法,say()方法有一个现成的UserDaoImpl方法,我们直接拿过来用,一般是这么写的:

public class UserServiceImpl implements UserService {
	UserDao userDao=new UserDaoImpl();
	public void setUserDao(UserDao userDao){
		this.userDao= userDao;
	}
	@Override
	public void say() {
		// TODO Auto-generated method stub
		this.userDao.say();
		System.out.println("userService say hello world~");
	}
}

 

这么写没问题,不过spring容器里面有个现成的UserDaoImpl,还new一个,很浪费,直接拿过来用会更方便。

这个直接拿过来用的搞法,叫DI(Dependency Injection ,即依赖注入)。

依赖注入有两种做法,一个是setter,一个是构造方法,这里只给setter的方法,构造方法的我看的书上还没讲,不想动。

做法如下:

改写UserServiceImpl,把new变成私有属性

public class UserServiceImpl implements UserService {
	//声明UserDao属性
	private UserDao userDao ;

	public void setUserDao(UserDao userDao){
		this.userDao= userDao;
	}
	@Override
	public void say() {
		// TODO Auto-generated method stub
		this.userDao.say();
		System.out.println("userService say hello world~");
	}
}

  

编写配置文件,把userDao Bean添加到userService下面:

<beans xmlns="……">
	<bean id = "userDao" class = "com.itheima.ioc.UserDaoImpl"/>
	<bean id = "userService" class = "com.itheima.ioc.UserServiceImpl">
	<!-- 将id=userDao的实例注入到userSericeImpl -->
		<property name="userDao" ref = "userDao"/>
	</bean>
</beans>

  

 

 

原文地址:https://www.cnblogs.com/zhizhiyin/p/10669635.html

时间: 2024-10-11 07:56:57

spring的DI.IoC是什么的相关文章

小叙Spring.NET(Ioc与DI)的使用步骤

那今天就介绍一下我理解的Spring.net吧.介绍Spring.NET之前,先谈点其他的.我们都知道,.NET有一个基本原则"高内聚,低耦合".关于这个概念,想必大家都知道.所谓高内聚,也就是模块内部内聚,各个模块之间"低耦合".也就是结耦,降低耦合度.所以我们选取了传统的三层,把,数据访问层,业务逻辑层,UI层分离,降低耦合度!       但是这还不够,我们为了让业务逻辑层与数据访问层彻底结耦.可以用面向接口编程的思想,采用抽象工厂模式.也就是建立工厂,采用映

Helloworld之Spring依赖注入/控制反转(DI/IoC)版

Helloworld之Spring依赖注入/控制反转(DI/IoC)版 作者:雨水, 日期:2014-10-29 摘要:本文主要用于培训初学者理解Spring中的依赖注入的基本概念. 先介绍依赖注入的基本概念,然后以构造器注入为例实现了Helloworld实例. Spring依赖注入/控制反转 在我们通常的编程中,如果类A要依赖类B,通常是由A来创建一个B的实例.而Spring将创建B的实例的工作交给Spring容器来完成,然后注入A,因此称为依赖注入(DI, Dependency Inject

用IDEA详解Spring中的IoC和DI(挺透彻的,点进来看看吧)

用IDEA详解Spring中的IoC和DI 一.Spring IoC的基本概念 控制反转(IoC)是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心.依赖注入(DI)是IoC的另外一种说法,只是从不同的角度描述相同的概念.看完这两句,是不是不但没懂,反而更迷惑了,别急,往下看: IoC的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 如果我们打开机械式手表的后盖,就会看到与

理解Spring中的IoC和DI

什么是IoC和DI IoC(Inversion of Control 控制反转):是一种面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度.其基本思想是:借助于"第三方"实现具有依赖关系的对象之间的解耦. DI(Dependence Injection 依赖注入):将实例变量传入到一个对象中去(Dependency injection means giving an object its instance variables). 控制反转是一种思想 依赖注入是一种设计模式 I

Spring入门和IOC

本节要点: Spring简介 Spring特点 Spring框架组成 IOC和DI概念 项目中如何引入Spring框架 1 spring简介  spring:春天,寓意给软件行业带来了春天,由Rod Johnson提出 提出目的:解决企业应用开发的复杂性. 作用范围:任何Java应用 . 提出理念:使现有的技术更加实用,不去重复造轮子,让现有的框架运用更加合理.Struts和hibernate没有任何联系,所有spring最初的目的就是联系struts和hibernate,让他们运用的更好,本身

Spring框架[一]——spring概念和ioc入门(ioc操作xml配置文件)

Spring概念 spring是开源的轻量级框架(即不需要依赖其他东西,可用直接使用) spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码来实现: ioc:控制反转,比如:有一个类,在类中有个方法(非静态的方法),要调用类中的这个方法,则需要创建类的对象,使用对象调用方法.创建类对象的过程,需要new出来对象:而ioc则是将对象的创建不是通过new方式实现,而是交给spring配置来创建对象(即,将对象的创建交给spring来管理): spring是一站式框架 spring

spring的优点 ioc aop

spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring属于低侵入式设计,代码的污染极低 8.独立于各种应用服务器 9.spring的DI机制降低了业务对象替换的复

Spring核心技术之IOC容器(一):IOC容器与Bean简介

最近开始研究Spring框架,今天学习Spring的核心内容IOC 与 Bean 1. Spring IOC 与 Bean 简介  Inversion of Control (IoC)即控制反转,也叫dependency injection (DI)依赖注入,Spring实现了一个基于配置文件的复杂工厂模式来提供实现控制反转. org.springframework.beans 和org.springframework.context包是Spring中实现IOC的基础包,其中BeanFactor

java server之spring中的IOC如何用java实现?

** 什么是IOC? 一般的对象耦合是在编译时确定的,也就是说当我们写如下类: public class StaticCoupling { String s = new String("hzg1981"); } 的时候,类StaticCoupling在编译期间就跟String类耦合在了一起. 在代码静态分析时,就可以确认它们之间的耦合. 而IOC 则是在运行期间才使用assembler object绑定需要耦合的对象.绑定过程是由依赖注入(DI)实现的.需要注意的是IOC和DI是有区别