spring装配bean

本文深入探讨Spring框架中组件的自动装配与Bean的管理机制,包括@Component、@Configuration、@ComponentScan等注解的使用,以及如何通过@Bean注解在配置类中定义和装配Bean。

 

自动化装配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的构造器中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值