第二章 装配Bean之spring配置可选方案及自动化装配bean

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;但书上却说是默认将类名的第一个字母变成小写??

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值