Spring实战系列(二)Bean装配

       Spring容器负责创建应用程序中的Bean,并通过DI(依赖注入)来协调这些对象之间的关系。创建应用组件之间协作的行为通常称为装配。在Spring中,对象无需自己创建或者查找与其所关联的其他对象。

spring装配方式

Spring容器负责创建bean,并通过DI来协调对象之间的依赖关系,对于开发而言,需要告诉Spring哪些bean需要创建并且如何将其装配在一起。Spring提供如下三种主要的装配方式:

  • XML中进行显式的配置
  • 在java中进行显式的配置
  • 隐式的进行bean发现机制以及自动装配

1. 自动化装配bean

     Spring从两个角度实现自动化装配:

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

   下面通过案例说明组件扫描和装配。

1.1 组件扫描

   接口:

package com.spring.demo;

/**
 * animal
 */
public interface Animal {
    /**
     * eat
     */
     void eat();
}

  Animal接口的实现类:

package com.spring.demo;


import org.springframework.stereotype.Component;

@Component
public class Cat implements Animal{

    @Override
    public void eat() {
      System.out.println(" cat is eating !");
    }
}

  实现类中使用了@Component注解,表明该类会作为主键类,并告知spring要为这个类创建bean,不过,组件扫描默认是不启动的,需要显示的配置,并去寻找带有@Component注解的类,并创建bean。

  可使用@ComponentScan注解开启扫描。当@ComponentScan没有配置参数的时候,默认扫当前配置类相同的包,因此Spring将会扫描这个包以及其子包,查找带有@ComponentScan注解的类。

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class AnimalConfig {

}

 @ComponentScan 也可用XML配置,等同于

 下面使用junit进行单元测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AnimalConfig.class)
public class AnimalTest {
    
    @Autowired
    private Cat cat;

    @Test
    public void catNotBeNull(){
        assertNotNull(cat);
        cat.eat();
    }

}

这个bean会被注册进来。

AnimalTest 使用了spring的SpringJUnit4ClassRunner,以便在测试开始的时候自动创建spring的应用上下文,@RunWith就是一个运行器,让测试运行于Spring环境。@ContextConfiguration注解会告诉加载哪些注解,可以是类也可以是配置信息路径。

以上已测试完成组件扫描

1.2  自动装配

下面将来介绍,通过对bean添加注解实现自动装配

创建一个dog类,在cat类中引用,会自动装备dog

package com.spring.demo;

import org.springframework.stereotype.Component;

@Component
public class Dog implements Animal{
    public void eat(){
        System.out.println(" dog is eating ");
    }
}
@Component
public class Cat implements Animal{

    @Autowired
    private Dog dog;

    @Override
    public void eat() {
      System.out.println(" cat is eating !");
      dog.eat();
    }
}

自动装配就是让Spring自动满足bean依赖的一种方法,Spring会在应用上下文中寻找某个匹配的bean需求的其他bean,通过@Autowired注解,声明需要依赖的类,可实现自动装配,@Autowired是通过类型查询,当有多个bean满足的时候,会抛出异常,可结合@Qualifier使用,指定名称。

你可能感兴趣的:(spring,spring)