2.1 依赖注入的三种方式
在实际环境中,实现 IoC 容器有两种方式:
- 依赖查找:通过资源定位,把对应的资源查找回来
- 依赖注入:程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。
依赖注入有三种方式:
- 构造器注入
- setter 注入
- 接口注入
2.1.1 构造器注入
构造器注入依赖于构造方法实现,可以是有参构造也可以是无参构造。
Spring 根据对应的配置信息通过反射的形式创建对象。
<bean id = "role" class="com.yyh.ssm.Role">
<constructor-arg index="0" value="总经理" />
<constructor-arg index="1" value="公司管理者" />
</bean>
index:构造方法中参数的位置
value: 对应参数的值
2.1.2 setter 注入
setter 注入是 Spring 最主流的注入方式。
使用 setter 注入,我们不需要再写构造方法,通过 setter 注入为其设置对应的值
<bean id="role" class="com.yyh.ssm.Role">
<property name="roleName" value="高级工程师"/>
<property name="note" value="重要人员 />
</bean>
Spring 会通过反射调用没有参数的构造方法生成对象,同时通过反射对应的 setter 注入配置的值。
2.1.3 接口注入
我们经常使用接口来将调用者与实现者分离。
根据预先在配置文件中的设定,动态加载实现类。
2.2 装配 Bean 的概述
将 Bean 装配到 Spring IoC 容器中有三种方式:
- 在 XML 中显示配置
- 在 Java 的接口和类中实现配置
- 隐式 Bean 的发现机制和自动装配原则
2.2.1 通过 XML 装配 Bean
- 装配简单的值
<baen id="role" class=”com.yyh.ssm.Role">
<property name="roleName" value="老师"/>
<property name="user" ref="user"/>
</bean>
- id: Spring 找到这个 Bean 的编号,默认值是 “全限定名#{number}”, 第一次创建 #{number} 为 0,一次增加。
- class: 类的全限定名
- preperty: 定义类的属性
- ref: 可以引用对应的 Bean
- 装配集合
List:
<baen id="role" class=”com.yyh.ssm.Role">
<property name="list">
<list>
<value>1</value>
<value>1</value>
</list>
</property>
</bean>
Map:
<baen id="role" class=”com.yyh.ssm.Role">
<property name="map">
<map>
<entry key="key1" value="value1"/>
<enrty key="key2" value="value2"/>
</map>
</property>
</bean>
Properties:
<baen id="role" class=”com.yyh.ssm.Role">
<property name="props">
<props>
<prop key="key1" value="value1"/>
<prop key="key2" value="value2"/>
</props>
</property>
</bean>
Set:
<baen id="role" class=”com.yyh.ssm.Role">
<property name="set">
<set>
<value>1</value>
<value>2</value>
</set>
</property>
</bean>
Array:
<baen id="role" class=”com.yyh.ssm.Role">
<property name="array">
<array>
<value>1</value>
<value>2</value>
</array>
</property>
</bean>
- 命名空间装配
先引入对应的命名空间和 XML 模式文件。
<beans xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframeword.org/schema/p">
<bean id="role1" class="com.yyh.ssm.Role" c:_0="1" c:_1="role_name_1" c:_2="role_note_1"/>
<bean id="role2" class="com.yyh.ssm.Role" p:id="2" p:roleName="role_name_2" p:roleNote="role_note_2" />
</beans>
- c:_0 代表构造方法的第 1 个参数, c:_1 代表的是第 2 个,c:_2 代表的是第 3 个
- p 代表引用属性, p:id:=“2”, 以 2 为值,使用 setId 方法设置。
2.2.2 通过注解装配 Bean
在 Spring 中,它提供了两种方式来让 Spring IoC 容器发现 Bean:
- 组件扫描:通过定义资源的方式,让 Spring IoC 容器扫描对应的包,从而把 Bean 装配进来。
- 自动装配:通过注解定义,使得一些依赖关系可以通过注解完成。
- 使用 @Component 装配 Bean
@Componet(value = "role")
public class Role {
@value("1")
private Long id;
}
- 注解 @Component 代表 Spring IoC 会把这个类扫描生成 Bean 实例,其中 value 就是这个 Bean 的 id。若不写 value,默认为首字母小写
- 注解 @Value 代表是注入的值。
- 自动装配 @Autowired