第4.37课 上课 配置依赖关系, 管理Bean, Bean的作用域, 框架的核…
4_37

配置依赖关系
配置依赖关系的本质:通过<property>元素调用setter方法,或通过<constructor-arg>元素调用有参数的构造器.
无论是调用setter方法,还是调用构造器,都需要传入参数,参数类型有如下几种:
- 标量类型,用value属性或value子元素传入值.
- 引用类型
a.用ref属性或ref子元素.
b.嵌套Bean传入值.
c.自动装配.
- List、Set、Map等集合以及数组.
依赖注入配置方式: 无论你是设值注入,还是构造器注入,都需要传入参数值.根据不同的参数值类型,可以采用不同的配置方式:
- 参数值类型为标量类型:用value元素或属性,p:setter方法去掉set=值
- 参数值类型为复合类型:
a. 用ref元素或属性,p:setter方法去掉set-ref=容器中已有的Bean
b. 嵌套Bean.
c. 自动装配.
- 参数值类型为List、Set、Map、Properties等集合.
标量类型
<!-- 配置Bean:
id : Bean的唯一标识符
class : 指定类(包名 + 类名)
p:salary : 为标量类型setter方法设置值
-->
<bean id="userService" class="com.yayadou.spring.UserService"
p:salary="5900.89">
<!-- setter方法为标量类型 -->
<property name="name">
<value>admin</value>
</property>
<!-- setter方法为标量类型 -->
<property name="age" value="20"/>
</bean>
用value属性或value子元素传入值
参数值类型为标量类型:用value元素或属性,p:set方法名去掉前面的set=值.
引用p短名命名空间
引用p短名命名空间,简化setter方法参数的传入。
xmlns:p="http://www.springframework.org/schema/p"
List、Set、Map、数组、Properties等
引用类型
用ref属性或ref子元素
用ref元素或属性: p:setter方法去掉set-ref=容器中已有的Bean.
<!-- setter方法为引用类型 (第一种方式)
ref : 引用容器中已有的bean -->
<property name="userService" ref="dao"/>
<!-- setter方法为引用类型 (第二种方式)
ref : 引用容器中已有的bean -->
<property name="userService">
<ref bean="dao"/>
</property>
嵌套Bean传入值
<!-- setter方法为引用类型 (第三种方式)
bean: 嵌套Bean传入值 -->
<property name="userService">
<bean class="com.yayadou.spring.UserService" p:name="admin" p:age="30" p:salary="8900.78"/>
</property>
自动装配
自动装配:指定容器中的两个Bean,不需要程序显式使用ref配置它们的依赖关系,
直接让容器根据某种规则执行注入即可.
自动装配使用autowire属性进行设置,该属性支持如下属性值:
- no|default: 不使用自动装配,Bean依赖必须通过ref元素定义。这是默认的配置。
- byName: 根据setter方法名来自动装配。BeanFactory查找容器中全部Bean,
找出其中id属性与setter方法名去掉set前缀后同名的Bean来完成注入.
如果没有找到匹配的Bean实例,则Spring不会进行任何注入.
- byType: 根据setter方法形参类型来自动装配.
BeanFactory查找容器中全部Bean,如果正好有一个Bean类型与setter形参类型匹配,
就自动注入这个Bean,如果有多个这样的Bean,就抛出一个异常,
如果没有匹配的Bean,则Spring不会进行任何注入.
- constructor: 与byType类似,区别是用于构造注入的参数.
如果BeanFactory中不是恰好有一个Bean与构造器参数类型相同,则会抛出一个异常.
autowire-candidate="false|true",用于指定该Bean是否可作为自动装配的候选者.
<!-- 配置Bean:
id : Bean的唯一标识符
class : 指定类(包名 + 类名)
p:salary : 为标量类型setter方法设置值
autowire-candidate="false|true"用于指定该Bean是否可作为自动装配的候选者.
-->
<bean id="userService" autowire-candidate="false" class="com.yayadou.spring.UserService"/>
<!-- 配置Bean:
id : Bean的唯一标识符
class : 指定类(包名 + 类名)
autowire : 自动装配
no: 不使用自动装配(默认的配置).
byName: 根据setter方法名来自动装配.
byType: 根据setter方法形参类型来自动装配.
constructor: 与byType类似,区别是用于构造注入的参数.
-->
<bean id="adminService" class="com.yayadou.spring.AdminService" autowire="byType"/>
no不使用自动装配
no: 不使用自动装配,Bean依赖必须通过ref元素定义.【这是默认的配】
byName根据setter方法名来自动装配
byName: 根据setter方法名来自动装配。BeanFactory查找容器中全部Bean,
找出其中id属性与setter方法名去掉set前缀后同名的Bean来完成注入.
如果没有找到匹配的Bean实例,则Spring不会进行任何注入.
byType根据setter方法形参类型来自动装配
byType: 根据setter方法形参类型来自动装配.
BeanFactory查找容器中全部Bean,如果正好有一个Bean类型与setter形参类型匹配,
就自动注入这个Bean,如果有多个这样的Bean,就抛出一个异常,
如果没有匹配的Bean,则Spring不会进行任何注入.
constructor跟byType类似
constructor: 与byType类似,区别是用于构造注入的参数.
如果BeanFactory中不是恰好有一个Bean与构造器参数类型相同,则会抛出一个异常.
管理Bean
Spring管理Bean:
a.Spring管理的Bean,就是最普通的Java对象.
b.开发者使用Spring框架所做的主要是两件事:①:开发Bean;②:配置Bean.
c.对于Spring框架来说,它要做的就是根据配置文件来创建Bean实例,并调用Bean实例的setter方法完成“依赖注入”
这就是所谓IoC的本质.
Spring框架的本质:根据XML配置驱动Java代码,将Java代码的耦合提升到XML配置中管理——这就是所谓的解耦.
Bean的作用域
Bean的作用域:
何谓作用域,通俗来说就是活多久.
可通过<bean.../>元素的scope来配置作用域,作用域支持如下属性:
singleton、prototype、request、session.
<!-- 配置Bean:
id : Bean的唯一标识符
class : 指定类(包名 + 类名)
scope : Bean的作用域
singleton : 单例
prototype: 不会预初始化,new一个新的实例
request:对应web应用中的request作用域
session:对应web应用中的session作用域
-->
<bean id="userService" class="com.yayadou.spring.UserService" scope="singleton"></bean>
singleton单例
singleton:单例,无论何时,程序通过Spring容器中取出的总是同一个实例,Spring默认采用该模式.
1. 预初始化,容器出现,它就出现.
2. 容器死,它才死.
说明: 无论何时,程序去获取该Bean时,该Bean总是最初的那一个.
prototype不会预初始化
prototype: 不会预初始化,每次通过Spring容器中获取实例,Spring都会new一个新的实例返回.
程序请求prototype Bean时,容器就创建一个全新的Bean返回出来。容器不再管该bean.
只要程序不再需要该Bean,容器根本不管该Bean,该Bean就会被垃圾回收.
request对应Web应用request作用域
request:对应web应用中的request作用域,只在Web项目中有效,相当于在一次请求中是singleton.
session对应web应用session作用域
session:对应web应用中的session作用域,只在Web项目中有效,相当于在一次会话中是singleton.
框架的核心
Spring框架的核心:
1.通过XML配置去驱动Java代码.
要求:眼中看到XML配置,心中想的是对应的Java代码.
Spring掌握的很熟练:所有的Java代码,只要别人给了Java代码,你就可以用Spring配置文件将它配出来.
浙公网安备 33010602011771号