聊聊依赖注入

前面的《Spring中的 IOC》聊了IOC思想,也知道了DI是实现IOC的一种方式,现在来进一步探索依赖注入 DI。

依赖注入

Dependency Injection,DI

依赖 : 指Bean对象的创建依赖于容器 ,Bean对象的依赖资源 

注入 : 指Bean对象所依赖的资源 ,由容器来设置和装配

注入方式

构造器注入

《Spring中的 IOC》聊过了。

Set注入

要注入的属性 , 必须有set方法 , set方法的方法名由set + 属性首字母大写 , 如果属性是boolean类型 , 没有set方法 , 是 is

不同数据类型的注入

为了测试,先来个POJO,包含一些常用的类型的属性。

 public class Student {
 
     private String name;
     private Address address;//自己定义的Address
     private String[] books;
     private List<String> hobbys;
     private Map<String,String> card;
     private Set<String> games;
     private String wife;
     private Properties info;
     
     ....
     get\set\toString等

}

 

 public class Address {
 
     private String address;
 
     public String getAddress() {
         return address;
    }
 
     public void setAddress(String address) {
         this.address = address;
    }
 }

Bean注入

这里说的Bean注入不是把一个Bean对象注入到容器,而且说把容器内一个Bean注入到另一个Bean作为一个引用类型的属性,举例上面的Student类中的地址属性。

 <bean id="addr" class="com.hwl.pojo.Address">
     <property name="address" value="成都"/>
 </bean>
 
 <bean id="student" class="com.hwl.pojo.Student">
     <property name="address" ref="addr"/>
 </bean>

 常量注入

<bean id="student" class="com.hwl.pojo.Student">
     <property name="name" value="李华"/>
</bean>

数组注入

     <property name="books">
         <array>
             <value>西游记</value>
             <value>红楼梦</value>
             <value>水浒传</value>
         </array>
     </property>

List注入

 <property name="hobbys">
     <list>
         <value>听歌</value>
         <value>看书</value>
         <value>爬山</value>
     </list>
 </property>

Map注入

 <property name="card">
     <map>
         <entry key="招行" value="1234567890"/>
         <entry key="建行" value="0987654321"/>
     </map>
 </property>

Set注入

<property name="games">
     <set>
         <value>橘子</value>
         <value>苹果</value>
         <value>凤梨</value>
     </set>
 </property> 

Null注入

<property name="wife">
    <null/>
</property>

Properties注入

 <property name="info">
     <props>
         <prop key="学号">20210704</prop>
         <prop key="姓名">小花</prop>
         <prop key="性别"></prop>
     </props>
 </property>    

p命名注入和c命名注入

p命名注入

p,properties,属性

属性需要有set方法,而且需要导入命名空间:

xmlns:p="http://www.springframework.org/schema/p"

用法

在bean标签中添加属性,格式:p:字段名=字段值,例如:p:name="李华"

 <bean id="user" class="com.hwl.pojo.User" p:name="李华" p:age="28"/>

c命名注入

c,constructor,构造器

属性需要有set方法,有参构造器,而且需要导入命名空间:

xmlns:c="http://www.springframework.org/schema/c"

 

用法

在bean标签中添加属性,格式:c:字段名=字段值,例如:p:name="李华"

<bean id="user" class="com.hwl.pojo.User" c:name="小华" c:age="24"/>

Bean的作用域

Singleton

默认,IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例

Prototype

每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例

Request

在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,只能用在基于web的Spring ApplicationContext环境

Session

在一个HTTP Session中,一个bean定义对应一个实例,只能用在基于web的Spring ApplicationContext环境

 

作用域配置

Singleton

 <bean ... scope="singleton">

Prototype

 <bean ... scope="prototype"/>  
  或者
 <bean ... singleton="false"/>

Request

<bean ... scope="request"/>

Session

<bean ... scope="session"/>

 

posted @ 2021-10-17 14:01  四叶笔记  阅读(51)  评论(0编辑  收藏  举报