组件扫描( component scanning) : Spring会自动发现应用上下文中所创建的bean。
自动装配( autowiring) : Spring自动满足bean之间的依赖。
通过@Component注入bean
import org.springframework.stereotype.Component;
@Component
public class SgtPeppers implements CompactDisc {
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "The Beatles";
public void play() {
System.out.println("Playing " + title + " by " + artist);
}
}
通过@Autowire构造器注入或set方法注入
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class CDPlayer implements MediaPlayer {
private CompactDisc cd;
@Autowired
public CDPlayer(CompactDisc cd) {
this.cd = cd;
}
public void play() {
cd.play();
}
}
通过@ComnentScan注解启用组件扫描,扫描类所在包以下,@Configuration声明配置类
@Configuration
@Component
public class CDPlayerConfig{
}
或者直接通过xml配置启用组件扫描,扫描指定包以下
<context:conponent-scan base-package="soundststem">
这样,spring容器自动从指定包下装载含有@component的类和实例成员属性。
在进行显式配置时, JavaConfig是更好的方案,因为它更为强大、 类型安全并且对重构友好。 因为它就是Java代码,就像应用程序中的其他Java代码一样。尽管不是必须的, 但通常会将JavaConfig放到单独的包中, 使它与其他的应用程序逻辑分离开来。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CDPlayerConfig {
@Bean
public CompactDisc compactDisc() {
return new SgtPeppers();
}
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc) {
return new CDPlayer(compactDisc);
}
}
创建JavaConfig类的关键在于为其添加@Configuration注解, @Configuration注解表明这个类是一个配置类, 该类应该包含在Spring应用上下文中如何创建bean的细节。要在JavaConfig中声明bean, 我们需要编写一个方法, 这个方法会创建所需类型的实例, 然后给这个方法添加@Bean注解。@Bean注解会告诉Spring这个方法将会返回一个对象, 该对象要注册为Spring应用上下文中的bean。 方法体中包含了最终产生bean实例的逻辑。
借助JavaConfig实现注入
构造方法:
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc) {
return new CDPlayer(compactDisc);
}
setter方法:
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc) {
CDPlayer cdPlayer = new CDPlayer(compactDisc);
cdPlayer.setCompactDisc(compactDisc);
return new cdPlayer;
}
在使用XML为Spring装配bean之前, 你需要创建一个新的配置规范。在使用JavaConfig的时候, 这意味着要创建一个带有@Configuration注解的类, 而在XML配置中, 这意味着要创建一个XML文件, 并且要以元素为根。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
beans>
声明一个bean
id="compactDisc" class="soundsystem.BlankDisc">
构造器注入方式配置
<bean id="cdPlayer" class="soundsystem.CDPlayer">
<constructor-arg ref="compactDisc" />
bean>
setter属性方式注入
id="cdPlayer" class="soundsystem.properties.CDPlayer">
<property name="compactDisc" ref="compactDisc" />
以上这些配置方案都不是互斥的,我们可能会同时使用自动化和显式配置,根据自身的需求进行选择即可。