学习spring Ioc整理的一些笔记,很简单。分享给你们。html
IoC 基本概念java
在这以前,咱们先记住一句话。好莱坞原则:Don't call us, we will call you.
其实这句话很恰当地形容了“反转”的意味;
Ioc, Inversion of Control,控制反转,它还有一个别名叫“依赖注入”(DI Dependency Injection)。IoC不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为什么是反转(有反转就应该有正转了),哪些方面反转了”spring
还有一个概念:DI 依赖注入。大部分认为IoC和DI只是不一样的叫法而已。
理解DI的关键是:“谁依赖谁,为何须要依赖,谁注入谁,注入了什么”数组
Spring IoC缓存
我理解的spring IoC分为两部分:Bean实例的建立和依赖注入;学习
Spring IoC容器如何实例化Bean呢?传统应用程序能够经过new和反射方式进行实例化Bean。而Spring IoC容器则须要根据Bean定义里的配置元数据使用反射机制来建立Bean。(你们能够了解一下Java的反射机制,这是Spring Ioc实现Bean实例化的核心机制)在Spring IoC容器中根据Bean定义建立Bean主要有如下几种方式:ui
<!--使用默认构造参数--> <bean name="bean1" class="com.java.spring.Demo"/> <!--使用有参数构造参数--> <bean name="bean2" class="com.java.spring.Demo"> <!-- 指定构造器参数 --> <constructor-arg index="0" value="Hello Spring!"/> </bean> <!-- 使用静态工厂方法 --> <bean id="bean3" class="com.java.spring.DemoStaticFactory" factory-method="newInstance"> <constructor-arg index="0" value="Hello Spring!"/> </bean> <!--一、定义实例工厂Bean --> <bean id="DemoInstanceFactoryv" class="com.java.spring.DemoInstanceFactory"/> <!—二、使用实例工厂Bean建立Bean --> <bean id="bean4" factory-bean="DemoInstanceFactory" factory-method="newInstance"> <constructor-arg index="0" value="Hello Spring!"></constructor-arg> </bean>
另外,静态工厂和实例工厂方法还有对应的静态工厂类和实例工厂类.net
/** * 静态工厂类 * **/ public class DemoStaticFactory { //工厂方法 public static HelloApi newInstance(String message) { //返回须要的Bean实例 return new Demo(message); } } /** * 实例工厂类 * **/ package com.java.spring; public class DemoInstanceFactory { public HelloApi newInstance(String message) { return new Demo(message); } }
这一块补充一个细节。Spring何时实例化bean,首先要分2种状况:prototype
第二:若是你使用ApplicationContext做为Spring Bean的工厂类,则又分为如下几种状况:设计
(1):若是bean的scope是singleton的,而且lazy-init为false(默认是false,因此能够不用设置),则ApplicationContext启动的时候就实例化该Bean,而且将实例化的Bean放在一个map结构的缓存中,下次再使用该Bean的时候,直接从这个缓存中取 (2):若是bean的scope是singleton的,而且lazy-init为true,则该Bean的实例化是在第一次使用该Bean的时候进行实例化 (3):若是bean的scope是prototype的,则该Bean的实例化是在第一次使用该Bean的时候进行实例化
一般使用ApplicationContext做为容器的。
使用@Autowire注解注入的时机则是容器刚启动的时候就开始注入;注入以前要先初始化bean;
ApplicationContext 的初始化和BeanFactory 有一个重大的区别:BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean 时才实例目标Bean;而ApplicationContext 则在初始化应用上下文时就实例化全部单实例的Bean。
了解Bean的实例化后,接下来就是Bean实例之间的关系,也就是依赖注入;
Spring IoC容器的依赖有两层含义:Bean依赖容器和容器注入Bean的依赖资源:
Spring IoC容器注入依赖资源主要有如下两种基本实现方式:
1、构造器注入:
1)常量值
<constructor-arg index="0" value="常量"/> <!--简写 --> <constructor-arg index="0"><value>常量</value></constructor-arg><!--全写 -->
2)引用
<constructor-arg index="0" ref="引用"/><!--简写 --> <constructor-arg index="0"><ref bean="引用"/></constructor-arg><!--全写 -->
2、setter注入:
1)常量值
<property name="message" value="常量"/><!--简写 --> <property name="message"><value>常量</value></ property><!--全写 -->
2)引用
<property name="message" ref="引用"/><!--简写 --> <property name="message"><ref bean="引用"/></ property><!--全写 -->
3)数组:<array>
<property name="values"> <array> <value>1</value> <value>2</value> <value>3</value> </array> </property>
4)列表:<list>
<property name="values"> <list> <value>1</value> <value>2</value> <value>3</value> </list> </property>
5)集合:<set>
<property name="values"> <set> <value>1</value> <value>2</value> <value>3</value> </set> </property>
6)字典
<!--简写 --> <map> <entry key="键常量" value="值常量"/> <entry key-ref="键引用" value-ref="值引用"/> </map> <!--全写 --> <map> <entry><key><value>键常量</value></key><value>值常量</value></entry> <entry><key><ref bean="键引用"/></key><ref bean="值引用"/></entry> </map>
7)Properties
另外,基于注解驱动的Spring Ioc的原理以及Spring IoC源码剖析相关我在在网上找到一些文章,你们也能够看一下。
Spring依赖注入的两种方式xml和注解
使用注释驱动的Ioc功能
Spring IoC源码剖析