《Spring实战》第二章 — 装配Bean

2.1 Spring装配Bean的可选方案

  • 在XML中进行显示配置;
  • 在Java中进行显示配置;
  • 隐式的Bean发现机制和自动装配;

2.2 自动化装配Bean

  • 扫面组件(component scanning):Spring会自动发现应用程序上下文中所建立的Bean;
  • 自动装配(autowiring):Spring自动知足Bean之间的依赖;

2.1.1 建立可被发现的Bean

    须要在类上使用@Component注解:java

@Component
public class Car ...

    而后在Java配置类中开启组件扫描:函数

@Configuration
@ComponentScan
public class AppConfig ...

    若是使用XML来自用组件扫描的话:ui

<context:component-scan base-package="你的包" />

    自动装配被@Component修饰的Bean:this

@ContextConfiguration(classes=AppConfig.class)
public class CarTest {
    @Autowired
    private Car car;

    ...
}

2.2.2 为组件扫描的Bean命名

    Spring应用上下文中全部的Bean都会有一个ID。若是没有明确设置Bean的ID,那么ID就是将类名的第一个字母变为小写,例如Car对象的ID就是car。spa

    若是须要自定义Bean的ID:code

@Component("miniCar")
public class Car ...

    还可使用Java依赖注入规范中所提供的@Named注解来设置:component

@Named("miniCar")
public class Car ...

2.2.3 设置组件扫描的基础包

    若是使用@ComponentScan来打开自动扫描Bean,若是不设置指定扫描的包名的话,它会按照默认规则,以配置类所在的包做为基础包来扫描。xml

    但也能够手动设置:对象

@Configuration
@ComponentScan("你的包名")
public class AppConfig ...

    还能够设置多个包:接口

@Configuration
@ComponentScan(basePackages={"包1", "包2"})
public class AppConfig ...

    另外,能够指定包中所包含的类或接口:

@Configuration
@ComponentScan(basePackageClasses={Car.class, Xxx.Class})
public class AppConfig ...

2.2.4 为Bean添加注解实现自动装配

    为了声明要进行自动装配,可使用@Autowired注解。

@Component
public class Driver {
    private Car car;
    
    @Autowired
    public Driver(Car car) {
        this.car = car;
    }
}

    上面是经过构造函数注入,还能够经过setter方法注入:

@Autowired
public void setCar(Car car) {
    this.car = car;
}

    实际上,setCar()方法没有任何特殊之处,@Autowired注解能够用在类的任何方法上,例如:

@Autowired
public void insertCar(Car car) {
    this.car = car;
}

    若是没有匹配到Bean,那么在应用上下文建立的时候,Spring会抛出一个异常,为了不异常的出现,能够将@Autowired的required属性设置为false:

@Autowired(required=false)
public void setCar(Car car) {
    this.car = car;
}

    在设置required等于false时,若是在代码中没有进行null检查,而使用这个未匹配到的Bean对象的话,可能会出现NullPointerException异常。

    Java依赖注入规范也提供了@Inject替代@Autowired:

@Named
public class Driver {
    private Car car;
    
    @Inject
    public Driver(Car car) {
        this.car = car;
    }
}

2.3 经过Java代码装配Bean

    尽管在不少场景下经过组件扫描和自动装配实现Spring的自动化配置是更为推荐的方式,可是有时候自动装配的方案行不通,所以须要明确配置Spring。好比说,要将第三方库中的组件装配到你的应用中,是没有办法在它的类上添加@Component和@Autowired注解的,所以就不能使用自动化装配方案了。

2.3.1 声明简单的Bean

    在配置类中,编写一个方法建立所需类型的实例,而后给这个方法添加@Bean注解:

@Configuration
public class AppConfig {
    @Bean
    public Car car() {
        return new Car();
    }    
}

    也能够给这个Bean重命名:

@Configuration
public class AppConfig {
    @Bean(name="miniCar")
    public Car car() {
        return new Car();
    }    
}

2.3.2 注入声明的Bean

    在配置中最简单的方式就是引用建立的bean方法,例如:

@Configuration
public class AppConfig {
    @Bean
    public Car car() {
        return new Car();
    }

    @Bean
    public Driver driver() {
        return new Driver(car());
    }
}

    上面的代码中,给每一个司机一辆新的车,若是想让全部司机使用同一辆车的话,能够这么作:

@Configuration
public class AppConfig {
    @Bean
    public Car car() {
        return new Car();
    }

    @Bean
    public Driver driver(Car car) {
        return new Driver(car);
    }
}

    driver()方法请求一个car做为参数。当Spring调用driver()方法建立driver的时候,它会自动装配一个car到配置方法中。

2.4 经过XML装配Bean

    使用XML声明Bean:

<bean id="car" class="package.Car" />

    经过构造器注入初始化Bean有两个方案:

  • <constructor-age>元素;
  • Spring3.0提供的c-命名空间;
<bean id="driver" class="package.Driver">
    <constructor-arg ref="car" />
</bean>
<bean id="driver" class="package.Driver" c:car-ref="car" />

    装配集合:

<constructor-age>
    <list>
        <value>item1</value>
        <value>item2</value>
        <value>item3</value>
    </list>
</constructor-age>
<constructor-age>
    <list>
        <ref bean="car1" />
        <ref bean="car2" />
        <ref bean="car3" />
    </list>
</constructor-age>
<constructor-age>
    <set>
        <value>item1</value>
        <value>item2</value>
        <value>item3</value>
    </set>
</constructor-age>

    设置属性:

<bean id="driver" class="backage.Driver">
    <property name="car" ref="Car" />
</bean>
<bean id="driver" class="backage.Driver" p:car-ref="car" />

2.5 导入混合配置

2.5.1 在JavaConfig中引入XML配置

    假设咱们如今有DriverConfig和CarConfig两个Java代码配置类,和一个XML配置文件,咱们须要一种方法将这两个Java配置类和一个XML配置文件组合在一块儿,可使用@Import和@ImportResource这两个注解:

@Configuration
@Import(CarConfig.class)
@Import("classpath:xml-config.xml")
public class DriverConfig ...

2.5.2 在XML配置中引入JavaConfig

    可使用<import>元素来拆分XML配置,并经过bean导入JavaConfig配置类:

<import resoune="car-config.xml" />
<bean class="package.CarConfig" />
相关文章
相关标签/搜索