第二章 IoC
- 什么是IoC
- 如何配置IOC
- Bean的生命周期
- 多环境配置
- 条件化配置Bean
什么是IOC?
IOC有两层含义,
1、控制反转:将对象实例的创建与销毁的权限交给Spring容器管理,而不再是调用对象内部自己new
2、依赖注入:Spring容器检测到对象之间的依赖关系,初始化(或者第一次调用)的时候,将对应的实例注入给相关的对象
如何配置IOC?
Spring通过几种方式,将Bean对象存放在Spring容器中
Spring的配置方法,根据配置“媒介”的不同,可以分为XML、Class类
使用XML对Bean进行配置,又可以按照XML的位置,分为类路径、文件系统路径、Web应用路径
表格中为几种Spring工厂
| 类路径XML | ClassPathXmlApplication |
| 文件系统路径XML | FileSystemXmlApplication |
| Web应用路径XML | XmlWebApplication |
| Class类 | AnnotationConfigApplicationContext、AnnotationConfigWebApplicationContext |
使用XML配置Bean
一个最基本的XML配置的Bean如下
<bean id="user" class="demo01.part01.User"/>
使用p命名空间进行属性注入
<bean id="user" class="demo01.part01.User"
p:age="27"
p:name="哇哈哈"/>
一些简单的属性注入与构造器注入,都可以使用p和c命名空间
使用如下
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) applicationContext.getBean("user");
logger.debug("user:"+user);
}
20:36:38.460 [main] DEBUG demo01.part01.Demo01 - user:demo01.part01.User@6e171cd7[name=哇哈哈,age=27]
如果容器中只有一个User实例,可以使用getBean(Class class)方法,这样就无需强制转化了
User user = applicationContext.getBean(User.class);
构造器注入
<bean id="user" class="demo01.part01.User">
<constructor-arg name="name" value="哇哈哈"/>
<constructor-arg name="age" value="12"/>
</bean> OR
<bean id="user" class="demo01.part01.User"
c:name="我问问"
c:age="17"/>
当然,前提是有此种构造方法
XML配置Bean的方式显得很麻烦,所以有更好的注解的方法,配置一个扫描,Bean上添加指定的注解就行。在Spring Boot,甚至连Bean上的注解都可以去掉了。
所以XML配置Bean的方式就不啰嗦了,对于遗留项目中有需要修改的时候,再参考书籍即可。自己开发的时候,尽可能使用Java配置+扫描,或者Spring Boot的方式
注解配置
在XML中使用
<context:component-scan base-package="demo01"/>
配置扫描范围
在Bean上使用注解,标识自己需要被扫描到
/**
* Created by sherry on 17/1/10.
*/
@Component
public class User {
......
}
Java配置
package demo01.part03; import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.ComponentScan; /**
* Created by sherry on 17/1/10.
*/
@Configurable
@ComponentScan("demo01")
public class SpringBean { }
用一个Java类,代替了XML去描述Bean,Java类可以完全代替XML的配置
以上,只是简单描述了一下Spring容器的初始化的几种风格,实际上Spring的配置非常强大与灵活,足以满足我们开发过程中遇到的各种需求
IOC最佳实践
优先把配置都放在Java中,包括扫描目录、Bean初始化、引入其他Java配置类或XML配置文件
要在开发中遇到实际需求的时候,再考虑Spring为我们提供的简便配置方案
Bean的作用域
singletion:单例,这也是默认作用域
prototype:每次从容器中获取出来的都是新实例
request:
session:
global-session
第二章 IoC的更多相关文章
- 第二章 IOC + AOP 底层原理
<精通Spring4.x 企业应用开发实战>读书笔记 一.概念 IOC: 假设B类调用了A类,那么A类的对象的创建是由B类来实现: IOC是指将A对象的创建由容器来完成,并且将创建好的对象 ...
- 《Spring技术内幕》笔记-第二章 IoC容器的实现
简单介绍 1,在Spring中,SpringIoC提供了一个主要的JavaBean容器.通过IoC模式管理依赖关系.并通过依赖注入和AOP切面增强了为JavaBean这样子的POJO提供事务管理,生命 ...
- 第二章 IoC Setter注入
Setter注入又称为属性注入.是通过属性的setXXX()方法来注入Bean的属性值或依赖对象.由于Setter注入具有可选择性和灵活性高的优点,因此Setter注入是实际应用中最常用的注入方式. ...
- 转: 第二章 IoC Annotation注入
http://blog.csdn.net/p_3er/article/details/9231307 1.命名空间 使用Annotation的方式,需要在spring的配置文件中配置命名空间.命名空间 ...
- Spring 3.x 实践 第一个例子(Spring 3.x 企业应用开发实战读书笔记第二章)
前言:工作之后一直在搞android,现在需要更多和后台的人员交涉,技术栈不一样,难免鸡同鸭讲,所以稍稍学习下. 这个例子取自于<Spring 3.x 企业应用开发实战>一书中的第二章,I ...
- Java开发工程师(Web方向) - 04.Spring框架 - 第2章.IoC容器
第2章.IoC容器 IoC容器概述 abstract: 介绍IoC和bean的用处和使用 IoC容器处于整个Spring框架中比较核心的位置:Core Container: Beans, Core, ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...
- Jenkins入门系列之——02第二章 Jenkins安装与配置
2014-12-08:已不再担任SCM和CI的职位,Jenkins的文章如无必要不会再维护. 写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之——03 ...
随机推荐
- 苏州Uber优步司机奖励政策(1月11日~1月17日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- python中- \r用法
# \r 默认表示将输出的内容返回到第一个指针,这样的话,后面的内容会覆盖前面的内容 def main(): for i in range(65,91): s="\r{name:s}&quo ...
- java对象创建过程简介
这是看书的记录,字有点丑啊还是将就搬上来 -.-,等把后面看了完善图
- .NET邮件发送详情
①百度下载个Free Smtp Server ②下载完成后,打开进去,点击左上角的options,弹出窗口,进行如下图选项即可(一般默认已正确选中),然后我们可以把这软件关了. (下次你重启电脑时,也 ...
- unity中虚拟摇杆的实现
实现效果: 实现: 使用NGUI添加虚拟摇杆背景和其子物体按钮,为按钮Attach boxcollider和ButtionScript.为按钮添加如下脚本: 注意:其中的静态属性可以在控制物体移动的 ...
- python函数参数默认值及重要警告
最有用的形式是对一个或多个参数指定一个默认值.这样创建的函数,可以用比定义时允许的更少的参数调用,比如: def ask_ok(prompt, retries=4, reminder='Please ...
- lintcode539 移动零
移动零 给一个数组 nums 写一个函数将 0 移动到数组的最后面,非零元素保持原数组的顺序 注意事项 1.必须在原数组上操作2.最小化操作数 您在真实的面试中是否遇到过这个题? Yes 样例 给出 ...
- LeetCode 142——环形链表 II
1. 题目 2. 解答 2.1 方法 1 定义快慢两个指针,慢指针每次前进一步,快指针每次前进两步,若链表有环,则快慢指针一定会相遇. 当快慢指针相遇时,我们让慢指针指向头节点,快指针不变,然后每次快 ...
- Linux内核设计笔记13——虚拟文件系统
虚拟文件系统 内核在它的底层文件系统系统接口上建立一个抽象层,该抽象层使Linux可以支持各种文件系统,即便他们在功能和行为上存在很大差异. VFS抽象层定义了各个文件系统都支持的基本的.概念上的接口 ...
- 压力测试工具-webbench
简述 偶然情况下看到一款性能测试工具webbench,看着挺不错的记录一下安装过程,在以后项目上线过程中可以压一压一些页面的并发情况,对项目性能有个大致的了解. 原理 webbench首先fork出多 ...