1. Bean 作用域
作用域 | 描述 |
---|---|
singleton | 将每个 Spring IoC 容器的单个 bean 定义范围限定为单个对象实例。 |
prototype | 将单个 bean 定义的作用域限定为任意数量的对象实例。 |
request | 将单个 bean 定义的范围限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有一个在单个 bean 定义的后面创建的bean实例。仅在 web-aware Spring 中有效 ApplicationContext 。 |
session | 将单个 bean 定义的范围限定为 HTTP 的生命周期 Session 。仅在 web-aware Spring 中有效 ApplicationContext 。 |
application | 将单个 bean 定义的作用域限定为的生命周期 ServletContext 。仅在 web-aware Spring 中有效 ApplicationContext 。 |
websocket | 将单个 bean 定义的作用域限定为的生命周期 WebSocket 。仅在 web-aware Spring 中有效 ApplicationContext 。 |
-
singleton(单例模式):一个类仅有一个对象实例,是 bean 的默认值。
<!--默认--> <bean id="accountService" class="com.something.DefaultAccountService"/> <!--显式设置--> <bean id="accountService" class="com.something.DefaultAccountService" scope="singleton"/>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bqca9DMy-1625457733282)(Spring.assets/singleton.png)]
-
prototype(多例模式):一个类可有多个对象实例。
<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-254kYY5m-1625457733285)(Spring.assets/prototype.png)]
-
Request、Session、Application 和 WebSocket 仅在 web-aware 项目中有效。
2. Bean 的自动装配
-
Spring 有三种装配方式
- 在 xml 中显示配置
- 在 Java 中显示配置
- 隐式装配(自动装配)
- 自动装配是 Spring 满足 Bean 依赖的一种方式。
- Spring 会在上下文中自动寻找并给 Bean 装配属性。
-
自动装配使用
<bean/>
标签的autowire
属性为 bean 指定自动装配模式。自动装配功能有如下四种模式:属性值 描述 no 无自动装配。Bean 引用必须由 ref
元素定义,是autowire
属性的默认值。byName 按属性名称自动装配。Spring 寻找与需要自动装配的属性同名的 bean 。例如,如果将 Bean 定义设置为按名称自动装配,并且该 Bean 定义包含 master
属性(即,它具有setMaster(..)
。方法)时,Spring 查找名为 master 的 bean 定义并使用它设置属性。byType 基于 set 方法。如果容器中只存在一个属性类型的 bean,则允许对该属性进行自动绑定。如果存在多个 Bean,则会报错。 constructor 类似于 byType ,但基于构造函数参数。如果容器中没有包含所有需要装配的属性的参数的构造函数参数类型的 bean,则会抛出异常。例如,Bean 定义包含 cat
和dog
属性,那么使用了这两个属性的类中必须有参数为Cat
和Dog
的构造函数。-
定义三个模板类
package com.why.pojo; public class Cat { public void shout(){ System.out.println("Miao~"); } }
package com.why.pojo; public class Dog { public void shout(){ System.out.println("Wang~"); } }
package com.why.pojo; public class People { private Cat cat; private Dog dog; private String name; public void setCat(Cat cat) { this.cat = cat; } public void setDog(Dog dog) { this.dog = dog; } public void setName(String name) { this.name = name; } }
-
no 示例
<bean id="cat" class="com.why.pojo.Cat"/> <bean id="dog" class="com.why.pojo.Dog"/> <bean id="people" class="com.why.pojo.People"> <property name="cat" ref="cat"/> <property name="dog" ref="dog"/> <property name="name" value="Why"/> </bean>
-
byName 示例
<!--dog 和 cat 分别有一个与之对应的 setDog 和 setCat 方法--> <bean id="cat" class="com.why.pojo.Cat"/> <bean id="dog" class="com.why.pojo.Dog"/> <bean id="people" class="com.why.pojo.People" autowire="byName"> <property name="name" value="Why"/> </bean>
-
byType 示例
<!--dog 和 cat 是不同的引用类型,即 class 属性唯一,可将 dog 和 cat 的 id 属性省略--> <bean id="cat" class="com.why.pojo.Cat"/> <bean id="dog" class="com.why.pojo.Dog"/> <bean id="people" class="com.why.pojo.People" autowire="byType"> <property name="name" value="Why"/> </bean>
-
constructor 示例
<!--People 类中需要设置一个构造函数: Public People(Cat cat, Dog dog){...}--> <bean id="cat" class="com.why.pojo.Cat"/> <bean id="dog" class="com.why.pojo.Dog"/> <bean id="people" class="com.why.pojo.People" autowire="constructor"> <property name="name" value="Why"/> </bean>
-