Spring学习笔记(二)依赖注入及Bean的作用域
程序员文章站
2022-05-06 20:36:48
...
概念
- 依赖注入DI(Dependency Injection)
- 依赖:Bean对象的创建依赖于容器,Bean对象的依赖资源
- 注入:Bean对象所依赖的资源由容器来设置和装配
最主要的注入方式
依赖注入方式有:构造器注入、Set注入、p命名以及c命名注入,其中Set注入是最常用最主要的注入方式
Set注入
要求被注入的属性必须有set方法,set对于含有复杂类型的类,每种类型的属性注入方法都不同,通常包括的类型有:
bean | list | set | map | props | value | null
Set注入示例
①编写测试类
待引用类Address
public class Address {
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
复杂类Student
public class Student {
private String name; //常量
private Address address; //引用类型
private String[] books; //数组
private List<String> hobbys; //List
private Map<String,String> card; //Map
private Set<String> games; //Set
private String gf; //Null
private Properties info; //Properties
//自动生成set、get、toString方法
}
②在配置文件中进行注入
1.常量注入
<bean id="student" class="com.xia.pojo.Student">
<property name="name" value="张三"/>
</bean>
2.Bean注入
先配置待引用类,再使用ref引用该配置
<bean id="addr" class="com.xia.pojo.Address">
<property name="address" value="南京"/>
</bean>
<bean id="student" class="com.xia.pojo.Student">
<property name="name" value="张三"/>
<property name="address" ref="addr"/>
</bean>
3.数组注入
<property name="books">
<array>
<value>笛卡尔</value>
<value>坏小孩</value>
<value>日记</value>
</array>
</property>
4.List注入
<property name="hobbies">
<list>
<value>爬山</value>
<value>摄影</value>
<value>数学</value>
</list>
</property>
5.Map注入
<property name="card">
<map>
<entry key="中国银行" value="4561325403212"/>
<entry key="建设银行" value="7891156144521"/>
</map>
</property>
6.Set注入
<property name="games">
<set>
<value>Dota</value>
<value>WoW</value>
<value>COC</value>
</set>
</property>
7.Null注入
<property name="gf"><null/></property>
8.Properties注入
<property name="info">
<props>
<prop key="学号">20200714</prop>
<prop key="性别">男</prop>
<prop key="姓名">张三</prop>
</props>
</property>
Bean的作用域
Scope | Description |
---|---|
singleton | (Default) Scopes a single bean definition to a single object instance for each Spring IoC container.默认设置每个IoC容器中仅存在一个单例方式的Bean对象实例 |
prototype | Scopes a single bean definition to any number of object instances.一个Bean定义多个对象实例。每次从容器中调用Bean时都返回一个新的实例,即每次调用getBean()时都相当于执行一次new XxxBean() |
request | Scopes a single bean definition to the lifecycle of a single HTTP request. That is, each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext .作用域为HTTP请求的生命周期。每次HTTP请求中都会创建各自的Bean实例 |
session | Scopes a single bean definition to the lifecycle of an HTTP Session . Only valid in the context of a web-aware Spring ApplicationContext .作用域为一个HTTP Session的生命周期。同一个HTTP Session*享一个Bean,一个Bean定义对应一个实例,不同的Session同的Bean |
application | Scopes a single bean definition to the lifecycle of a ServletContext . Only valid in the context of a web-aware Spring ApplicationContext .作用域为一个ServletContext的生命周期 |
websocket | Scopes a single bean definition to the lifecycle of a WebSocket . Only valid in the context of a web-aware Spring ApplicationContext .作用域为一个WebSocket的生命周期 |
作用域通过关键字scope进行配置。其中request、session、application、websocket仅在基于web的Spring ApplicationContext环境中使用
Singleton
作用域为Singleton单例模式时,一个IoC容器中只存在一个共享的Bean实例对象,该对象在创建容器时默认自动创建,每次通过id请求Bean所获取到的实例对象都是**同一个对象*
<bean id="name" class="com.xia.pojo.Student" scope="singleton">
Prototype
作用域为Prototype原型模式时,一个Bean定义对应多个实例对象,创建容器时不会进行实例化,而是在每次获取Bean时进行创建,所获取的对象不是同一对象
<bean id="account" class="com.xia.pojo.Student" scope="prototype"/>
或者
<bean id="account" class="com.xia.pojo.Student" singleton="false"/>
下一篇: Spring cloud 第二天