一、注入的数据以及方式
(一)能够注入的数据
1、基本类型和String类型
2、其他bean类型(在配置文件中或者注解配置过的bean)
3、复杂类型/集合类型
(二)注入的方式
1、使用构造函数提供
2、使用set方法提供
3、使用注解提供
二、构造函数注入
假设有一个如下的接口:
1 | public interface IAccountService { |
其一个实现类如下:
1 | public class AccountServiceImpl implements IAccountService { |
使用构造函数注入的方式如下:
1 | <bean id="accountService" class="com.zuobiao.service.impl.AccountServiceImpl"> |
不难发现,在constructor-arg标签中一共使用了其5个属性。
其实它们的区别如下:
1 | 前三个:找到赋值的参数 |
关于构造函数注入的利与弊:
利:在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功
弊:改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供
三、set方法注入
(一)非复杂类型
假设IAccountService接口不变,但是其实现类变为:
1 | public class AccountServiceImpl2 implements IAccountService { |
针对这种情况,我们就需要使用set方法进行注入。如下:
1 | <bean id="accountService2" class="com.zuobiao.service.impl.AccountServiceImpl2"> |
在该种情况下property标签的属性只会有3种取值,分别为:
1 | name:用于指定注入时所调用的set方法名称 |
关于set方法注入的利与弊:
利:创建对象时没有明确的限制,可以直接使用默认构造函数
弊:如果有某个成员必须有值,但获取对象时有可能set方法没有执行的,不能保证某个成员有值
(二)复杂类型
假设IAccountService接口不变,但是其实现类变为:
1 | public class AccountServiceImpl3 implements IAccountService { |
则,其利用set方法进行注入的配置如下:
1 | <bean id="accountService3" class="com.zuobiao.service.impl.AccountServiceImpl3"> |
但其实下列配置方式也是可以执行的:
1 | <bean id="accountService3" class="com.zuobiao.service.impl.AccountServiceImpl3"> |
通过观察,我们很容易发现:
数组、List、set中使用的标签可以相互交换使用;
map、props中使用的标签也可以相互交换使用。
其实这个猜测是正确的,因此我们在开发时只要记住以下结论即可:
结构相同,标签可以互换
四、注解方式注入
SSM-Spring【常用注解整合】中的第二点第(二)小点有总结用于注入数据的注解;
SSM-Spring【IOC进阶三】的案例中有使用用于注入数据的注解。
Java新手,若有错误,欢迎指正!