Spring Framework Part2 IOC
spring serious of blog edit by 马士兵教育
IoC概念
IoC是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式之一是DI。
基于XML的DI
ApplicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
XML文件结构
- l <beans beans是xml文件的根节点
- l xmlns=http://www.springframework.org/schema/beans xmlns=xml NameSpace 类似于java中的package
- l xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi是指xml文件遵守xml规范,xsi全名:xml schema instance
- l xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 是指具体用到的schema资源
真的去网上找xsd文件?
当然不是
spring在加载xsd文件时总是先试图在本地查找xsd文件(spring的jar包中已经包含了所有版本的xsd文件),如果没有找到,才会转向去URL指定的路径下载
验证PluggableSchemaResolver.class中


=后面是包名以及具体xsd文件位置
多配置文件
ApplicationContext加载多文件
new ClassPathXmlApplicationContext("applicationContext.xml","application-service.xml");
引入外部文件
<import resource="application-service.xml"/>
Bean的定义与注册
Spring的配置文件是用于指导Spring工厂进行Bean的生产、依赖关系注入及Bean实例分发的“图纸”,它是一个或多个标准的XML文档
<bean id="food" class="com.msb.Food"></bean>
一个bean只能有一个id,但是可以有多个name作为别名
Alias 别名
<alias name="user" alias="my_user_bean" />
spring ioc container
spring ioc container 管理一个或多个bean,bean来自xml中对bean定义的元数据(configuration metadata)
元数据信息
|
Class |
类 |
|
Name,id |
标识 |
|
Scope |
作用域 |
|
Constructor arguments |
构造器注入 |
|
Properties |
属性注入 |
|
autowiring mode |
自动装配 |
|
lazy-initialization mode |
懒加载 |
|
initialization method |
初始化 |
|
destruction method |
销毁 |
构造器注入 constructor-arg
Person的构造器
public Person(String name, Integer age, Food food) {
super();
this.name = name;
this.age = age;
this.food = food;
}
Xml
指定name
<bean id="person" class="com.msb.Person">
<constructor-arg name="age" value=""></constructor-arg>
<constructor-arg name="name" value="zhangsan"></constructor-arg>
</bean>
指定类型
<constructor-arg type="int" value=""/>
指定index
<constructor-arg index="" value=""/>
属性注入
<bean id="person" class="com.msb.Person">
<property name="age" value=""></property>
<property name="name" value="zhangsan"></property>
</bean>
使用p-namespace
属性注入
添加一个namespace
xmlns:p=http://www.springframework.org/schema/p
使用 p
<bean id="person" class="com.msb.Person" p:age="" p:name = "zhangsan"> <bean id="person" class="com.msb.Person" p:age="" p:name = "zhangsan" p:food-ref="food">
使用c- namespace
构造器注入
<bean id="foo" class="x.y.Foo" c:bar-ref="bar" c:baz-ref="baz" c:email= "foo@bar.com"/>
使用java.util.Properties
在set方法中把properties
private Properties properties;
public void setProperties(Properties properties) {
this.properties = properties;
this.name=properties.getProperty("name");
}
对其他Bean的引用
<property name="food" ref="food"></property> <bean id="food" class="com.msb.Food"></bean>
集合
Properties
private Properties adminEmails;
<property name="adminEmails">
<props>
<prop key="administrator">administrator@example.org</prop>
<prop key="support">support@example.org</prop>
<prop key="development">development@example.org</prop>
</props>
</property>
List
private List someList;
<property name="someList">
<list>
<value>apple</value>
<value>orange</value>
</list>
</property>
Map
private Map someMap;
<property name="someMap">
<map>
<entry key="an entry" value="just some string"/>
<entry key ="a ref" value-ref="food"/>
</map>
</property>
depends-on 提前初始化
可以使某个bean在创建前,先创建别的bean
lazy-init
在容器启动后,bean被使用到的时候才加载。可以使用的lazy-init属性
bean id="person" class="com.msb.Person" lazy-init="false"
作用域
spring为bean提供了6种作用域,其中4种只有在web-aware的ApplicationContext种才有用。用户也可以创建自定义的作用域。
singleton 、prototype 、websocket、request、session、application、websocket
singleton scope 单例作用域
每一个类,在一个容器内只能产生一个实例
prototype scope 原型作用域
该bean每次被注入,或者使用getBean()方法获取时,都返回一个新的实例。
Request scope
该作用域的bean,在每个HTTP request都会新建一个实例,当一个request结束后,该实例也会被丢弃。
Session scope
某一个用户在一段时间内,会使用同一个session,session有超时时间,过了超时时间则session失效。不同用户使用不同的session。
Application scope
该作用域的bean,每一个application会创建一个
MVC下Spring的单例
想在一个singleton内多次调用短存活时间的bean(propotype、request、session等),希望调用的是不同的实例,那么就需要使用AOP proxy技术
线程安全问题
业务对象并没有做线程的并发限制,因此不会出现各个线程之间的等待问题,或是死锁问题
MVC中的实体bean不是单例的
成员变量
在并发访问的时候这些成员变量将会是并发线程中的共享对象,也是影响线程安全的重要因素
引用类型的成员
其中引用类型的成员变量即我们在controller中注入的service,在service中注入的dao,这里将其定义为成员变量主
要是为了实例化进而调用里面的业务方法,在这些类中一般不会有全局变量,因此只要我们的业务方法不含有独立的
全局变量即使是被多线程共享,也是线程安全的。
Controller service dao 层中的业务类是多线程共享的,但是每个线程在处理数据的时候具体处理的数据是在每个线程中各自有一份。
controller层
l final类型 线程安全
l 成员变量 有状态数据有线程安全问题
循环依赖的bean
构造器注入循环依赖
当循环依赖的bean都是通过构造器注入依赖的时候,无论这些bean是singleton还是prototype,在获取bean的时候都会失败。
通过属性注入
l 循环依赖的bean都是singleton 成功
l 循环依赖的bean都是prototype 失败
l 同时有singleton和prototype 当先获取的那个bean是singleton时,就会成功,否则失败
l 
当Spring容器在创建A时,会发现其引用了B,从而会先去创建B。同样的,创建B时,会先去创建C,而创建C时,又先去创建A。最后A、B、C之间互相等待,谁都没法创建成功
Spring Framework Part2 IOC的更多相关文章
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->使用spring framework的IoC容器功能----->方法一:使用XML文件定义beans之间的依赖注入关系
XML-based configuration metadata(使用XML文件定义beans之间的依赖注入关系) 第一部分 编程思路概述 step1,在XML文件中定义各个bean之间的依赖关系. ...
- 框架应用:Spring framework (一) - IoC技术
IoC概念以及目标 IoC就是让原本你自己管理的对象交由容器来进行管理,其主要的目的是松耦合. IoC发展史 既然IoC的目标是为了松耦合,那它怎么做到的? 最后目标:降低对象之间的耦合度,IoC技术 ...
- Spring Framework之IoC容器
Spring IoC 概述 问题 1.什么是依赖倒置? 2.什么是控制反转? 3.什么是依赖注入? 4.它们之间的关系是怎样的? 5.优点有哪些? 依赖倒置原则 (Dependency Inversi ...
- Spring Framework Part3 IoC and Dynamic Proxy
spring serious of blog edit by 马士兵教育 Maven方式创建Spring工程 工程创建 1.新建项目 选择Maven Project 2.勾选 Create a sim ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->关于spring framework中的beans
Spring framework中的beans 1.概述 bean其实就是各个类实例化后的对象,即objects spring framework的IOC容器所管理的基本单元就是bean spring ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转
Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...
- Spring系列(零) Spring Framework 文档中文翻译
Spring 框架文档(核心篇1和2) Version 5.1.3.RELEASE 最新的, 更新的笔记, 支持的版本和其他主题,独立的发布版本等, 是在Github Wiki 项目维护的. 总览 历 ...
- JavaIOC框架篇之Spring Framework
欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...
- Hello Spring Framework——依赖注入(DI)与控制翻转(IoC)
又到年关了,还有几天就是春节.趁最后还有些时间,复习一下Spring的官方文档. 写在前面的话: Spring是我首次开始尝试通过官方文档来学习的框架(以前学习Struts和Hibernate都大多是 ...
随机推荐
- leetcode-easy-others-191. Number of 1 Bits-NO
mycode 不会... 输入是二进制....我还以为十进制.... 00000001011 = 11 题意: 编写一个将(无符号)整数作为输入的函数,并返回该数字二进制表示中等于1的位数.例如:输 ...
- Django中csrf token验证原理
我多年没维护的博客园,有一篇初学Django时的笔记,记录了关于django-csrftoekn使用笔记,当时几乎是照抄官网的使用示例,后来工作全是用的flask.博客园也没有维护.直到我的博客收到了 ...
- 前端必须掌握的 nginx 技能(2)
概述 作为一个前端,我觉得必须要学会使用 nginx 干下面几件事: 代理静态资源 设置反向代理(添加https) 设置缓存 设置 log 部署 smtp 服务 设置 redis 缓存(选) 下面我按 ...
- python操作oracl数据库
#查询交易系统数据,判断当日是否有港股交易 import cx_Oracleimport os conn = Nonecursor = None hkfile = 'hk.txt'nohkfile = ...
- js身份证号、电话脱敏处理(用*替换中间数据)
数字类型 certificatecodecopy = certificatecode.replace(/^(.{6})(?:\d+)(.{4})$/, "\$1****\$2") ...
- Spring 中如何自动创建代理(spring中的三种自动代理创建器)
Spring 提供了自动代理机制,可以让容器自动生成代理,从而把开发人员从繁琐的配置中解脱出来 . 具体是使用 BeanPostProcessor 来实现这项功能. 这三种自动代理创建器 为:Bean ...
- Pycharm最新激活码汇总,pycharm2019激活码
Pycharm激活码汇总 激活过程如下: 1.双击运行桌面上的Pycharm图标,进入下图界面,选择Do not import settings,之后选择OK,进入下一步. 2.拖动到底部,选择Acc ...
- ARM的编程模式及寄存器
根据朱老师的课程及下面博客整理 http://blog.chinaunix.net/uid-20443992-id-5700979.html ARM 采用的是32位架构 ARM 约定: Byte : ...
- 结构体封装高精度 大整数BigInt
曾经很讨厌高精度,因为它很长,不好记,而且在不是很单纯的题目里面感觉很烦(一个数就是一个数组).在一道题目中出现的时候总是用一些奇技淫巧混过去(比如把两个$long$ $long$拼在一起). 现在. ...
- vue2 学习笔记
一.部署环境1.安装nodeJS -- 地址:https://nodejs.org/zh-cn/ 2.安装vue脚手架 (用于创建VUE项目的) 进入项目文件或者新建一个文件 npm install ...