a02-1 装配Bean-自动化装配(Spring实战)

  • 创建对象之间的协作关系称为装配,这也就是依赖注入的本质

本篇内容

  • 1、Spring自动化装配
  • 2、实现组件扫描
  • 3、bean实现自动化装配

1、Spring在装配方式有三种:

  • 1、在Xml中进行显示配置
  • 2、在java中进行显示配置
  • 3、隐式的bean发现机制和自动化装配

2、自动化装配bean

  • 1、组件扫描:Spring会自动发现应用上下文所创建的bean
  • 2、自动装配:Spring自动满足bean之间的依赖

一、自动化装配

1、定义接口

public interface CompactDisc {
    void play();
}

2、定义实现类

@Component
public class CDPlayer implements CompactDisc {
    public void play() {
        System.out.println("CD-Player  playing ... ... ");
    }
}
  • 注解说明
  • @Component:表明该类会作为组件类并告知Spring要为这个类创建bean

3、定义配置类

  • 定义Spring装配规则
@Configuration
@ComponentScan
public class CDConfig {
}
  • 说明:
  • @ComponentScan:这个注解能够在Spring中启用组件扫描,默认会扫描与配置相同的包

4、测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDConfig.class)
public class CDPlayerTest {
    @Autowired
    private CompactDisc compactDisc;
    @Test
    public void getBean() {
        compactDisc.play();
    }
}
  • 注解说明:
  • 1、使用SpringJUnit4ClassRunner便于在测试的时候自动创建Spring的应用上下文
  • 2、@ContextConfiguration:需要加载的配置
  • 3、@Autowired将对象注入到代码中

5、为组件扫描的bean命名

  • Spring应用上下文中所有的bean都有一个给定的ID,spring会根据类名给对象一个id,类名字母为小写
  • 给类配置固定的id
5.1、使用@component
@Component("pagger")
public class CDPlayer implement CompactDisc{}
5.2、使用@Named
@Named("pagger")
public class CDPlayer implement CompactDis{}

二、设置组件扫描的基础包

@Configuration
@ComponentScan(“com.demo”)
public class CDPlayerConfig{}
  • 说明:
  • 1、@ComponentScan(“com.demo”):指定了扫描的基础包名称
  • 2、@ComponentScan(basePackages=“com.demo”)使用这种方式更加清晰表示为包名

1、设置多个包扫描地址:

  • basePackages是复数知道可以设置多个包名,但是设置多个包名是不安全的行为

@ComponentScan(basePackages={“com.demo.service”,“com.demo.dao”})

2、指定包中的类或接口


@ComponentScan(basePackageClasses={UserDao.class,UserService.class})


三、给bean实现自动装配

  • 自动装配就是让Spring自动满足bean依赖的方法,在满足依赖的过程中会在Spring应用中寻找匹配某个bean需求的其他bean。

1、创建接口

public interface CompactDisc {
    void play();
}

2、创建实现类

@Component
public class SgtPepper implements CompactDisc {
    public void play() {
        System.out.println("Sgt Pepper play ... ... ");
    }
}

3、创建实现类

@Component
public class CDPlayer {
    private CompactDisc compactDisc;
    @Autowired
    public CDPlayer(CompactDisc compactDisc) {
        this.compactDisc = compactDisc;
    }
    public void play() {
        compactDisc.play();
    }
}

4、创建配置类

@Configuration
@ComponentScan
public class CDConfig {
}

5、测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDConfig.class)
public class CDPlayerTest {
    
    @Autowired
    private CompactDisc compactDisc;
    @Autowired
    private CDPlayer cdPlayer;
    @Test
    public void showBean(){
        compactDisc.play();
    }
    @Test
    public void getBean() {
        cdPlayer.play();
    }
}

6、CDPlayer其他方式注入

    @Autowired
    public void setCompactDisc(CompactDisc compactDisc) {
        this.compactDisc = compactDisc;
    }
    @Autowired
    public void initCompactDisc(CompactDisc compactDisc) {
        this.compactDisc = compactDisc;
    }

7、注意

  • 1、如果没有匹配的bean在应用上下文创建时会抛出异常,为了避免异常可以给@Autowired添加属性
@Autowired(required=false)
  • 2、使用@Inject注解代替Autowired
  • Autowired是spring特有的注解,Inject是java规范的注解

代码地址:


https://github.com/brusion/brusion-code/tree/master/demo-java/03%20-%20demo%20-%20spring/spring-demo-study/01-di 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容