2.1 Spring配置的可选方案
主要有三种:
a)在xml中进行显式配置;
b)在java中进行显式配置;
c)隐式的bean发现机制和自动装配;
并没有规定说一定要用某一种方案,三种方案根据情况以及个人喜好而决定,也可以混合使用。但推进:尽可能使用自动配置的机制。显式配置越少越好。但当你必须使用显式配置的时候,推荐使用类型安全并且比xml更加强大的JavaConfig.最后只有当你想要使用便利的xml命名空间,并且在JavaConfig中没有同样的实现时才应该使用xml.
2.2 自动化装配bean.
spring从两个角度来实现自动化装配:
1.组件扫描(component scanning):spring会自动发现应用上下文所创建的bean.
2.自动装配(autowiring):spring自动满足spring之间的依赖。
定义CD的一个接口以及带有@Component注解的CompactDisc实现类SgtPeppers:
package ssoundsystem;
public interface CompactDisc{
void play();
}package soundsystem;
import org.springframework.stereotype.Component;
@Component
public class SgtPeppers implements CompactDisc {
private String title = "Sgt. Peppert's Lonely Hearts Club Band";
private String artist = "The Beatles";
public void play() {
// TODO Auto-generated method stub
System.out.println("Playing "+title+" by "+artist);
}
}
定义一个java配置类以及xml配置文件,用于自动扫描组件。
package soundsystem;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration //使用java配置类
@ComponentScan(basePackages={"soundsystem"})//多个可用逗号隔开,不写这个默认当前包
//@ComponentScan(basePackageClasses{CDPlayer.class}) 已类所在的包为基础包,多个可用逗号分开
public class CDPlayerConfig {
}
定义一个Player接口及实现类及测试文件
package soundsystem;
public interface MediaPlayer {
void play();
}package soundsystem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("aa")
public class CDPlayer implements MediaPlayer {
//@Autowired
private CompactDisc cd;
@Autowired
public CDPlayer(CompactDisc cd){
System.out.println("CDPlayer");
this.cd = cd;
}
public void play() {
// TODO Auto-generated method stub
cd.play();
}
@Autowired
public void insertCd(CompactDisc cd){
System.out.println("insertCd");
this.cd = cd;
}
}package soundsystem;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayerTest {
@Autowired
private CompactDisc cd;
@Autowired
private MediaPlayer player;
@Test
public void cdShouldNotBeNull(){
cd.play();
}
@Test
public void testPlay(){
player.play();
}
}
总结:
1.@Autowired可以用在构造器,属性,任何方法前,spring在初始化bean的时候会尽可能去满足bean的依赖,每个使用了该注解的方法都会执行,但一般注入采用一种就可以。
2.如果没有匹配的bean,那么在上下文创建的时候就会抛异常,为了避免,可将@Autowired的required的属性设为false,但你代码如果没判空,可能会出现空指针。
3.@Autowired默认按byType自动注入,就是说如果,注入的时候根据type去寻找,找不到抛找不到异常;找到一个则注入;找到多个则再根据名字去找,如果根据名字(字段名)找不到则抛找到多个异常,找到则注入;
4.@Qualifier 指定注入 Bean 的名称 当使用该注解时,会直接根据该名字去寻找,不会根据类型去找,找到一个则注入。找不到则抛异常,找到多个也抛。该作用域比字段名大。
4.@Component如果不指明id,则会以类名作为id;但书上却说是默认将类名的第一个字母变成小写??