SpringInAction--自动化装配Bean(隐式装配)
关于Bean的介绍就具体不多介绍了,,,
Spring在配置时候有三种方案可选
1、在xml中进行显示配置
2、在java中进行显示配置
3、隐式的Bean发现机制和自动装配
今天学习的就是自动化装配Bean
Spring又可以从两个角度来实现自动化装配:
1、组建扫描【component scanning】 spring会自动发现应用上下文所创建的bean
2、自动装配【autowiring】 spring自动满足bean之间的依赖
根据Spring In Action的例子 CD插入到CD播放器中才可以播放。。
既然要有CD那么就先创建一个CD的接口类:
package com.bean.auto; /** * Created by IntelliJ IDEA. * Author XueYuan * Data 2017/02/21 * Time 20:55 */ public interface CompactDisc { void play(); }
好了CD接口类创建好了,下面就要选择从众多的CD中选择一个喜欢的歌 那就选择 国荣哥哥的 当年情 吧
package com.bean.auto; import org.springframework.stereotype.Component; /** * Created by IntelliJ IDEA. * Author XueYuan * Data 2017/02/21 * Time 20:56 */ /** * Bean配置方法: * |- @Component 注解表示这个类我要把它创建成bean * |- @Component("XXX") XXX表示bean的标识名字 * |- @Named("XXX") XXX表示bean的标识名字 */ @Component public class DangNianQing implements CompactDisc { private String title = "DangNianQing"; private String artist = "张国荣"; public void play() { System.out.println("Playing " + title + " By " + artist); } }
其实这个类中最重要的是 @Component 这个主要的就是告诉你: 我现在是一个变身成bean家族的一员了,下面你可以追我了啊 哈哈哈:)
@Component("XXX") 与 @Named("XXX") 都是一样的作用,他们三个的区别就是
1、使用的 @Component 的时候如果你没有定义一个bean的名字给他的话,他就会默认给你起一个即类名首字母变小些—— dangNianQIng
2、使用 @Component("XXX") 的时候 跟 1 没有多大区别,就是起得名字不一样 ,比如狗蛋啊 二娃啊啥的
3、使用 @Named("XXX") 的时候 使用的是Java依赖注入规范中提供的@Named注解。Spring大肚能容,两种方式都支持,虽然两者有细微的差异,差异在于@Named要求必须起名字,而@Component则不必要,见 🔎 http://stackoverflow.com/questions/10189531/both-component-and-named-for-the-same-bean-class
好了CD选好了 歌曲也选好了 ,下面就差放入 播放器中 开始享受音乐了
package com.bean.auto; import org.springframework.context.annotation.ComponentScan; /** * Created by IntelliJ IDEA. * Author XueYuan * Data 2017/02/21 * Time 21:07 */ /** * @ComponentScan() * @ComponentScan("xxx") * @ComponentScan(basePackages={"xx"|"xx"}) * 表示开启了bean的扫描 将会扫描当前包下的所有包以及子包 带有 @Component 注解的类 * 当然这个配置也可以在xml配置 * <context:component-scan base-package="包名" /> */ @ComponentScan() public class CDPlayerConfig { }
这个时候 又有多个选择
1、 @ComponentScan() 这个默认的是从当前包及包的儿子查找bean 即 带有@Component 类
2、 @ComponentScan(”xxx“) 从xxx包下查找
3、@ComponentScan(basePackages={"xx"|"xx"}) 自定义从哪个包查找
4、就是在xml中配置的方法
5、再补充个就是 @ComponentScan(basePackageClesses={"xx.calss"|"xx.class"}) 指定某个方法
好了,CD选好了,也放进去了,下面就开始点播放按钮听歌了
package com.bean.auto; 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; /** * Created by IntelliJ IDEA. * Author XueYuan * Data 2017/02/21 * Time 21:41 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = CDPlayerConfig.class) public class CDPlayerTest { @Autowired private DangNianQing dangNianQing; @Autowired private CompactDisc compactDisc; @Test public void cdShoudNotBeNull(){ System.out.println(compactDisc); } @Test public void play(){ dangNianQing.play(); } }
下面就是结果:
以上就是简单的自动装配Bean的方法的一部分,如果错误,请各位同学指出,谢谢!、
代码 https://github.com/eoooxy/springinaction 在test中 com.bean.auto 包下