spring IOC 2

配置简写

1、构造器注入:java

1)常量值web

简写:<constructor-arg index="0" value="常量"/>spring

全写:<constructor-arg index="0"><value>常量</value></constructor-arg>编程

2)引用数组

简写:<constructor-arg index="0" ref="引用"/>缓存

全写:<constructor-arg index="0"><ref bean="引用"/></constructor-arg>session

 

2、setter注入:      ui

       1)常量值spa

        简写:<property name="message" value="常量"/>prototype

        全写:<property name="message"><value>常量</value></ property>

       2)引用

        简写:<property name="message" ref="引用"/>

        全写:<property name="message"><ref bean="引用"/></ property>

       3)数组:<array>没有简写形式

       4)列表:<list>没有简写形式

       5)集合:<set>没有简写形式

       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:没有简写形式

 

使用p命名空间简化setter注入:

<bean id="……" class="……" p:id="value"/> 常量setter注入方式,其等价于<property name="id" value="value"/>;

<bean id="……" class="……" p:id-ref="bean1"/> 引用setter注入方式,其等价于<property name="id" ref="bean1"/>。

 

4.传统应用程序设计中所说的依赖通常指“类之间的关系”,那先让咱们复习一下类之间的关系:

     泛化:表示类与类之间的继承关系、接口与接口之间的继承关系;

     实现:表示类对接口的实现;

     依赖:当类与类之间有使用关系时就属于依赖关系,不一样于关联关系,依赖不具备“拥有关系”,而是一种“相识关系”,只在某个特定地方(好比某个方法体内)才有关系。

     关联:表示类与类或类与接口之间的依赖关系,表现为“拥有关系”;具体到代码能够用实例变量来表示;

     聚合:属因而关联的特殊状况,体现部分-总体关系,是一种弱拥有关系;总体和部分能够有不同的生命周期;是一种弱关联;

     组合:属因而关联的特殊状况,也体现了体现部分-总体关系,是一种强“拥有关系”;总体与部分有相同的生命周期,是一种强关联;

5.应用依赖注入能给咱们带来哪些好处呢?

动态替换Bean依赖对象,程序更灵活:替换Bean依赖对象,无需修改源文件:应用依赖注入后,因为能够采用配置文件方式实现,从而能随时动态的替换Bean的依赖对象,无需修改java源文件;

     更好实践面向接口编程,代码更清晰:在Bean中只需指定依赖对象的接口,接口定义依赖对象完成的功能,经过容器注入依赖实现;

     更好实践优先使用对象组合,而不是类继承:由于IoC容器采用注入依赖,也就是组合对象,从而更好的实践对象组合。

  • 采用对象组合,Bean的功能可能由几个依赖Bean的功能组合而成,其Bean自己可能只提供少量功能或根本无任何功能,所有委托给依赖Bean,对象组合具备动态性,能更方便的替换掉依赖Bean,从而改变Bean功能;
  • 而若是采用类继承,Bean没有依赖Bean,而是采用继承方式添加新功能,,并且功能是在编译时就肯定了,不具备动态性,并且采用类继承致使Bean与子Bean之间高度耦合,难以复用。

     增长Bean可复用性:依赖于对象组合,Bean更可复用且复用更简单;

     下降Bean之间耦合:因为咱们彻底采用面向接口编程,在代码中没有直接引用Bean依赖实现,所有引用接口,并且不会出现显示的建立依赖对象代码,并且这些依赖是由容器来注入,很容易替换依赖实现类,从而下降Bean与依赖之间耦合;

     代码结构更清晰:要应用依赖注入,代码结构要按照规约方式进行书写,从而更好的应用一些最佳实践,所以代码结构更清晰。

 

延迟初始化Bean

<bean id="helloApi"  class="cn.javass.spring.chapter2.helloworld.HelloImpl"   lazy-init="true"/>  

使用depends-on 

指指定Bean初始化及销毁时的顺序,使用depends-on属性指定的Bean要先初始化完毕后才初始化当前Bean,因为只有“singleton”Bean能被Spring管理销毁,因此当指定的Bean都是“singleton”时,使用depends-on属性指定的Bean要在指定的Bean以后销毁。

那“depends-on”有什么好处呢?主要是给出明确的初始化及销毁顺序,好比要初始化“decorator”时要确保“helloApi”Bean的资源准备好了,不然使用“decorator”时会看不到准备的资源;而在销毁时要先在“decorator”Bean的把对“helloApi”资源的引用释放掉才能销毁“helloApi”,不然可能销毁 “helloApi”时而“decorator”还保持着资源访问,形成资源不能释放或释放错误。

 

bean中加 

init-method="init" 指定初始化方法,在构造器注入和setter注入完毕后执行。

destroy-method="destroy":指定销毁方法,只有“singleton”做用域能销毁,“prototype”做用域的必定不能,其余做用域不必定能;后边再介绍。

 

自动装配 

byName 

经过设置Bean定义属性autowire="byName",意思是根据名字进行自动装配,只能用于setter注入。好比咱们有方法“setHelloApi”,则“byName”方式Spring容器将查找名字为helloApi的Bean并注入,若是找不到指定的Bean,将什么也不注入。

byType

经过设置Bean定义属性autowire="byType",意思是指根据类型注入,用于setter注入,好比若是指定自动装配方式为“byType”,而“setHelloApi”方法须要注入HelloApi类型数据,则Spring容器将查找HelloApi类型数据,若是找到一个则注入该Bean,若是找不到将什么也不注入,若是找到多个Bean将优先注入<bean>标签“primary”属性为true的Bean,不然抛出异常来代表有个多个Bean发现但不知道使用哪一个。

 

依赖检查

bean中加dependency-check 用于检查Bean定义的属性都注入数据了,不论是自动装配的仍是配置方式注入的都能检查,若是没有注入数据将报错,从而提早发现注入错误,只检查具备setter方法的属性。

Spring3+也不推荐配置方式依赖检查了,建议采用Java5+ @Required注解方式

 

Bean的做用域

“scope”,在面向对象程序设计中通常指对象或变量之间的可见范围。而在Spring容器中是指其建立的Bean对象相对于其余Bean对象的请求可见范围。

Spring提供“singleton”和“prototype”两种基本做用域,

另外提供“request”、“session”、“global session”三种web做用域;

Spring还容许用户定制本身的做用域。

spring中对bean的管理和建立:

经过BeanDefinition类定义bean描述,记录bean的Class,scope,惟一表示等。

BeanDifinitionRegister,缓存BeanDefinition。

singleton:在SingletonBeanRegister中使用注册表方式,将bean id/name->SingletonBean作缓存,每次请求的时候从注册表Map中获取,有直接返回cache的Bean,没就建立一个Singleton对象返回,并缓存。懒加载的是如上描述第一次请求时建立,其它的是初始化时建立。

prototype:在DefaultBeanFactory.getBean中,先从BeanDifinitionRegister获取BeanDifinition,根据scope决定是new 个Bean仍是从SingletonBeanRegister获取一个bean。

相关文章
相关标签/搜索