Spring学习笔记(二)依赖注入及Bean的作用域

概念

  • 依赖注入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的作用域

ScopeDescription
singleton(Default) Scopes a single bean definition to a single object instance for each Spring IoC container.默认设置每个IoC容器中仅存在一个单例方式的Bean对象实例
prototypeScopes a single bean definition to any number of object instances.一个Bean定义多个对象实例。每次从容器中调用Bean时都返回一个新的实例,即每次调用getBean()时都相当于执行一次new XxxBean()
requestScopes 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实例
sessionScopes 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
applicationScopes a single bean definition to the lifecycle of a ServletContext. Only valid in the context of a web-aware Spring ApplicationContext.作用域为一个ServletContext的生命周期
websocketScopes 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"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值