`

Spring源码解析-spring ioc容器

 
阅读更多

很多人一提ioc,便张口就来:控制反转。究竟哪些方面被反转了呢?答案是依赖对象的获得被反转了。很多时候,我们通过多个对象之间的协作来完成一个功能,如果获取所依赖对象靠自身来实现,这将导致代码的耦合度高和难以测试。当然,控制反转还有一个好听的名字:依赖注入。

IOC(Inverse of Control):

在每个框架的中都有一个容器的概念,所谓的容器就是将常用的服务,封装起来,然后,用户只需要遵循一定的规则,就可以达到统一、灵活、安全、方便、快速的目的。

IOC是一个依赖注入DI(Dependence Injection)的方式达到控制反转目的的框架。

控制反转:的优势在于将服务交给容器。

我们对比一下由我们的应用程序负责服务(对象)定位:

public class UserManagerImpl implements UserManager {  
   public void addUser(String username, String password) {  
   //由我们的应用程序负责服务(对象)定位  
   //UserDao userDao = new UserDao4MySqlImpl();  
   UserDao userDao = new UserDao4OracleImpl();  
   userDao.addUser(username, password);   
   }  
}  

 

public class UserManagerImpl implements UserManager {     
    private UserDao userDao;      
    public void addUser(String username, String password) {  
        userDao.addUser(username, password);  
    }  
    public void setUserDao(UserDao userDao) {  
        this.userDao = userDao;  
    }  
}  

 在spring ioc中有三种依赖注入,分别是:

  • a、接口注入;
  • b、setter方法注入;
  • c、构造方法注入;

 setter方法注入

setter注入模式在实际开发中有非常广泛的应用,setter方法更加直观,我们来看一下spring的配置文件

 

<?xml version="1.0" encoding="UTF-8"?>    
<beans xmlns="http://www.springframework.org/schema/beans"    
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
         xmlns:aop="http://www.springframework.org/schema/aop"    
         xmlns:tx="http://www.springframework.org/schema/tx"    
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd    
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd    
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">    
    
    <!-- 使用spring管理对象的创建,还有对象的依赖关系 -->    
    <bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/>    
    
    <bean id="userDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/>    
        
    <bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">    
        <!-- (1)userManager使用了userDao,Ioc是自动创建相应的UserDao实现,都是由容器管理-->    
        <!-- (2)在UserManager中提供构造函数,让spring将UserDao实现注入(DI)过来 -->    
        <!-- (3)让spring管理我们对象的创建和依赖关系,必须将依赖关系配置到spring的核心配置文件中 -->    
    
        <property name="userDao" ref="userDao4Oracle"></property>    
    </bean>    
        
</beans>  

 

接着我们来看一下,setter表示依赖关系的写法

public class UserManagerImpl implements UserManager{      
    private UserDao userDao;    
    //使用设值方式赋值    
    public void setUserDao(UserDao userDao) {    
        this.userDao = userDao;    
    }         
    @Override    
    public void addUser(String userName, String password) {    
        userDao.addUser(userName, password);    
    }    
}    

 构造器注入

 

构造器注入,即通过构造函数完成依赖关系的设定。我们看一下spring的配置文件:

 

<?xml version="1.0" encoding="UTF-8"?>    
    <beans xmlns="http://www.springframework.org/schema/beans"    
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
             xmlns:aop="http://www.springframework.org/schema/aop"    
             xmlns:tx="http://www.springframework.org/schema/tx"    
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd    
               http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd    
               http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">    
        
        <!-- 使用spring管理对象的创建,还有对象的依赖关系 -->    
        <bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/>    
        
        <bean id="userDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/>    
            
        <bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">    
            <!-- (1)userManager使用了userDao,Ioc是自动创建相应的UserDao实现,都是由容器管理-->    
            <!-- (2)在UserManager中提供构造函数,让spring将UserDao实现注入(DI)过来 -->    
            <!-- (3)让spring管理我们对象的创建和依赖关系,必须将依赖关系配置到spring的核心配置文件中 -->    
        
            <constructor-arg ref="userDao4Oracle"/>    
        </bean>    
            
    </beans>    

 我们再来看一下,构造器表示依赖关系的写法,代码如下所示:

 public class UserManagerImpl implements UserManager{    
        
        private UserDao userDao;    
        
        //使用构造方式赋值    
        public UserManagerImpl(UserDao userDao) {    
            this.userDao = userDao;    
        }    
        
        @Override    
        public void addUser(String userName, String password) {    
        
            userDao.addUser(userName, password);    
        }    
    }    

 

  spring ioc通过引入xml配置,由ioc容器来管理对象的生命周期,依赖关系等。

             
 

它的加载过程是什么样的呢?

         
 

         BeanDefinition是一个接口,用于属性承载,比如<bean>元素标签拥有class、scope、lazy-init等配置。bean的定义方式有千千万万种,无论是何种标签,无论是何种资源定义,无论是何种容器,只要按照spring的规范编写xml配置文件,最终的bean定义内部表示都将转换为内部的唯一结构:BeanDefinition。当BeanDefinition注册完毕以后,spring的BeanFactory就可以随时根据需要进行实例化了。

  • 大小: 6.7 KB
  • 大小: 25.1 KB
分享到:
评论

相关推荐

    spring-security-web源码所需jar包

    《Spring Security Web源码解析与相关依赖》 Spring Security Web是Spring Security框架的重要组成部分,它主要负责Web应用程序的安全性,包括认证和授权等核心功能。本文将深入探讨Spring Security Web的源码,并...

    官方原版源码spring-framework-5.1.4.RELEASE.zip

    《Spring Framework 5.1.4源码深度解析》 Spring Framework是Java开发中的核心框架,它为构建高质量的企业级应用提供了全面的支持。5.1.4版本是Spring的重要里程碑,引入了诸多新特性和改进,旨在提升性能、增强可...

    spring源码spring-framework-4.3.2.RELEASE

    1. **IoC(Inversion of Control)容器**:Spring的核心在于IoC容器,它负责管理对象的生命周期和依赖关系。在源码中,`BeanFactory`是IoC的基础接口,而`ApplicationContext`则提供了更高级的应用上下文功能。通过...

    spring-framework-master

    例如,Spring的事件驱动模型、AOP的实现原理、以及IoC容器的内部工作流程等。此外,源码还展示了Spring如何与其他技术(如JDBC、JMS、EJB等)无缝集成,以及如何利用注解简化配置。 通过阅读和分析"spring-...

    Spring源码解析4章150页+Spring3.2.4中文注释源码

    一阶段 1、Spring概述 2、一切从bean开始 3、俯瞰Spring架构设计 4、Spring源码下载 二阶段 1、什么是IOC/DI 2、SpringIOC体系结构 3、源码分析-IOC容器的初始化 ...Spring事务源码解析 需要其他源码请私信我

    官方原版源码spring-framework-5.2.3.RELEASE.zip

    深入学习Spring源码,不仅能够帮助我们理解其工作原理,还能提升我们在实际项目中的问题排查能力。例如,当我们遇到Spring的依赖注入问题时,可以通过查看`BeanFactory`和`ApplicationContext`的相关源码来定位问题...

    spring源码解读-地址.txt

    根据提供的文件信息,本次解读将围绕Spring框架的核心概念与源码分析进行展开。Spring框架作为Java企业级开发中不可或缺的一部分,其源码的学习对于深入...希望以上内容能够为大家学习Spring源码提供一定的参考和帮助。

    Spring源码分析_Spring_IOC

    ### Spring源码分析_Spring_IOC:深入理解Spring的IOC容器机制 #### 基本概念与核心作用 在探讨Spring框架的核心组件之一——IOC(Inversion of Control,控制反转)容器之前,首先需要理解它在Spring框架中的角色...

    官方源码spring-framework-5.0.15.RELEASE.zip

    1. IoC容器:Spring的核心在于IoC容器,它负责管理对象的生命周期和依赖关系。在源码中,我们可以看到`org.springframework.beans`和`org.springframework.context`包,它们是IoC容器的基础,通过BeanFactory和...

    官方原版源码 spring-framework-5.1.15.RELEASE.zip

    Spring Core负责基础的IoC(Inversion of Control)容器,Spring Beans则实现了Bean的生命周期管理和配置,Spring Context则是基于Core之上构建的,提供了一个应用上下文,可以管理Bean并与其他Spring模块集成。...

    官方原版源码spring-framework-5.1.13.RELEASE.zip

    《深入剖析Spring Framework 5.1.13.RELEASE源码》 Spring Framework作为Java开发领域中的核心框架,以其强大的功能和灵活性深受开发者喜爱。官方原版源码spring-framework-5.1.13.RELEASE.zip为我们提供了深入了解...

    Spring源码解析.zip

    《Spring源码解析》 Spring框架作为Java领域最流行的开源框架之一,它的设计思想和实现原理一直是许多开发者深入研究的重点。本压缩包“Spring源码解析”提供了对Spring框架核心组件——IOC(Inversion of Control...

    Spring源码解析.pdf

    ### Spring源码解析知识点 #### 一、Spring IoC 容器详解 ##### 1. BeanFactory —— 最基础的IoC容器 - **概念**:`BeanFactory` 是Spring框架中最基本的IoC容器,它负责管理Bean的生命周期,包括创建、配置和...

    spring-framework-1.0-m1.zip源码

    《Spring框架1.0源码解析》 Spring框架,作为Java企业级应用开发的重要支柱,自2003年发布以来,已经历了多个版本的迭代,为开发者提供了丰富的功能和强大的支持。本文将深入探讨Spring 1.0源码,帮助读者理解其...

    官方源码 spring-framework-5.3.3.zip

    Spring的IoC容器是其核心功能之一,通过XML或注解配置,它可以管理对象的生命周期和依赖关系。在源码中,`BeanFactory`和`ApplicationContext`接口定义了容器的基本操作,如`getBean`、`refresh`等。`...

    Spring的IoC容器初始化源码解析

    ### Spring的IoC容器初始化源码解析 #### 一、Spring框架的核心——IoC容器 Spring框架是一个开源的轻量级Java开发框架,其核心功能是IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented ...

    Spring源码分析.pdf

    IOC容器是 Spring 框架的核心组件之一,它提供了一个统一的方式来管理应用程序中的对象。IOC 容器的主要功能是将对象的创建、管理和依赖关系解耦,使得应用程序更加灵活、可维护和可扩展。 在 Spring 中,IOC 容器...

    spring-framework-5.2.0.RELEASE-master.zip

    Spring的IOC容器是其核心组件,它负责管理对象的生命周期和对象之间的依赖关系。IOC使得开发者不再手动创建和管理对象,而是将这些工作交给容器处理,降低了耦合度,提高了代码的可测试性和可维护性。在源码中,`org...

    Spring源码深度解析第二版

    Spring源码深度解析第二版 Spring是一款广泛应用于Java企业级应用程序的开源框架,旨在简化Java应用程序的开发和部署。Spring框架的核心主要包括了IoC容器、AOP、MVC框架等模块。 第1章 Spring整体架构和环境搭建 ...

    官方原版源码spring-framework-5.2.1.RELEASE.zip

    IoC容器是Spring的核心,它负责管理对象的生命周期和依赖关系。AOP则为应用程序提供了一种模块化和解耦的方式,可以方便地实现横切关注点,如日志、事务管理等。 在Spring 5.2.1中,源码的改进主要集中在以下几个...

Global site tag (gtag.js) - Google Analytics