1.Spring配置的可选方案
① 在XML中进行显示配置
② 在java中进行显示配置
③ 隐式bean的发现机制和自动装配
2.自动创建bean
Spring从两个角度来实现装配bean
① 组件扫描(component scanning):Spring会自动发现应用上下文创建的bean
② 自动装配(autowiring):Spring自动满足bean之间的依赖
@Component 注解,在实现类上声明这个简单的注解会告诉Spring要为这个类创建bean。默认的bean的ID为首字母小写的驼峰命名法的类名,然而你也可以指定bean的ID,@Component("指定的bean的ID")。
3.启动组件扫描
① 基于注解的包扫描
@Configuration 注解,声明这个类是一个Spring的config类文件
@ComponentScan 注解,声明在配置类上,默认扫描同一包下面所有包含@Component 注解的实现类。
另外可以指定这个注解扫描特定的包(因为我们不会把配置文件类和业务代码放在一起),@ComponentScan(basePackages={"*","*",...})
(一般的 @Configuration 和 @ComponentScan 会同时使用在Spring配置类上)
② 基于XML配置的包扫描
<context:component-scan base-package="包名"></context:component-scan>
4.Spring的JUint测试注解
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=配置类.class),这个注解会到这个类下面读取配置文件
5.自动装配bean
自动装配就是让Spring自动满足bean依赖的一种方式,在满足依赖的过程中,会在Spring的应用上下文中寻找匹配某个bean的其他bean
@AutoWired 注解,这个注解可以用在构造器上和setter方法上,可以自动实现对依赖的bean的自动装配
6.通过java代码装配bean
例如声明一个Config类
@Configuration
public class CDConfig {
@Bean
public CompactDisc compactDisc() {
return new SgtPeppers();
}
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc){
return new CDPlayer(compactDisc);
}
}
@Bean 注解,会告诉Spring要返回一个对象,Spring会将该对象应用到上下文中的bean
7.通过XML来装配bean
① 一般bean的装配: <bean id="" class="类的全路径限定名"> </bean>
② 依赖其他bean时: <bean id="" class="类的全路径限定名"> <constructor-arg ref="依赖bean的ID" /></bean>
----需要初始值时: <bean id="" class="类的全路径限定名"> <constructor-arg value="" /></bean>
③ c命名空间声明需要其他bean依赖时:
<bean id="" class="类的全路径限定名" c:构造器参数名称-ref="依赖bean的ID"> </bean> 或者根据构造器参数的索引位置进行DI
<bean id="" class="类的全路径限定名" c:_0-ref="依赖bean的ID" c:_1-ref="依赖bean的ID"> </bean>
----需要出示值时:
<bean id="" class="类的全路径限定名" c:_0-value="" c:_1-value=""> </bean> 或者
<bean id="" class="类的全路径限定名" c:_构造器参数名称-value="" c:_构造器参数名称-value=""> </bean>
④ 传入list类型
值:
<bean id="compactDisc" class="soundsystem.BlankDisc"
c:_0="Sgt. Pepper's Lonely Hearts Club Band"
c:_1="The Beatles">
<constructor-arg>
<list>
<value>Sgt. Pepper's Lonely Hearts Club Band</value>
<value>With a Little Help from My Friends</value>
...
</list>
</constructor-arg>
</bean>
bean:
<bean id="beatlesDiscography" class="soundsystem.Discography"
c:_0="The Beatles">
<constructor-arg>
<list>
<ref bean="list中添加的bean的ID"/>
<ref bean=""/>
...
</list>
</constructor-arg>
</bean>
8.通过属性来装填bean(上面的方式都是通过构造器实现的)
① 首先java属性注入如下:
public class CDPlayer implements MediaPlayer {
private CompactDisc cd;
@Autowired
public void setCompactDisc (CompactDisc cd) {
this.cd = cd;
}
public void play() {
cd.play();
}
}
② 通过XML的方式实现属性的注入:
<bean id="cdPlayer" class="soundsystem.CDPlayer" >
<peoperty name="属性名" ref="bean的ID"/>
<bean/>
③ 使用p命名空间
<bean id="cdPlayer" class="soundsystem.CDPlayer"
p:属性名-ref="bean的ID"/>
9.混合导入与混合配置
① 在javaConfig中引用XML配置
@Configuration
@Import(CDPlayer.class)
public class CDPlayerConfig {
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc) {
return new CDPlayer(compactDisc);
}
}
@Import 注解, 可以指定导入javaConfig
@ImportResource("classpath:*.xml") 注解, 可以导入指定的XML文件
② 在XML中导入javaConfig
<import resource="*.xml"/> ,导入指定的XML文件
<bean class="javaConfig.class"/> , 导入javaConfig只需要以bean的方式配置在XML文件中