Spring 学习笔记(二):SpringIoC
1 IoC与DI
IoC是Inversion of Control的简称,也就是控制反转。通常来说,创建对象需要调用者手动创建,也就是new XXX()的方式。当Spring框架出现后,对象的实例不再由调用者创建,而是由Spring容器创建,这样控制权就由调用者转移到Spring容器,控制权发生了反转,这就是Spring的控制反转。从Spring容器来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例,这就是Spring的依赖注入(Dependency Injection,DI)。
一句话总结:
IoC:控制权由调用者交由Spring容器,控制发生了反转DI:由Spring容器注入需要的值到对象中
2 Spring IoC容器
Spring中实现IoC的是Spring IoC容器,主要基于以下两个接口:
BeanFactoryApplicationContext
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
ApplicationContext是BeanFactory的子接口,也称为应用上下文,除了包含BeanFactory的功能外还添加了国际化、资源访问、事件传播等的支持,创建ApplicationContext的实例有以下三种方法:
ClassPathXmlApplicationContextFileSystemXmlApplicationContextWeb服务器实例化
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项目来说就是resourcesfile::该前缀表示从绝对路径获取
例子:
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的引用,值为该Bean的id。
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是被传入setter的Bean的id值。
Spring 学习笔记(二):SpringIoC的更多相关文章
- Spring学习笔记(二)之装配Bean
一,介绍Bean的装配机制 在Spring中,容器负责对象的创建并通过DI来协调对象之间的关系.但是我们要告诉Spring创建哪些Bean并且如何将其装配在一起.,装配wiring就是DI依赖注入的本 ...
- Spring学习总结二——SpringIOC容器二
一:指定bean的依赖关系 例如examplebean对象依赖examplebean1对象,那么在创建examplebean对象之前就 需要先创建examplebean1对象. 1:创建Example ...
- spring学习笔记二 注解及AOP
本节需要导入spring-aop包 注解 使用注解的目的是为了代替配置,在使用注解时,省略键时,则是为value赋值. 扫描某个包下的所有类中的注解 <?xml version="1. ...
- Spring学习笔记二:注入方式
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6774608.html 我们说,IOC的实现方式是依赖注入,也就是把被依赖对象赋值到依赖对象的成员属性.怎么做 ...
- Spring学习笔记(二)
1.Spring MVC 返回json数据 <bean class="org.springframework.web.servlet.mvc.annotation.Annotation ...
- Spring 学习笔记(二)
spring 核心 (xml方式.注解方式) 两种方式实现 ioc :控制反转 aop : 面向切面
- spring学习笔记二:spring使用构造方法注入(set方式注入)
项目目录树: 1.spring的依赖包配置 * SPRING_HOME/dist/spring.jar * SPRING_HOME/lib/log4j/log4j-1.2.14.jar * SPRIN ...
- 【spring学习笔记二】Bean
### bean的三种实例化方式: 1.构造 2.静态工厂 3.实例工厂 其中,工厂就是工厂的概念,工厂函数factor-method会返回她生产出来的产品类. 而构造初始化也可以选择初始化方式和销毁 ...
- spring学习笔记(一) Spring概述
博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书. 强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...
- Spring学习笔记2——表单数据验证、文件上传
在上一章节Spring学习笔记1——IOC: 尽量使用注解以及java代码中,已经搭建了项目的整体框架,介绍了IOC以及mybatis.第二节主要介绍SpringMVC中的表单数据验证以及文件上传. ...
随机推荐
- Github Packages和Github Actions实践之CI/CD
概述 Github在被微软收购后,不忘初心,且更大力度的造福开发者们,推出了免费私有仓库等大更新.近期又开放了packages和actions两个大招,经笔者试用后感觉这两个功能配合起来简直无敌. G ...
- Linux-基础命令学习
Linux终端 Linux存在两种终端模拟器,一种类MAC的Gnome和一种类Win的KDE 远程连接工具: xshell,putty,crt(网工) 如果在Linux下输入tty 1 wang@DE ...
- Java基本概念:类
一.描述 类是一种抽象的数据类型,它是对某一类事物整体的描述或定义,但是并不能代表某一个具体的事物. 例如,我们生活中所说的词语:动物.植物.手机.电脑等等.这些也都是抽象的概念,而不是指的某一个 具 ...
- python使用requests模块下载文件并获取进度提示
一.概述 使用python3写了一个获取某网站文件的小脚本,使用了requests模块的get方法得到内容,然后通过文件读写的方式保存到硬盘同时需要实现下载进度的显示 二.代码实现 安装模块 pip3 ...
- C++ folly库解读(二) small_vector —— 小数据集下的std::vector替代方案
介绍 使用场景 为什么不是std::array 其他用法 其他类似库 Benchmark 代码关注点 主要类 small_vector small_vector_base 数据结构 InlineSto ...
- salesforce零基础学习(一百零一)如何了解你的代码得运行上下文
本篇参考:https://developer.salesforce.com/docs/atlas.en-us.228.0.apexcode.meta/apexcode/apex_enum_System ...
- Hi3559AV100 NNIE开发(2)-RFCN(.wk)LoadModel及NNIE Init函数运行过程分析
之后随笔将更多笔墨着重于NNIE开发系列,下文是关于Hi3559AV100 NNIE开发(2)-RFCN(.wk)LoadModel及NNIE Init函数运行过程分析,通过对LoadModel函数及 ...
- C# 应用 - 封装类访问 Mysql 数据库
个人经历的项目主要都是用 Postgresql 或 Oracle 数据库,本文非原创,从他处整理而来. 1. 库类 mysql.data.dll using MySql.Data.MySqlClien ...
- springboot注解之@Import @Conditional @ImportResource @ConfigurationProperties @EnableConfigurationProperties
1.包结构 2.主程序类 1 @SpringBootApplication(scanBasePackages={"com.atguigu"}) 2 public class Mai ...
- 关于ORACLE数据库跨库调用序列的解决办法
问题 ORACLE 数据库 用户1 xscg 有序列 seq_S_ATTACHMENT_INFO.nextval 我要在 用户2 xsds 里面调用 ...