spring xml注入方式


spring作為IOC和AOP的容器框架,可以幫我們管理持久化類的生命周期。以前往往在使用持久化類之前,我們需要自己進行手動實例化,現在有了spring,我們可以將這一操作交給spring來管理。

配置spring

一  引包

引包與配置MVC時的包一樣。

二  配置文件

在src目錄下建立applicationContext.xml文件,並引入bean注解。添加如下代碼:

<!-- 相當於User user = new User() -->
<bean class="self.exercise.model.User" id="user"></bean>

這句話就相當於我們自己手動實例化了一個對象。

bean還有一個屬性scope當scope值為singleton,只實例化一次對象;當值為propotype,每次都會新創建一個實例。

創建好實例,我們在JUnit測試類中獲取這個實例。

@Test                                                                                    
public void springTest01() {
     //讀取核心配置文件                                                           
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    //獲取實例
    User user = ac.getBean("user", User.class);                                                                                   
}   

創建好實例,如何進行初始化呢?

setter注入方式

這種方式下持久化類中不能生成構造函數。

bean標簽的property標簽用來初始化參數

<bean class="self.exercise.model.User" id="user" scope="prototype">
    <property name="user_id" value="1" />                          
    <property name="account" value="account" />                    
    <property name="user_name">                                    
        <value>清雅軒</value>                                         
    </property>
    <!--關聯對象Role-->                                                    
    <property name="role">                                         
        <bean class="self.exercise.model.Role" id="role">          
            <property name="role_id" value="1" />                  
            <property name="role_name">                            
                <value>管理員</value>                                 
            </property>                                            
        </bean>                                                    
    </property>                                                    
</bean>                                                            

初始化參數有兩種方式,一種是給value屬性賦值;一種使用value標簽;還有另一種初始化參數的方式,引入p標簽。

當一個對象的變量關聯另一個對象,初始化該關聯屬性時也要為這個類(Role)進行聲明代理;當檢測到該屬性是自定義類,會自動實例化並初始化其中的變量,最后再初始化該關聯屬性。但是這種聲明方式,Role的作用域只在父標簽property的范圍內,當測試類試圖獲取Role對象是是獲取不到的。

Role role = ac.getBean("role", Role.class);
//org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'role' is defined

為解決這個問題,可以在User的bean標簽的同級創建Role的bean標簽,然后在User bean標簽的property中引用Role bean標簽。

<!-- 相當於User user = new User() -->                                 
<bean class="self.exercise.model.User" id="user" scope="prototype">
    <property name="user_id" value="1" />                          
    <property name="account" value="account" />                    
    <property name="user_name">                                    
        <value>清雅軒</value>                                         
    </property>                                                    
    <property name="role">                                         
        <ref bean="role"/>                                         
    </property>                                                    
</bean>                                                            
<bean class="self.exercise.model.Role" id="role">                  
    <property name="role_id" value="1" />                          
    <property name="role_name">                                    
        <value>管理員</value>                                         
    </property>                                                    
</bean>                                                            

我們再探討下p標簽初始化參數的方式

首先引入p標簽

在bean標簽中alt+/提示,會發現p:[類屬性名](-ref)的屬性,直接賦值或者引用即可。

<!-- 相當於User user = new User() -->                                                   
<bean class="self.exercise.model.User" id="user" scope="prototype" p:role-ref="role">
    <property name="user_id" value="1" />                                            
    <property name="account" value="account" />                                      
    <property name="user_name">                                                      
        <value>清雅軒</value>                                                           
    </property>                                                                      
</bean>                                                                              
<bean class="self.exercise.model.Role" id="role" p:role_id="1">                      
    <property name="role_name">                                                      
        <value>管理員</value>                                                           
    </property>                                                                      
</bean>                                                                              

構造函數注入方式

在持久化類中生成構造函數

public User(String account, Role role, Integer user_id, String user_name) {
    this.account = account;                                                
    this.role = role;                                                      
    this.user_id = user_id;                                                
    this.user_name = user_name;                                            
} 

 

public Role(Integer role_id, String role_name) {this.role_id = role_id;                     
    this.role_name = role_name;                 
}                                               

 在xml文件中的注入形式

<!-- 相當於User user = new User() -->                                                       
<bean class="self.exercise.model.User" id="user" scope="prototype">                      
    <!-- index指明了構造方法中第幾個參數,順序可以上下改變 -->                                                              
    <constructor-arg index="0" name="account" type="java.lang.String" value="account"/>  
    <constructor-arg index="2" name="user_id" type="java.lang.Integer" value="1"/>       
    <constructor-arg index="1" name="role" type="self.exercise.model.Role" ref="role"/>  
    <constructor-arg index="3" name="user_name" type="java.lang.String" value="清雅軒"/>    
</bean>                                                                                  
<bean class="self.exercise.model.Role" id="role" >                                       
    <constructor-arg index="0" name="role_id" type="java.lang.Integer" value="1"/>       
    <constructor-arg index="1" name="role_name" type="java.lang.String" value="超級管理員"/>  
</bean>                                                                                  

在邏輯清晰的情況下,index和name屬性只寫其一即可;參數類型也可以忽略。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM