前言
本章讲解Spring的自动注入方式
方法
1.概念
我们知道,之前我们使用的依赖注入都是手动的使用setter或者构造器注入,Spring为了方便我们进行依赖注入,提供了以下的方式进行自动的依赖注入。
- 名称注入(byName):如果要注入的bean的名字和属性名称相同,那么将自动注入
- 类型注入(byType):如果要注入的bean的类型和属性类型相同,那么将自动注入
2.名称注入
1)局部名称注入
我们之前配置dataSource和sqlSessionFactory的时候,使用了如下的方式进行注入:
你可以发现,sqlSessionFactory的属性dataSource名称和数据源名称相同,那么即符合名称注入的要求。
进行如下配置可等效上面的注入方式:
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" autowire="byName">
<!--<property name="dataSource" ref="dataSource"></property>-->
</bean>
可以发现,我们的sqlSessionFactory采用了autowire属性,并且值为byName,意味着将按照名称自动注入!
2)全局名称注入
上面的方式属于在某个bean进行的自动注入方式,可以采用如下配置进行全局的名称注入:
这意味着将全局的依赖注入更改为通过名称的方式,执行效果相同!
2.类型注入
1)局部类型注入
我们之前配置dataSource和sqlSessionFactory的时候,使用了如下的方式进行注入:
我们可以发现,sqlSessionFactory的属性dataSource类型和数据源类型相同,那么即符合类型注入的要求。
进行如下配置可等效上面的注入方式:
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置sqlSessionFactory -->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean" autowire="byType">
<!--<property name="dataSource" ref="dataSource"></property>-->
</bean>
可以发现,我们的sqlSessionFactory采用了autowire属性,并且值为byType,意味着将按照类型自动注入!
2)全局类型注入
上面的方式属于在某个bean进行的自动注入方式,可以采用如下配置进行全局的名称注入:
这意味着将全局的依赖注入更改为通过类型的方式,执行效果相同!
此外:还存在通过构造方法进行的自动注入,用的不多,读者可自行编写测试。
总结:
1.使用byName的注意事项
bean的属性名称必须要和注入的bean的名称相一致否则会报错!
范例:进行如下配置
<!-- 配置数据源 -->
<bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置sqlSessionFactory -->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean" autowire="byName">
<!--<property name="dataSource" ref="dataSource"></property>-->
</bean>
运行测试类查看结果:
2.使用byType的注意事项
注入属性类型的bean有且只有一个,否则会报错!
范例:进行如下配置
<!-- 配置数据源 -->
<bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
</bean>
<bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
</bean>
<!-- 配置sqlSessionFactory -->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean" autowire="byType">
<!--<property name="dataSource" ref="dataSource"></property>-->
</bean>
运行测试类查看结果: