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屬性只寫其一即可;參數類型也可以忽略。
