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= "[email protected]"/>

使用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">[email protected]</prop>

              <prop key="support">[email protected]</prop>

              <prop key="development">[email protected]</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时,就会成功,否则失败

当Spring容器在创建A时,会发现其引用了B,从而会先去创建B。同样的,创建B时,会先去创建C,而创建C时,又先去创建A。最后A、B、C之间互相等待,谁都没法创建成功

原文地址:https://www.cnblogs.com/littlepage/p/11018890.html

时间: 2024-10-21 01:36:53

Spring Framework Part2 IOC的相关文章

Spring技术内幕——Spring Framework的IOC容器实现(一)

一.SpringIOC容器概述 IOC容器和依赖反转的模式 在面向对象的系统中,对象封装了数据和对数据的处理,对象的依赖关系常常体现在对数据和方法的依赖上.这些依赖关系可以通过把对象的依赖注入交给框架IOC容器来完成.他可以再解耦代码的同时提高了代码的可测试性. 依赖控制反转的实现由很多种方式,在Spring中,IOC容器是实现这个模式的载体,他可以再对象生成或者初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖.这种依赖注入是可以递归的,对象被逐

Spring技术内幕——Spring Framework的IOC容器实现(二)

三.IOC容器的初始化过程 IOC容器的初始化时由前面介绍的refresh方法来启动的,这个方法标志着IOC容器的正式启动.这个启动包括BeanDefinition的Resource定位.载入和注册.下面我们将详细分析这三个实现过程,Spring把这三个过程分开,并使用不同的模块来完成,通过这样的设计让用户更加灵活的这三个过程进行剪裁和扩展,定义出最适合自己的IOC容器的初始化过程. 第一个过程: Resource定位过程,是指BeanDefinition的资源定位,他由ResourceLoad

Spring技术内幕——Spring Framework的IOC容器实现(三)

接上一篇的时序图.这里调用的loadBeanDefintions实际上是一个抽象方法,那么实际载入过程发生在哪里呢?在loadBeanDefintions中,初始化了读取器XMLBeanDefinitionReader,然后把这个读取器在IOC容器中设置好(过程和编程式使用XMLBeanFactory是类似的),最后是启动读取器来完成BeanDefinition在IOC容器中的载入,代码如下: /** * Convenient base class for {@link org.springfr

Spring Framework之IoC容器

目录 Spring IoC 概述 问题 依赖倒置原则 (Dependency Inversion Principle) 控制反转 (Inversion of Control) 依赖注入(Dependency Inversion) 依赖倒置原则 .控制反转 .依赖注入的关系 优点 IoC 容器 BeanFactory ApplicationContext IoC容器的依赖注入 基于注解定义Bean 自动装配 @Resource @Autowired @Qualifier 基于Java类配置 @Be

Spring技术内幕——Spring Framework的IOC容器实现(五)(大结局)

这里通过使用BeanDefinitionResolver来对BeanDefinition进行解析,然后注入到property中.下面到BeanDefinitionValueResolver中看一下解析过程,以对Bean reference进行解析为例 /** * Resolve a reference to another bean in the factory. * class BeanDefinitionValueResolver */ private Object resolveRefer

Spring Framework Part3 IoC and Dynamic Proxy

spring serious of blog edit by 马士兵教育 Maven方式创建Spring工程 工程创建 1.新建项目 选择Maven Project 2.勾选 Create a simple project 3.添加项目信息 l Group id :包名 l Artifact id:标识名 l Name:项目名 依赖引入 Maven 中央仓库 地址https://mvnrepository.com/ 使用国内镜像 创建一个maven的配置文件 参照: http://maven.a

JavaIOC框架篇之Spring Framework

欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝的角度去观察(了解)Java体系.使Java的各种后端技术在你心中模块化:让你在工作中能将Java各个技术了然于心:能够即插即用.本篇我们一起来了解SpringIOC相关知识以及其核心点. 目前Java体系常见的IOC框架有Google Guice,PicoContainer,Dagger,Spri

手动创建Spring项目 Spring framework

之前学习框架一直是看的视频教程,并且在都配套有项目源码,跟着视频敲代码总是很简单,现在想深入了解,自己从官网下载文件手动搭建,就遇到了很多问题记载如下. 首先熟悉一下spring的官方网站:http://spring.io/ 平时所说的Spring就是Spring中的一个项目,主页为Project --> Spring Framework : http://projects.spring.io/spring-framework/ 介绍了spring framework的基础配置和使用maven搭

Spring Framework简介

Spring Framework 学习java编程不知不觉已经三年时间了,开始的时候,总是喜欢看着视频,然后按部就班的敲打着键盘,每当系统正常运行后,心里乐开了花.最开始的时候,所有的代码都是由自己设计,基本上不使用第三方java类.但是随着学习的深入,逐渐的开始接触各种第三方java类库,比如apache common,dom4j,log4j等.同样的,为了降低系统开发的复杂度,大部分系统也会采用业界经典的框架结构来构建,比如:struts + spring + orm(ssh),spring