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 id="helloApi" class="cn.javass.spring.chapter2.helloworld.HelloImpl" lazy-init="true"/>
指指定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”做用域的必定不能,其余做用域不必定能;后边再介绍。
经过设置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注解方式
“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。