跳转至
#java  #spring 
本文阅读量 

Bean的装配#

在Spring中有三种装配方式
- xml配置
- java代码配置
- 隐式自动配置

Bean的自动装配#

Spring会在上下文中自动寻找,并自动给Bean装配属性

通过xml实现自动装配#

主要是通过beans中的default-autowire属性或者bean中的autowire属性来实现自动装配

byName自动装配#

当设置属性值为byName时,Bean会在上下文中寻找与属性名相同的Beanid并自动注入依赖,必须保证Bean名字唯一。

byType自动装配#

当设置属性值为byType时,Bean会在上下文中寻找与属性类型相同的Bean并自动注入依赖,必须保证同意类型的Bean唯一。

constructor自动装配#

和byType自动装配类似,也是根据类型去自动装配,但是是调用构造函数实现依赖注入。

注解实现自动装配#

依赖:
1. jdk>=1.5
2. spring>=2.5

使用前需要导入扩展和配置注解支持

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/beans/spring-context.xsd">

    <context:annotation-config/>

</beans>

使用方法
依然在xml中编写bean,但是不需要再注入属性
    <bean id="people" class="top.longlone.People"/>
    <bean id="dog" class="top.longlone.Dog"/>

然后在代码属性上使用@Autowired注解,实现的效果是先类似于byType自动装配,若有多个相同类型,则类似于byName自动装配
package top.longlone;

import org.springframework.beans.factory.annotation.Autowired;

public class People {
    @Autowired
    private Dog dog;
    // 省略getter setter toStirng方法

@Autowired可以设置属性required,默认为true,若设置为false,则声明这个依赖是非必须的,可以为空
```java
package top.longlone;

import org.springframework.beans.factory.annotation.Autowired;

public class People {
@Autowired(required = false)
private Dog dog;
}

如果有多个相同类型的bean,则可以使用@Qualifier注解来指定使用哪个名字的bean
```java
package top.longlone;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class People {
    @Autowired
    @Qualifier(value = "dog")
    private Dog dog;
}

在java<11中jva原生自带了一个@Resource注解,它的作用和@Autowired类似,实现的效果是先类似于byName自动装配,若无法找到对应的id,则类似byType自动装配,同时它可以执行name属性来指向具体的一个bean
package top.longlone;


import javax.annotation.Resource;

public class People {
    @Resource(name = "dog22")
    private Dog dog;
}

java11及之后需要通过添加依赖的方式才能使用@Resource注解
<dependency>
   <groupId>javax.annotation</groupId>
   <artifactId>javax.annotation-api</artifactId>
   <version>1.3.1</version>
</dependency>

总结#

Bean实现自动装配有两种方式,分别是通过xml和通过注解。
Bean通过xml实现自动装配有三种方式,分别是byName,byType和constructor。
Bean通过注解实现自动装配有三个常见注解,分别@Autowired,@Qualfilter,@Resource

回到页面顶部