深入解析spring的IOC和DI

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">在此之前先说一下没有</span><span style="font-family: 'Times New Roman'; background-color: rgb(255, 255, 255);">spring</span><span style="font-family: 宋体; background-color: rgb(255, 255, 255);">的时候,对象直接的合作是如果工作的,比如</span><span style="font-family: 'Times New Roman'; background-color: rgb(255, 255, 255);">A</span><span style="font-family: 宋体; background-color: rgb(255, 255, 255);">类要调用</span><span style="font-family: 'Times New Roman'; background-color: rgb(255, 255, 255);">B</span><span style="font-family: 宋体; background-color: rgb(255, 255, 255);">类的方法,首先在</span><span style="font-family: 'Times New Roman'; background-color: rgb(255, 255, 255);">A</span><span style="font-family: 宋体; background-color: rgb(255, 255, 255);">类中肯定需要创建一个</span><span style="font-family: 'Times New Roman'; background-color: rgb(255, 255, 255);">B</span><span style="font-family: 宋体; background-color: rgb(255, 255, 255);">对象,然后通过</span><span style="font-family: 'Times New Roman'; background-color: rgb(255, 255, 255);">B</span><span style="font-family: 宋体; background-color: rgb(255, 255, 255);">对象的实例去调用</span><span style="font-family: 'Times New Roman'; background-color: rgb(255, 255, 255);">A</span><span style="font-family: 宋体; background-color: rgb(255, 255, 255);">方法的实例方法,如是静态方法可以直接通过类名去调用即可。这样做的缺点,通过</span><span style="font-family: 'Times New Roman'; background-color: rgb(255, 255, 255);">new</span><span style="font-family: 宋体; background-color: rgb(255, 255, 255);">对象的的方式去创建对象,第一相互之间的依赖性太大,同一个对象多次创建,用完以后需要销毁,效率低下,这样的方式总体就是,对象之间的耦合度高,效率低</span><span style="font-family: 'Times New Roman'; background-color: rgb(255, 255, 255);">(</span><span style="font-family: 宋体; background-color: rgb(255, 255, 255);">每次都需要创建和销毁对象</span><span style="font-family: 'Times New Roman'; background-color: rgb(255, 255, 255);">)</span>

Spring的出现就是为了解决这些问题的,在次之前也有过类似这样的框架,那就是EJB (Enterprise JavaBean),根据业务需求定义不同类型的bean,但是这种方式及其繁琐,而且很难理解和学习,spring的出现基本完全替代了EJB,spring注意有两大块,一个是IOC和DI(反转控制依赖注入),还有就是aop面向切面编程),这里重点讲解spring的IOC和DI

Spring IOC就是反转控制,由spring去生成对象,不再有对象需要的时候去创建和销毁,由spring去控制对象的生命周期,把对呀的一切都交个spring来管理,这就是反转控制。那么依赖注入又是怎么回事呢,通过研究发现其实spring是把对象的创建的整个过程反转了,那对象创建的过程肯定就包含了他对象的属性,比如创建A对象的时候,A对象需要调用B对象的某个实例方法,那就必须在创建的时候把B对象注入给A对象,这样A对象才算是一个我们想要的对象,其实吧B对象注入给A对象的过程就是依赖注入,说到底就是为了创建一个完整的A对象,而需要给A对象的某个属性(B对象的实例)赋值,那么推而广之,所有的对象都是由spring来创建,都有spring来管理,都有spring来注入,这就是spring的ioc的最基本的思想,

实例解析spring的依赖注入。就比如现在一个请求发送到controller,controller需要调用service对象的方法,而service又需要调用dao的方法,那么其实在创建controller对象的时候就应该吧service对象注入个action,但是service对象创建的时候又需要把dao对象注入给service,所以当请求到了controller我们就直接能得到数据和操作数据库的数据,而不用管底层是怎么样实现的,底层dao操作数据库是通过jdbc还是hibernate 还是mybatis都没关心,包括操作数据库对象的一些对象比如Connection对象是何时创建何时销毁,我们都不需要关心,这一点是完全没有违背oop思想的。

注入的实现,那既然A对需要得到B对象的实例,那在A对象肯定是需要一个B类型的属性作为B对象的实例载体,然后才能把B对象注入给A对象的这个B对象的载体的属性,那注入分为配置文件的注入和注解注入,在spring2.x和之前更早的版本只能通过配置文件的方式注入在之后才支持注解的注入,首先讲解配置文件方式的注入,这也更能体现依赖注入的原理,比如我现在定义一个UserService和一个UserDao,现在要把dao注入给service,那首先要早UserService中第一个一个用于接受UserDao的属性,因为通过配置注入,所以该属性必须对外提供set方法,然后在配置文件通过该方法注入dao对象,注意属性名一定是service的属性名称,同时也要求service中的属性和对应的set方法必须按照标准的属性来命名。属性值必须是spring已经存在的对象,不能是没有交给spring管理的类。

扩展一点,其实不仅仅可以注入对象属性,一般的简单属性也是可以注入的额,比如注入一个Integer,List也可以注入的,简单属性的注入通过value注入,复杂属性(对象属性)通过ref注入。

代码实现:

xml配置
<!-- userDao -->
	<bean id="userDao" class="cn.dome.dao.UserDao" />

	<!-- userService -->
	<bean id="userService" class="cn.dome.service.UserService">
	<!-- 对象注入 -->
		<property name="userDao" ref="userDao"></property>
		<!-- 字符串属性注入 -->
		<property name="userName" value="张三"></property>
	<!-- 简单属性注入 -->
		<property name="age" value="23"></property>
	<p
	</bean>
UserService
package cn.dome.service;

import cn.dome.service.UserDao;

public class UserService {
    //UserDao对象
    private UserDao userDao;
    //姓名(属性)
    private String userName;
    //年龄(属性)
    private Integer age;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public void delete(Integer id){
        userDao.delete(id);
    }
}
</pre><pre name="code" class="html">UserDao代码
package cn.dome.dao;
public class UserDao {
    public void delete(Integer id) {
    }
}

注解注入,注解注入是spring2.0之后才有的注入方式,好处是不需要写繁琐的配置文件,公共组件注解,就能把一个普通的类交给spring管理,又spring生成和分配,然后通过注入注解就能把一个指定的对象注入给该对象的某个属性,注解注入的方式有通过名称注入,通过名称注入,必须要求组件注解上给出对应的名称,才能通过名称注入,第二种是通过类型注入,只需要类型匹配就可以注入,但是如果通过接口应用实现类,如果接口有多个实现类,通过类型注入则会报错,第三种是通过类型和名称的混合注入,这样可以通过接口去应用实现类,但实现类必须有名称,注解可以减少繁琐的xml配置的编写,只需要开启注解驱动即可

xml配置
	<!-- 开启注解扫面 -->
	<context:component-scan base-package="cn.dome" />
</pre><p></p><span style="font-family:宋体"></span><pre name="code" class="html">UserDao代码
package cn.dome.dao;

import org.springframework.stereotype.Component;

@Component
public class UserDao {
    public void delete(Integer id) {
    }
}
</pre><pre name="code" class="html">UserService代码
package cn.dome.<span style="font-family: 宋体;">service</span><span style="font-family: 宋体;">;</span>

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cn.dome.service.UserDao;

@Service
public class UserService {
    @Autowired
    private UserDao userDao;
    public void delete(Integer id){
        userDao.delete(id);
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-29 06:42:23

深入解析spring的IOC和DI的相关文章

对Spring中IOC和DI的理解

前几篇讲了Spring中IOC和DI的用法,本篇应该放到三篇之前,但一直没有想到好的讲解方式,后参考https://blog.csdn.net/luoyepiaoxue2014/article/details/72426666博客,对其中涉及到的进行了简单的总结. 在学习Spring的过程中,总会涉及到两个概念---IOC和DI,即控制反转和依赖注入,而对这两个概念的理解也总是含糊不清的,下面就对自己的理解进行总结. 首先是IOC,即控制反转,需要理解的是:怎么控制?谁控制了什么?怎么反转?既然

JavaWeb_(Spring框架)Spring中IoC与DI概念入门

Spring是于2003 年兴起的一个轻量级的Java 开源框架,它由Rod Johnson创建.传统J2EE应用的开发效率低,Spring作为开源的中间件,提供J2EE应用的各层的解决方案,Spring贯穿了表现层.业务层及持久层,而不是仅仅专注于某一层的方案.可以说Spring是企业应用开发的“一站式(full-stack)”选择.然而,Spring并不想取代那些已有的框架,而是与它们无缝地整合. 简单来说,Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架. Spri

Spring 之 IOC ,DI 理论

本文是依照极客学院java<Spring之IOC>章节学习的心得.随笔记录 浅谈IOC:(Inversion of Control, 控制反转) Spring 核心容器,贯穿始终.所谓IOC,对Spring框架来说,就是由Spring来负责控制对象的生命周期和对象间的关系: 1. 传统开发模式:对象之间互相依赖 2. IOC开发模式:IOC容器安排对象之间的依赖(中间加入一个管理控制中介) IOC理论的背景: 图一为传统设计对象相互引用的模式,所有的对象同过相互之间的合作实现系统的逻辑,相互耦

Spring中IOC与DI的的区别

依赖注入的前提: 有IOC的环境,也就是将必须对象的创建权交给了Spring. DI 介绍 Dependency Injection 依赖注入.需要有IOC 的环境,Spring 创建这个类的过程中,Spring 将类的依赖的属性设置进去. IOC与DI的的区别: IOC:  控制反转,将类的对象的创建交给Spring类管理创建. DI:    依赖注入,将类里面的属性在创建类的过程中给属性赋值. DI和IOC的关系: DI不能单独存在,DI需要在IOC的基础上来完成. 这样做得好处:做到了单一

Spring的Ioc与DI

一.前言 Spring框架的核心基于控制反转的原理. IoC是一种将组件依赖关系的创建和管理外部化的技术. 考虑一个示例,其中Foo类依赖于Bar类的实例来执行某种处理. 传统上,Foo使用new运算符创建Bar的实例,或者从某种工厂类中获取一个实例. 使用IoC方法,运行时某些外部进程会将Bar的实例(或子类)提供给Foo. 这种行为,即在运行时注入依赖项,导致IoC被Martin Fowler重命名为更具描述性的依赖项注入(DI).依赖注入是IoC的一种特殊形式,尽管您经常会发现这两个术语可

spring的ioc,di,mvc 的简单逻辑(根据网课和百度)

为了提升自己的技术所以没事自己通过百度和找资料来学习了一下spring的思想所以就记录一下 这个是比较简单的一种,有点乱.我按照自己的理解写的有注释,但是不知道是不是都是正确,如果有错误希望批评指正谢谢. 总结: 1:首先要了解spring的整体: 主要作用就是ioc di mvc 和 aop ,所以要从这几个方面去入手. 想要指导思想就要从头开始,所以就总结了一下整个流程,如下: 一:首先要配置spring 1:配置web.xml中的DispatcherServlet 2:设定 init-pa

Spring框架IOC,DI概念理解

1.什么是框架? 框架是一种重复使用的解决方案,针对某个软件开发的问题提出的. Spring框架,它是一个大型的包含很多重复使用的某个领域的解决方案. Spring的理念:不要重复发明轮子. 2.Spring的理解? 首先,Spring是一个容器.它是装对象的.主要就是通过搜索class的路径.找出bean对象,实际就是根据反射来获取这个bean对象的: Class<?> classit=Class.forName("com.jinglin.model.Person");

对Spring的IoC和DI最生动的解释

首先想说说IoC(Inversion of Control,控制倒转).这是spring的核心,贯穿始终.所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好.qq号.电话号.ip号.iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节.传统的程序开发也是如此,在

Spring初探(IOC,AOP,DI)

Spring的引出: 问题1:依赖配置信息... class UserDaoImpl implements UserDao { //数据库连接信息,需要一些配置,但是又不能写在这个类中(硬编码,改的时候麻烦) private String jdbcUrl = "..."; private String driverClass; private String username; private String password; // ... } 把这些配置信息放在外部的一个配置文件中: