1. Spring Bean 依赖管理
1.1 依赖查找
实际项目中会存在很多个 Bean 对象,这些对象之间会存在一定依赖关系,当某个 Bean 对象依赖于其他 Bean 对象,可以通过 Spring 按照一定的规则(例如按类或者按名字),进行依赖查找然后进行值的注入
思考:
1)对象与对象之间可能存在什么关系?(is a,has a,use a)
例如:
a) is a 关系
class A implements IA {}; A 实现了 IA 接口
class A extends B {}; A 继承了 B 这个类
b) has a 关系
class Point {}
class Circle {
private Point point
}
circle 对象中有一个 Point 类型的对象
c) use a 关系
class ProjectUtil {
public String getId(){
return UUIDrandomUUID().toString();
}
}
在 ProjectUtil 里使用了 UUID 这个类
1.2 依赖注入
在 spring 中对 Bean 属性赋值的过程我们称之为依赖注入,这种注入的实现方式有两种: set 注入和构造注入
set 注入式通过对象的 set 注入是通过对象的 set 方法为对象的属性赋值,构造注入为通过 bean 对象的构造方法为属性注入值
1.2.1. 依赖注入的基本实现
1.1 set 方式实现基本值的注入(重点掌握)
<bean id="dataSource" class="beans.DataSource">
<property name="driverClassName" value="com.jdbc.mysql.Driver"/>
<property name="url" value="jdbc:mysql:///test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
执行 set 注入时引用其他 bean 对象
<bean id="sessionFactory" class="beans.SqlSessionFactory">
<property name="dataSource" ref="dataSource"/>
</bean>
1.2. 构造方法实现基本值的注入(了解)
此注入必须有一个有两个参数的构造方法
<bean id="dataSource" class="beans.DataSource">
<constructor-arg value="10"/>
<constructor-arg value="20"/>
</bean>
执行构造注入时引用其他 bean 对象(必须有对应的构造方法)
<bean id="sessionFactory"
class="beans.SqlSessionFactory">
<constructor-arg ref="dataSource"/>
</bean>
1.2.2 集合类型对象值的注入
对象定义:
public class CollectionObject {
private List<String> list;
private Map<String,Object> map;
private Properties properties;
public void setList(List<String> list) {
this.list = list;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
...
}
对象配置:
<bean id="collection" class="beans.CollectionObject">
<property name="list">
<list>
<value>A</value>
<value>B</value>
</list>
</property>
<property name="map">
<map>
<entry key="k1" value="100" />
<entry key="k2" value="300" />
</map>
</property>
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
1.2.3.依赖注入时 spring
在类路径下定义一个 config.properties 文件,
内容如下:
username=root
password=123456
在 bean 中为属性注入值时使用 spring 表达式
<bean id="dataSource" class="beans.DataSource">
<property name="username" value="#{cfg.username}"/>
<property name="password" value="#{cfg.password}"/>
</bean>
其中#为 spring 表达式特殊标记,{}为表达式内容,cfg 为 util:properties 标记中定义的 id、username、password 为配置文件等号左边的 key
1.3自动装配
Spring 应用中还可以按照一定规则自动为对象属性注入值,此机制借助 Bean 标签中的 autowire 属性进行配置,此属性的值如下几个:
1) default : 不执行自动装配(默认)
2) byName : 按属性名对应的 set 方法名进行自动装配
3) byType: 按属性类型对应的 set 方法相关参数类型进行装配
4) constructor: 按构造方法参数类型进行装配
例如:
<bean id="jdbcTemplate"
class="beans.JdbcTemplate"
autowire="byType">
</bean>
此代码中的自动装配是按照 jdbcTemplat 类中相关属性类型查找对应参数类型的 set 方法,然后再按依据其类型从 spring 容器中查找对应类型的 bean 对象,最后调用对应 set 方法进行值的注入。
本小节中先了解基于 xml 方式配置的自动装配机制(重点在注解方式的应用)
2. 总结
2.1 重点和难点分析
1. Bean 对象的依赖注入(基本值,引用值,集合对象)
2. Bean 对象的自动装配(byName,byType,constructor)
2.2 常见FAQ
1. 自动装配中 byName 和 byType 有什么不同?
2. Spring 表达式在依赖注入中如何使用?
3. ......
2.3 作业
1. 总结本节知识点
2. 完成本节中案例
3. 去了解预习Spring Bean 注解应用
4. 了解 Lru 算法