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="18"></constructor-arg><constructor-arg name="name" value="zhangsan"></constructor-arg></bean>
指定类型
<constructor-arg type="int" value="7500000"/>
指定index
<constructor-arg index="0" value="7500000"/>
属性注入
<bean id="person" class="com.msb.Person"><property name="age" value="19"></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="21" p:name = "zhangsan"><bean id="person" class="com.msb.Person" p:age="21" 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之间互相等待,谁都没法创建成功
转载于:https://www.cnblogs.com/littlepage/p/11018890.html
Spring Framework Part2 IOC相关推荐
- Spring Framework Core IOC
Core IoC Container 依赖注入的方式如下: 通过构造函数参数 通过工厂方法的参数 从构造或者工厂方法返回的对象实例上设置的属性 这个过程通过直接使用类的构造或者类似服务定位器模式的机制 ...
- Spring技术内幕——Spring Framework的IOC容器实现(一)
一.SpringIOC容器概述 IOC容器和依赖反转的模式 在面向对象的系统中,对象封装了数据和对数据的处理,对象的依赖关系常常体现在对数据和方法的依赖上.这些依赖关系可以通过把对象的依赖注入交给框架 ...
- Spring Framework 5.0.0.M4中文文档第3章
文章目录 Part II. 核心技术 3. IoC容器 3.2 容器概述 3.2.1 配置元数据 3.2.2 实例化容器 3.2.3 使用容器 3.3 Bean概述 3.3.1 命名bean 3.3. ...
- 手动创建Spring项目 Spring framework
之前学习框架一直是看的视频教程,并且在都配套有项目源码,跟着视频敲代码总是很简单,现在想深入了解,自己从官网下载文件手动搭建,就遇到了很多问题记载如下. 首先熟悉一下spring的官方网站:http: ...
- spring原理案例-基本项目搭建 01 spring framework 下载 官网下载spring jar包
下载spring http://spring.io/ 最重要是在特征下面的这段话,需要注意: All avaible features and modules are described in the ...
- Spring Framework(框架)整体架构
原文链接:https://blog.csdn.net/wd2014610/article/details/80061808 Spring 在这个Spring框架大行其道的软件开发世界里,尚有很多工程师 ...
- Spring Framework中的作用域代理
Spring框架提供了Spring bean的作用域. 我们可以使用spring范围控制插入Spring bean的各种依赖关系和配置值. Spring支持以下六个范围. 在基于Web的应用程序中可以 ...
- java ee技术_Java EE 6与Spring Framework:技术决策过程
java ee技术 在过去的几个月中,我们经历了这个决策过程:为Java平台上的企业开发选择哪种技术堆栈? 有多种选择. 但是,我们深入讨论的是:纯Java EE 6堆栈与带有Java EE的Spri ...
- Java EE 6与Spring Framework:技术决策过程
在过去的几个月中,我们经历了这个决策过程:为Java平台上的企业开发选择哪种技术堆栈? 有多种选择. 但是,我们深入讨论的是:纯Java EE 6堆栈与带有Java EE的Spring. 以下博客文章 ...
最新文章
- Java程序员在中年危机的时候,如何避免被“优化”掉呢?
- Servlet 表单数据
- (7)Node.js 全局函数
- 大数据_Spark框架_快速上手_word count 案例分析---Spark工作笔记0005
- 中兴 108 亿换得自由身!
- 关于STM32库中 __IO 修饰符(volatile修饰符,反复无常的意思)
- Java -Dfile.encoding=UTF-8 出现乱码问题原因分析
- PostgreSQL的JDBC驱动---jdbc的链接数据库
- 《大数据之路:阿里巴巴大数据实践》-第1篇 数据技术篇 -第3章数据同步
- 写在控制层的VO是什么?
- oracle alert下的文件,Oracle 11g alert文件的变化 --
- 毕业旅行之天府之国——徒步峨眉
- hdu 3987 Harry Potter and the Forbidden Forest
- Laravel log channel 分组配置
- 计算机毕业设计Python+uniapp校园服务微信小程序(小程序+源码+LW)
- 微信小程序之将base64图片转为本地图片
- Mininet系列实验(三):Mininet命令延伸实验扩展
- swd只能下载一次第二次出现错误
- HTML5学习笔记(三)
- 应用在电力行业的无源RFID温度传感器标签
热门文章
- python os.environ gpu_Tensorflow下如何实现多GPU数据并行训练?
- python布尔类型运算_Python中布尔类型
- 计算机应用技术适合女孩学吗,2021计算机应用技术女生学难吗
- linux的编程命令,linux编程常用命令
- win7计算机睡眠怎么设置方法,win7系统更改(设置)计算机睡眠时间的操作方法...
- apache php mysql是长连接吗_php关于mysql长连接问题
- ajax成功进入success但是获取不到返回值
- 【Java面试题】docker拉取镜像
- 链表的排序(Python和C实现)
- 【深度学习】弱/半监督学习解决医学数据集规模小、数据标注难问题