自动化装配bean
@Component:
把普通Pojo实例化到Spring容器中,相当于配置文件中的<bean id="" class="">,表名该类会作为组件类,并告知Spring要为这个类创建bean。一般在spring应用上下文中,尽管我们没有明确的为bean设置ID,但Spring会根据类名为其指定一个ID,默认为将类名的第一个字母变为小写。
例如下图,该bean默认ID为compactDise
@Component
public class SgtPeppers implements CompactDise{
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "The Beatles";
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("Playing "+title+" by "+artist);
}
}
如果想为该bean设置不同的ID如下图所示,该bean的ID为“cd”
@Component("cd")
public class SgtPeppers implements CompactDise{
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "The Beatles";
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("Playing "+title+" by "+artist);
}
}
@Configuration:
用于定义配置类,可替换XML配置文件。
@Configuration
public class CDPlayerConfig {
}
@ComponentScan:
启用组件扫描,查找与配置类相同包下带有@Component注解的类,并且在Spring中自动创建一个bean,相当与配置文件中的<context:component-scan base-package="">。
如下图所示,我们没有为@CompomentScan设置任何属性,这以为着按照默认的规则,它会以当前列所在的包作为基础包。
@ComponentScan
public class CDPlayerConfig {
}
若要扫描不同的包,所需要做的就是在@CompomentScan的value属性中指明包的名称。想要更加清晰的表明是基础包,可以通过basePackages属性进行设置--》@CompomentScan(basePackages="basePackage1")
多个基础包--》@CompomentScan(basePackages={"basePackage1","basePackage2"})
@CompomentScan还提供了另外一种方法,就是将其指定为包中包含的接口或类@CompomentScan(basePackages={XXX.class,XXX.class})
@Configuration
@ComponentScan("basePackage1")
public class CDPlayerConfig {
}
@Autowried:
自动装配。简单来说,自动装配就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring应用的说下文中查找匹配某个bean需求的其他bean。
例如下图,在CDPlay类的构造方法上添加@Autowried注解,这表明当Spring创建CDPlaybean时,会通过这个构造器来进行实例化并传入一个可设置给CompactDisc类型的bean.
public class CDPlay implements MediaPlayer{
private CompactDise cDise;
@Autowired
public CDPlay(CompactDise cd) {
// TODO Auto-generated constructor stub
this.cDise = cd;
}
@Override
public void play() {
// TODO Auto-generated method stub
cDise.play();
}
}
@Autowried不只是只能注解在构造器上,不管是构造器、Setter方法或什么方法甚至是变量,Spring都会满足所声明的依赖。
如果没有匹配到对应的bean,Spring会抛出一个异常。为了避免异常的出现,可将@Autowried的required属性设置为false。
设置required属性时需要谨慎对待,如果代码中没有进行null检查时,这个未装配状态的属性有可能会出现NullPointerException。
通过Java代码装配bean
@Bean:
@Bean注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean。默认情况下,bean的ID与带有@Bean注解的方法名是一样的。例如下图bean的ID为"sgtPeppers"。
如果想要bean的ID与方法名不一样,可以用@Bean(name="")进行指定。
@Configuration
public class CDPlayerConfig {
@Bean
public CompactDise sgtPeggers() {
return new SgtPeppers();
}
}
通过XML装配Bean
创建XML配置规范
配置Bean
创建完成后,使用<bean></bean>元素对bean进行声明。
<bean class="soundsystem.SgtPeppers"></bean>
如上所示,该图中声明了一个简单的bean,创建这个bean的类通过class属性来指定,并且要使用全限定的类名。因为没有指定ID,
所以bean的ID将会是"soundsystem.SgtPeppers#0",其中"#0"是一个计数的形式,用来区分相同类型的bean,如果声明了另外一个"SgtPeppers",那么它的名字将会是"soundsystem.SgtPeppers#1"。
如想自定义名字,可借助id属性。如下:
<bean id="SgtPeppers" class="soundsystem.SgtPeppers"></bean>
借助构造器注入初始化bean
<bean id="CDPlay" class="tow.soundsystem.CDPlay">
<constructor-arg ref="SgtPeppers"></constructor-arg>
</bean>
如上图,当Spring遇到这个<bean>元素时,会创建一个CDPlay实例。<constructor-arg>元素会告知Spring要将一个ID为"SgtPeppers"的bean引用传递到CDPlay的构造器中。