Spring-04-自动装配

Spring-04-自动装配

mark

1. 自动装配Bean说明

  • 自动装配是使用spring满足bean依赖的一种方法
  • spring会在应用上下文中为某个bean寻找其依赖的bean。

Springbean三种装配机制,分别是:

  1. 在xml中显式配置;
  2. 在java中显式配置;
  3. 隐式的bean发现机制和自动装配。(重要)

这里我们主要讲第三种:自动化的装配bean

Spring的自动装配要从两个角度实现,或者说是两个操作

  1. 组件扫描(component scanning):spring会自动发现应用上下文中所创建的bean;
  2. 自动装配(autowiring):spring自动满足bean之间的依赖,也就是我们说的IoC/DI;
  3. 组件扫描和自动装配组合发挥巨大威力,使得显示的配置降低到最少。

注意:推荐不使用自动装配xml配置 , 而使用注解 .

官方文档位置 : https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-autowire

mark

2. 测试环境搭建

  1. 实体类 Dog.java/Cat.java
1
2
3
4
5
public class Cat {
public void shout() {
System.out.println("miao~");
}
}
1
2
3
4
5
public class Dog {
public void shout() {
System.out.println("wang~");
}
}
  1. 用户类User
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class User {
private Cat cat;
private Dog dog;
private String str;

@Override
public String toString() {
return "User{" +
"cat=" + cat +
", dog=" + dog +
", str='" + str + '\'' +
'}';
}

public Cat getCat() {
return cat;
}

public void setCat(Cat cat) {
this.cat = cat;
}

public Dog getDog() {
return dog;
}

public void setDog(Dog dog) {
this.dog = dog;
}

public String getStr() {
return str;
}

public void setStr(String str) {
this.str = str;
}
}
  1. 编写Spring配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">

<bean id="dog" class="Dog"/>
<bean id="cat" class="Cat"/>

<bean id="user" class="User">
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
<property name="str" value="朱酱酱"/>
</bean>
</beans>
  1. 测试
1
2
3
4
5
6
7
8
9
public class MyTest {
@Test
public void testMethodAutowire() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = (User) context.getBean("user");
user.getCat().shout();
user.getDog().shout();
}
}

3. ByName/ByType

3.1 ByName

autowire byName (按名称自动装配)

  • 由于在手动配置xml过程中,常常发生字母缺漏和大小写等错误,而无法对其进行检查,使得开发效率降低。
  • 采用自动装配将避免这些错误,并且使配置简单化。

mark

小结:

当一个bean节点带有 autowire byName的属性时。

  • 将查找其类中所有的set方法名,例如setCat,获得将set去掉并且首字母 小写的字符串
  • spring容器中查找是否有此字符串的名称id对象
  • 如果有,就取出注入,没有就报空指针异常错误。

3.2 ByType

autowire byType (按类型自动装配)

  • 使用autowire byType首先需要保证:
    • 同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。
1
NoUniqueBeanDefinitionException

mark

小结:

  • 一个类只能出现一次注入(不然就会因重复而报错)
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信