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都大多是 ...
随机推荐
- RF快捷键
常用快捷键 操作 键 重命名 F2 搜索关键字 F5 执行用例 F8 创建新工程 ctrl+n 创建新测试套 ctrl+shift+f 创建新用例 ctrl+shift+t 创建新关键字 ctrl+s ...
- android中如何自动获取短信验证码
package com.loaderman.smsbroadcastreceiver; import java.util.regex.Matcher; import java.util.regex.P ...
- Python_List对象内置方法详解
目录 目录 前言 软件环境 列表List 修改列表的元素 插入列表元素 extend 将序列中的元素迭代的附加到list中 insert 在指定的索引号中插入一个元素 删除列表元素 del 删除Lis ...
- Python字符和字符值(ASCII或Unicode码值)转换方法
Python字符和字符值(ASCII或Unicode码值)转换方法 这篇文章主要介绍了Python字符和字符值(ASCII或Unicode码值)转换方法,即把字符串在ASCII值或者Unicode值之 ...
- ssh连接报错
1.ssh: connect to host 172.16.0.142 port 22: Connection refused 解决: 在sshd 被连接端输入: [root@ecs-01 ~]# e ...
- git 本地代码提交至远程master分支解决方法
git 提交代码,本地新建一个my分支,不从本地master分支直接上传,而是先从本地my分支上提交至本地master分支,然后本地master提交至远程master分支上.前提是远程只有一个mast ...
- windows vs2015 编译openssl 1.1.0c
1,到openssl官网下载源码. 2,安装activePerl,我放在网盘:https://pan.baidu.com/s/1ZHe24yRcPtIuSiEa-3oqxw 3.安装完毕后,使用 VS ...
- java:LeakFilling(Springmvc)
1.后台可以同时多个对象接收前端页面的值:(如图两个都打印了) 2.参数绑定的注解,通过该注解可以解决参数名称与controller中形参名称不一致的问题: @RequestParam(name=&q ...
- oracle 11g错误ora-01033:oracle initialization or shutdown in progress解决办法
原文出自:http://blog.csdn.net/liverliu/article/details/6410287 一.首先:问题的产生原因,先前我在f:/llh/目录创建的一个bookspace表 ...
- CTF—攻防练习之SMB私钥泄露
攻击机:192.168.32.152 靶机 :192.168.32.155 打开靶机 nmap一下 我们看到了开放了 ssh,smb,mysql这些端口,还有一个大端口 对smb服务我们可以1.使用空 ...