装配bean
注解 | 释义 |
---|---|
@Component | 表明该类会作为组件类,并告知Spring要为这个类创建bean |
@Component(“beanID”) | 为组件扫描的bean命名 |
@Named(“beanID”) | 同上 |
@ComponentScan | 默认扫描与配置类相同的包 |
@ComponentScan(“packageName”) | 设置组件扫描的基础包 |
@Configuration | 配置spring并启动spring容器 |
@AutoWired | 声明依赖 |
@AutoWired(required=false) | Item Two |
依赖注入的本质:装配(wiring)–创建应用对象之间的协作关系的行为
2.1 Spring配置的可选方案
- 在XML中进行显式配置
- 在Java中进行显式配置
- 隐式的bean发现机制和自动装配
根据项目的需要进行自主选择,最棒的是,可以组合使用,即你可以选择使用XML装配一些bean,使用Spring基于java的配置(JavaConfig)来装配另一些bean,而将剩余的bean让Spring去自动发现。
2.2 自动化装配bean
Spring从两个角度来实现自动化装配:
+ 组件扫描:Spring会自动发现应用上下文中所创建的bean
+ 自动装配:Spring自动满足bean之间的依赖
2.2.1 创建可被发现的bean
通过注解@Component表明该类会作为组件类,并告知Spring要为这个类创建bean
通过注解@ComponentScan默认扫描与配置类相同的包
或者,通过XML来启用组件扫描
<beans>
<context:component-scan base-package="packageName" />
</beans>
2.2.4 通过为bean添加注解实现自动装配
package soundsystem
import *;
@component
public class CDPlayer implements MediaPlayer{
private CompactDisc cd;
@AutoWired
public CDPlayer(CompactDisc cd){
this.cd = cd;
}
public void play(){
cd.play();
}
}
通过自动装配,将一个CompactDisc注入到CDPlayer之中
@AutoWired注解不仅能够用在构造器上,还能用在属性的setter方法上。
与@Inject效果类似
2.3 通过java代码装配bean
2.3.1 创建配置类
package soundsystem
import *;
@Configuration
public class CDPlayerConfig{
}
创建JavaConfig类的关键在于为其添加@Configuration注解,@Configuration注解表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。
2.3.2 声明简单的bean
@Bean
public CompactDisc sgtPeppers(){
return new SgtPeppers();
}
@Bean注解会告诉Spring这个方法会返回一个对象,该对象要注册为Spring应用上下文中的bean。方法体中包含了最终产生bean实例的逻辑。
bean的ID有默认值,也可通过@Bean(name=”abc”)来设置
2.3.3 借助JavaConfig实现注入
2.4 通过XML装配bean
2.4.3 借助构造器注入来初始化bean
在XML中声明DI时,会有多种可选的配置方案和风格。具体到构造器注入,有两种基本的配置方案可供选择:
+ 元素
+ 使用Spring3.0引入的c-命名空间
<bean id="cdPlayer" class="soundsystem.CDPlayer"
<constructor-arg ref="compactDisc" />
</bean>
<bean id="cdPlayer" class="soundsystem.CDPlayer"
c:cd-ref="compactDisc" />
c: c-命名空间前缀
cd 构造器参数名
-ref 注入bean引用
compactDisc 要注入的bean的ID
将字面量注入到构造器中
<bean id="compactDisc" class="soundsystem.BlankDisc"
<constructor-arg value="Sgt.Pepper's Lonely Hearts Club Band" />
<constructor-arg value="The Beatles" />
</bean>
<bean id="compactDisc" class="soundsystem.BlankDisc"
c:_title="Sgt.Pepper's Lonely Hearts Club Band"
c:_artist="The Beatles" />
或
<bean id="compactDisc" class="soundsystem.BlankDisc"
c:_0="Sgt.Pepper's Lonely Hearts Club Band"
c:_1="The Beatles" />
装配集合
<bean id="compactDisc" class="soundsystem.BlankDisc"
<constructor-arg value="Sgt.Pepper's Lonely Hearts Club Band" />
<constructor-arg value="The Beatles" />
<constructor-arg>
<list>
<value>Sgt.Pepper's Lonely Hearts Club Band</value>
<value>a</value>
<value>b</value>
<value>c</value>
</list>
</constructor-arg>
</bean>
<bean id="compactDisc" class="soundsystem.BlankDisc"
<constructor-arg value="Sgt.Pepper's Lonely Hearts Club Band" />
<constructor-arg value="The Beatles" />
<constructor-arg>
<list>
<ref bean="beanID1" />
<ref bean="beanID2" />
<ref bean="beanID3" />
</list>
</constructor-arg>
</bean>
2.4.4 设置属性
- 构造器注入
- 属性注入(setter方法注入)
强依赖使用构造器注入,可选性的依赖使用属性注入
<bean id="cdPlayer" class="soundsystem.CDPlayer"
<property name="compactDisc" ref="compactDisc" />
</bean>
<bean id="cdPlayer" class="soundsystem.CDPlayer"
p:compactDisc-ref="compactDisc" />
元素为属性的setter方法所提供的功能与元素为构造器所提供的功能是一样的。
将字面量注入到属性中
2.5 导入和混合配置
2.5.1 在JavaConfig中引用XML配置
package soundsystem;
import *;
@Configuration
@Import(CDPlayerConfig.class)
@ImportResource("classpaht:cd-config.xml")
public class SoundSystemConfig{
}
2.5.2 在XML配置中引用JavaConfig
<bean class="soundsystem.CDConfig" />
<bean id="cdPlayer" class="soundsystem.CDPlayer"
c:cd-ref="compactDisc" />
<import resource="cdplayer-config.xml" />