1 IoCDI

IoCInversion of Control的简称,也就是控制反转。通常来说,创建对象需要调用者手动创建,也就是new XXX()的方式。当Spring框架出现后,对象的实例不再由调用者创建,而是由Spring容器创建,这样控制权就由调用者转移到Spring容器,控制权发生了反转,这就是Spring的控制反转。从Spring容器来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例,这就是Spring的依赖注入(Dependency InjectionDI)。

一句话总结:

  • IoC:控制权由调用者交由Spring容器,控制发生了反转
  • DI:由Spring容器注入需要的值到对象中

2 Spring IoC容器

Spring中实现IoC的是Spring IoC容器,主要基于以下两个接口:

  • BeanFactory
  • ApplicationContext

2.1 BeanFactory

位于org.springframework.beans.factory下,提供了完整的IoC服务支持,是一个管理Bean工厂,主要负责初始化各种Bean。可以通过XmlBeanFactory来获取XML文件中的Bean并进行装配,例子如下:

BeanFactory factory = new XmlBeanFactory(new FileSystemResource("/xxx/xxx/xxx/xxx/applicationContext.xml"));
TestInterface test = (TestInterface)factory.getBean("test");
test.hello();

需要使用绝对路径,而且,该方法已经过时了:

因此不推荐使用。

2.2 ApplicationContext

ApplicationContextBeanFactory的子接口,也称为应用上下文,除了包含BeanFactory的功能外还添加了国际化、资源访问、事件传播等的支持,创建ApplicationContext的实例有以下三种方法:

  • ClassPathXmlApplicationContext
  • FileSystemXmlApplicationContext
  • Web服务器实例化

2.2.1 ClassPathXmlApplicationContext

该类从resources下寻找指定的XML文件:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
TestInterface test = (TestInterface)context.getBean("test");
test.hello();

2.2.2 FileSystemXmlApplicationContext

该类读取配置文件需要加上前缀:

  • classpath::该前缀表示从类路径读取,对于Maven项目来说就是resources
  • file::该前缀表示从绝对路径获取

例子:

ApplicationContext context = new FileSystemXmlApplicationContext("classpath:applicationContext.xml");
//ApplicationContext context = new FileSystemXmlApplicationContext("file:/xxx/xxx/xxx/xxxx/xxx/applicationContext.xml");

2.2.3 Web服务器实例化

一般使用基于ContextLoaderListener的实现方式,修改web.xml,添加如下代码:

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
</context-param>

3 DI的两种方法

DI通常有两种实现方式:

  • 构造方法注入
  • setter注入

下面分别来看一下。

3.1 构造方法注入

Spring可以利用反射机制通过构造方法完成注入,比如有以下三个类:

public interface TestInterface {
void hello();
} public class TestA implements TestInterface {
@Override
public void hello() {
System.out.println("Test A");
}
} public class TestB {
private TestInterface test; public TestB(TestInterface test)
{
this.test = test;
} public void method()
{
test.hello();
}
}

TestInterface是一个简单的接口,而TestA实现了该接口,TestB需要一个TestInterface类型的对象,因此可以先注入一个TestA,再将该TestA注入到TestB的构造方法中:

<bean id="testA" class="TestA"/> <!--注入一个TestA对象-->
<bean id="testB" class="TestB">
<constructor-arg index="0" ref="testA" /> <!--将上面注入的TestA作为参数传入构造方法中,在传给TestB的私有成员-->
</bean>

constructor-arg是用于定义通过构造方法的方式进行注入的标签,index定义位置,从0开始,ref是某个Bean的引用,值为该Beanid

3.2 通过setter注入

在上面的例子中,修改TestB如下:

public class TestB {
private TestInterface test; public void setTest(TestInterface test) {
this.test = test;
} public void method()
{
test.hello();
}
}

其实就是添加了一个setter,接着修改配置文件:

<bean id="testA" class="TestA"/>
<bean id="testB" class="TestB">
<property name="test" ref="testA" />
</bean>

<property>表示通过setter注入,name是私有成员的名字,ref是被传入setterBeanid值。

Spring 学习笔记(二):SpringIoC的更多相关文章

  1. Spring学习笔记(二)之装配Bean

    一,介绍Bean的装配机制 在Spring中,容器负责对象的创建并通过DI来协调对象之间的关系.但是我们要告诉Spring创建哪些Bean并且如何将其装配在一起.,装配wiring就是DI依赖注入的本 ...

  2. Spring学习总结二——SpringIOC容器二

    一:指定bean的依赖关系 例如examplebean对象依赖examplebean1对象,那么在创建examplebean对象之前就 需要先创建examplebean1对象. 1:创建Example ...

  3. spring学习笔记二 注解及AOP

    本节需要导入spring-aop包 注解 使用注解的目的是为了代替配置,在使用注解时,省略键时,则是为value赋值. 扫描某个包下的所有类中的注解 <?xml version="1. ...

  4. Spring学习笔记二:注入方式

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6774608.html  我们说,IOC的实现方式是依赖注入,也就是把被依赖对象赋值到依赖对象的成员属性.怎么做 ...

  5. Spring学习笔记(二)

    1.Spring MVC 返回json数据 <bean class="org.springframework.web.servlet.mvc.annotation.Annotation ...

  6. Spring 学习笔记(二)

    spring 核心 (xml方式.注解方式) 两种方式实现 ioc :控制反转 aop : 面向切面

  7. spring学习笔记二:spring使用构造方法注入(set方式注入)

    项目目录树: 1.spring的依赖包配置 * SPRING_HOME/dist/spring.jar * SPRING_HOME/lib/log4j/log4j-1.2.14.jar * SPRIN ...

  8. 【spring学习笔记二】Bean

    ### bean的三种实例化方式: 1.构造 2.静态工厂 3.实例工厂 其中,工厂就是工厂的概念,工厂函数factor-method会返回她生产出来的产品类. 而构造初始化也可以选择初始化方式和销毁 ...

  9. spring学习笔记(一) Spring概述

    博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...

  10. Spring学习笔记2——表单数据验证、文件上传

    在上一章节Spring学习笔记1——IOC: 尽量使用注解以及java代码中,已经搭建了项目的整体框架,介绍了IOC以及mybatis.第二节主要介绍SpringMVC中的表单数据验证以及文件上传. ...

随机推荐

  1. 力扣1052. 爱生气的书店老板-C语言实现-中等难度

    题目 传送门 文本 今天,书店老板有一家店打算试营业 customers.length 分钟.每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开. 在某些时 ...

  2. C++入门教程:大白话讲解,新手基础篇⭐⭐⭐(附源码及详解、视频课程资料推荐)

    目录 C++教程 前言 视频教程 文字教程 集成开发环境(IDE) 编译器 工作原理 学习指南 入门书籍 进阶书籍 算法.竞赛书籍 教程 标准构建 程序解释 第一个C++程序--"hello ...

  3. E百科 | 基于MEC的边缘AI服务

    简介: 阿里云边缘计算团队付哲解读5G下热门场景:边缘AI.作者:阿里云付哲,计算机科学与技术专业博士后,在流量检测.资源调度领域有深入研究,其论文<Astraea: Deploy AI Ser ...

  4. 【ZeyFraのJavaEE开发小知识01】@DateTimeFomat和@JsonFormat

    @DateTimeFormat 所在包:org.springframework.format.annotation.DateTimeFormat springframework的注解,一般用来对Dat ...

  5. python2与python3共存时的pip问题

    在树莓派上同时安装有python2和python3,初始的pip是9.01版本,用pip install django只能安装到1.11版本,但是我需要2.0的django. 于是升级pip: pyt ...

  6. tibco EMS 8.2.0安装

    安装环境 序号 项目 值 1 OS版本 Red Hat Enterprise Linux Server release 7.1 (Maipo) 2 内核版本 3.10.0-229.el7.x86_64 ...

  7. 剑指 Offer 57. 和为s的两个数字 + 二分法 + 双指针

    剑指 Offer 57. 和为s的两个数字 Offer_57 题目详情 使用二分法 package com.walegarrett.offer; /** * @Author WaleGarrett * ...

  8. HDOJ-1069(动态规划+排序+嵌套矩形问题)

    Monkey and Banana HDOJ-1069 这里实际是嵌套矩形问题的变式,也就是求不固定起点的最长路径 动态转移方程为:dp[i]=max(dp[j]+block[i].h|(i,j)∈m ...

  9. Mybatis系列全解(二):Mybatis简介与环境搭建

    封面:洛小汐 作者:潘潘 Mybatis 是一套持久层框架,灵活易用,特别流行. 前言 Mybatis系列全解,我们预计准备10+篇文章,让我们了解到 Mybatis 的基本全貌,真正从入门到上手,从 ...

  10. Java-Socket通信 知识点记录

    目录 一.Socket基本案例 二.消息通信 2.1 双向通信 2.2 告知发送结束 2.2.1 通过Socket关闭 2.2.2 通过Socket关闭输出流的方式 2.2.3 通过约定符号 2.2. ...