文档章节

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

巧乐兹
 巧乐兹
发布于 2016/11/07 12:06
字数 1256
阅读 18
收藏 1

2.1 Spring装配Bean的可选方案

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

2.2 自动化装配Bean

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

2.1.1 创建可被发现的Bean

    需要在类上使用@Component注解:

@Component
public class Car ...

    然后在Java配置类中开启组件扫描:

@Configuration
@ComponentScan
public class AppConfig ...

    如果使用XML来自用组件扫描的话:

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

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

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

    ...
}

2.2.2 为组件扫描的Bean命名

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

    如果需要自定义Bean的ID:

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

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

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

2.2.3 设置组件扫描的基础包

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

    但也可以手动设置:

@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" />

 

© 著作权归作者所有

巧乐兹
粉丝 2
博文 17
码字总数 19978
作品 0
北京
私信 提问
《Spring实战》第二章 — 装配Bean

2.1 Spring装配Bean的可选方案 在XML中进行显示配置; 在Java中进行显示配置; 隐式的Bean发现机制和自动装配; 2.2 自动化装配Bean 扫面组件(component scanning):Spring会自动发现应用程序...

杰克鹏仔
2016/11/09
24
0
Spring IOC知识点一网打尽!

前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 在刷Spring书籍的时候花了点时间去学习了单例模式和工...

Java3y
2018/05/22
308
0
Spring实战3-最小化Spring XML配置

显式装配 自动装配Bean属性 一共有四种自动装配类型(需要在Bean配置里添加autowire属性来指定用哪种类型) byName-把与Bean的属性具有相同名字或ID的其他Bean自动装配到Bean的对应属性中。如...

huntering
2015/08/10
94
0
Spring MVC 解读——@Autowired

Spring MVC 解读——@Autowired 一、@Autowired 作为一个Spring开发者对@Autowired注解必定是非常了解了, 顾名思义自动装配,应该是Spring会自动将我们标记为@Autowired的元素装配好,与其猜...

麦壳原野
2014/02/28
10.9K
16
[Spring实战系列](9)装配集合

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50634498 前两篇文章中,我们已经了解了如何使用Spring 配置简单属性值(使用val...

sjf0115
2016/02/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JMM内存模型(一)&volatile关键字的可见性

在说这个之前,我想先说一下计算机的内存模型: CPU在执行的时候,肯定要有数据,而数据在内存中放着呢,这里的内存就是计算机的物理内存,刚开始还好,但是随着技术的发展,CPU处理的速度越...

走向人生巅峰的大路
33分钟前
83
0
你对AJAX认知有多少(2)?

接着昨日内容,我们几天继续探讨ajax的相关知识点 提到ajax下面几个问题又是必须要了解的啦~~~ 8、在浏览器端如何得到服务器端响应的XML数据。 通过XMLHttpRequest对象的responseXMl属性 9、 ...

理性思考
43分钟前
4
0
正则表达式基础(一)

1.转义 转义的作用: 当某个字符在表达式中具有特殊含义,例如字符串引号中出现了引号,为了可以使用这些字符本身,而不是使用其在表达式中的特殊含义,则需要通过转义符“\”来构建该字符转...

清自以敬
46分钟前
4
0
idea中@Data标签getset不起作用

背景:换电脑以后在idea中有@data注解都不生效 解决办法:idea装个插件 https://blog.csdn.net/seapeak007/article/details/72911529...

栾小糖
51分钟前
5
0
Apache Kudu 不能删除不存在的数据

使用Apache Kudu客户端,对KafkaConnect Sink 进行扩展。 使用的Apache Kudu 的Java 客户端。突然有天发现作业无法提交,一直报错。 后来才发现这是Kudu自身的一种校验机制。为了忽略这种校验...

吐槽的达达仔
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部