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 包下

 

posted @ 2017-02-21 23:16  大园子  阅读(357)  评论(0编辑  收藏  举报