(七)装配Bean(1)
针对给接口提供哪一个具体的实现,也就是装配哪一种具体的实现bean,在Spring中提供了多种方式,主要包括3种:
- 一、隐式的bean发现机制和自动装配(自动化装配bean)
- 二、在Java类中进行显式的配置
- 三、在XML中进行显式的配置
一、自动化装配Bean
- 实现方式:
- 组件扫描:Spring会自动发现应用上下文所创建的bean
- 自动装配:Spring自动满足bean之间的依赖。
- 原理:通过spring注解(@Component)来表明该类会作为组件类,并告知Spring要为这类创建bean,不过组件扫描默认是不启动的,需要显式的配置Spring,从而命令Spring去寻找带有(@Component)注解的类,并为其创建bean。
-
案例一
- 编写一个接口类 CD.java
package action; public interface CD { void play(); }
- 编写接口的实现类 CD1.java
package action; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @Component //声明该类是一个组件类,spring会自动为这个类创建一个bean并注册到spring上下文 @Qualifier("cdone") //该注解声明该类的限定符为"cdone" public class CD1 implements CD{ @Override public void play() { System.out.println("IM CD1"); } }
- 编写接口的实现类 CD2.java
package action; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @Component //声明该类是一个组件类,spring会自动为这个类创建一个bean并注册到spring上下文 @Qualifier("cdtwo") //该注解声明该类的限定符为"cdtwo" public class CD2 implements CD{ @Override public void play() { System.out.println("IM CD2"); } }
- 接口类 Player.java
package action; public interface Player { void play(); }
- CDPlayer.java
package action; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @Component("cdp") //声明该类是一个组件类,spring会自动为这个类创建一个id为“cdp”的bean并注册到spring上下文 public class CDPlayer implements Player { @Autowired //自动装配注解,即从spring上下文自动寻找合适的类型注入 @Qualifier("cdone") //被注入CD类对象的限定符为"cdone" private CD cd; @Override public void play() { cd.play(); } }
- CDConfig.java
package config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration //表明该类是一个配置类 @ComponentScan(basePackages="action") //开启扫描,spring默认不开启,必须设置基本包,spring会扫描基本包极其子包中的所有bean public class CDConfig { }
- 编写测试类 Test.java
package test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import config.CDConfig; import action.CDPlayer; public class Test { public static void main(String[] args) { ApplicationContext content=new AnnotationConfigApplicationContext(CDConfig.class); CDPlayer cdPlayer=(CDPlayer)content.getBean("cdp"); cdPlayer.play(); } }
结果:
IM CD1
- 注意 :
1. @Autowired可以用在构造器,属性,任何方法前,spring在初始化bean的时候会尽可能去满足bean的依赖,每个使用了该注解的方法都会执行,但一般注入采用一种就可以。
2.如果没有匹配的bean,那么在上下文创建的时候就会抛异常,为了避免,可将@Autowired的required的属性设为false,但你代码如果没判空,可能会出现空指针。
3.@Autowired默认按类型自动注入,就是说如果,注入的时候根据类型去寻找,找不到抛找不到异常;找到一个则注入;找到多个则再根据名字去找,如果根据名字(字段名)找不到则抛找到多个异常,找到则注入;