前言:

本文内容:C命名和命名空间注入、Bean的作用域、自动装配Bean

推荐免费Spring5基础教程视频:【狂神说Java】Spring5最新完整教程IDEA版通俗易懂_哔哩哔哩_bilibili

C命名和命名空间注入

这两种注入方式需要导入约束才能使用

p-namespace 可以直接注入

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- p命名空间 注入-->
<bean id="user" class="com.jokerdig.pojo.User" p:name="张三" p:age="20"/>
</beans>

c-namespace 可以通过构造器注入

c-namespace 需要在实体类加入有参构造器和无参构造器才能注入

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- c命名空间 注入 需要在实体类加入构造器-->
<bean id="user" class="com.jokerdig.pojo.User" c:name="李四" c:age="21"/>
</beans>

Bean的作用域

Scope Description
singleton (默认)将单个bean定义的范围限定为每个Spring IoC容器的单个对象实例。
prototype 将单个bean定义的范围限定为任意数量的对象实例。
request 将单个bean定义限定为单个HTTP请求的生命周期。也就是说,每个HTTP请求都有自己的bean实例,该实例是在单个bean定义的后面创建的。仅在支持web的Spring环境下有效ApplicationContext
session 将单个bean定义限定为HTTP的生命周期。仅在支持web的Spring环境下有效 Session ApplicationContext
application 将单个bean定义的范围限定为。仅在支持web的Spring环境下有效 ServletContext ApplicationContext
websocket 将单个bean定义的范围限定为。只有在支持web的SpringScope的上下文中,一个bean定义才有效。仅在支持web的Spring环境下有效 WebSocket``ApplicationContext
  1. 单例(singleton)模式(Spring默认)

    1
    2
    <!--  默认也不可不写-->
    <bean id="accountService" class="com.something.DefaultAccountService" scope="singleton"/>
  2. 原型(prototype)模式

    每次从容器中获取的时候,都会产生一个新对象。

    1
    <bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>
  3. request、session、application只有在web开发中使用

自动装配Bean

自动装配

  • 自动装配是Spring满足bean依赖的一种方式
  • Spring会在上下文中自动寻找,并自动给bean装配属性

在Spring中有三种装配方式

  1. 在xml中显式的配置
  2. 在java中显式的配置
  3. 隐式自动装配bean(重点)

搭建测试环境

创建Cat,Dog,Person三个类

Cat.java

1
2
3
4
5
6
7
8
9
10
11
package com.jokerdig.pojo;

/**
* @author Joker大雄
* @data 2022/5/13 - 13:23
**/
public class Cat {
public void shout(){
System.out.println("喵喵");
}
}

Dog.java

1
2
3
4
5
6
7
8
9
10
11
package com.jokerdig.pojo;

/**
* @author Joker大雄
* @data 2022/5/13 - 13:23
**/
public class Dog {
public void shout(){
System.out.println("汪汪");
}
}

Person.java

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
39
40
41
42
43
44
package com.jokerdig.pojo;

/**
* @author Joker大雄
* @data 2022/5/13 - 13:24
**/
public class Person {
private Cat cat;
private Dog dog;
private String name;

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 getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

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

创建beans.xml测试环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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="cat" class="com.jokerdig.pojo.Cat"/>
<bean id="dog" class="com.jokerdig.pojo.Dog"/>

<bean id="person" class="com.jokerdig.pojo.Person">
<property name="name" value="张三"/>
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
</bean>
</beans>

测试运行

1
2
3
4
汪汪
喵喵

Process finished with exit code 0

自动装配测试

autowire=byName自动装配

1
2
3
4
5
6
<!--自动装配 autowired
byName: 会自动在容器上下文中查找,和自己对象set方法后的值对应的bean id
-->
<bean id="person" class="com.jokerdig.pojo.Person" autowire="byName">
<property name="name" value="张三"/>
</bean>

运行测试

1
2
3
4
汪汪
喵喵

Process finished with exit code 0

autowire=byName自动装配

1
2
3
4
5
6
    <!--自动装配 autowired
byType: 会自动在容器上下文中查找,和自己对象属性类型相同的bean
-->
<bean id="person1" class="com.jokerdig.pojo.Person" autowire="byType">
<property name="name" value="张三"/>
</bean>

运行测试

1
2
3
4
汪汪
喵喵

Process finished with exit code 0

小结

  • byName 需要保证所有Bean的id唯一,并且Bean需要和自动注入属性的set方法的值一致
  • byType 需要保证所有Bean的class唯一,并且Bean需要和自动注入属性的类型一致