前言:
本文内容: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">
<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">
<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 |
-
单例(singleton)模式(Spring默认)
1 2
| <bean id="accountService" class="com.something.DefaultAccountService" scope="singleton"/>
|
-
原型(prototype)模式
每次从容器中获取的时候,都会产生一个新对象。
1
| <bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>
|
-
request、session、application只有在web开发中使用
自动装配Bean
自动装配
- 自动装配是Spring满足bean依赖的一种方式
- Spring会在上下文中自动寻找,并自动给bean装配属性
在Spring中有三种装配方式
- 在xml中显式的配置
- 在java中显式的配置
- 隐式自动装配bean(重点)
搭建测试环境
创建Cat,Dog,Person三个类
Cat.java
1 2 3 4 5 6 7 8 9 10 11
| package com.jokerdig.pojo;
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;
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;
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
|
<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
|
<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需要和自动注入属性的类型一致