注入方式
set注入
-
兩個pojo類
public class Address { private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
package com.kuang.pojo; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; public class Student { private String name; private Address address; private String[] books; private List<String> hobbys; private Map<String,String> card; private Set<String> games; private String wife; private Properties info; public void setName(String name) { this.name = name; } public void setAddress(Address address) { this.address = address; } public void setBooks(String[] books) { this.books = books; } public void setHobbys(List<String> hobbys) { this.hobbys = hobbys; } public void setCard(Map<String, String> card) { this.card = card; } public void setGames(Set<String> games) { this.games = games; } public void setWife(String wife) { this.wife = wife; } public void setInfo(Properties info) { this.info = info; } public void show(){ System.out.println("name="+ name + ",address="+ address.getAddress() + ",books=" ); for (String book:books){ System.out.print("<<"+book+">>\t"); } System.out.println("\n愛好:"+hobbys); System.out.println("card:"+card); System.out.println("games:"+games); System.out.println("wife:"+wife); System.out.println("info:"+info); } }
-
beans.xml中如何進行注入
- 以下包括對象注入 ref
- 數組注入:array
- set注入:set
- List注入:list
- map注入:map
- properties注入:props
- 空注入:null
<bean id="add" class="com.kuang.pojo.Address"> <property name="address" value="重慶"></property> </bean> <bean id="student" class="com.kuang.pojo.Student"> <property name="name" value="金宇"></property> <property name="address" ref="add"></property> <property name="games"> <set> <value>LOL</value> <value>FC</value> <value>hong</value> <value>hhhh</value> </set> </property> <property name="card"> <map> <entry key="String" value="123"></entry> <entry key="Int" value="456"></entry> <entry key="char" value="789"></entry> </map> </property> <property name="hobbys"> <list> <value>游泳</value> <value>籃球</value> <value>兵乓球</value> </list> </property> <property name="books"> <array> <value>中國</value> <value>美國</value> <value>俄羅斯</value> </array> </property> <property name="wife"><null></null></property> <property name="info"> <props> <prop key="學號">123244</prop> <prop key="中國">3333</prop> </props> </property> </bean>
構造器注入
-
無參構造(實體類中包含無參構造函數)
<bean id="user" class="com.kuang.pojo.User"> <property name="name" value="kuangshen"/> </bean>
-
有參構造(三種方式)
<!-- 第一種根據index參數下標設置 --> <bean id="userT" class="com.kuang.pojo.UserT"> <!-- index指構造方法 , 下標從0開始 --> <constructor-arg index="0" value="kuangshen2"/> </bean>
<!-- 第二種根據參數名字設置 --> <bean id="userT" class="com.kuang.pojo.UserT"> <!-- name指參數名 --> <constructor-arg name="name" value="kuangshen2"/> </bean>
<!-- 第三種根據參數類型設置 --> <bean id="userT" class="com.kuang.pojo.UserT"> <constructor-arg type="java.lang.String" value="kuangshen2"/> </bean>
Spring的配置
-
別名:
<!--設置別名:在獲取Bean的時候可以使用別名獲取--> <alias name="userT" alias="userNew"/>
-
Bean配置
<!--bean就是java對象,由Spring創建和管理--> <!-- id 是bean的標識符,要唯一,如果沒有配置id,name就是默認標識符 如果配置id,又配置了name,那麼name是別名 name可以設置多個別名,可以用逗號,分號,空格隔開 如果不配置id和name,可以根據applicationContext.getBean(.class)獲取對象; class是bean的全限定名=包名+類名 --> <bean id="hello" name="hello2 h2,h3;h4" class="com.kuang.pojo.Hello"> <property name="name" value="Spring"/> </bean>
-
import
團隊的合作通過import來實現 .
<import resource="{path}/beans.xml"/>
p命名和c命名注入
User.java :【注意:這裏沒有有參構造器!】
public class User {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
1、P命名空間注入 : 需要在頭文件中加入約束文件
導入約束 : xmlns:p="http://www.springframework.org/schema/p"
<!--P(屬性: properties)命名空間 , 屬性依然要設置set方法-->
<bean id="user" class="com.kuang.pojo.User" p:name="狂神" p:age="18"/>
2、c 命名空間注入 : 需要在頭文件中加入約束文件,(構造器注入)
導入約束 : xmlns:c="http://www.springframework.org/schema/c"
<!--C(構造: Constructor)命名空間 , 屬性依然要設置set方法-->
<bean id="user" class="com.kuang.pojo.User" c:name="狂神" c:age="18"/>
發現問題:爆紅了,剛纔我們沒有寫有參構造!
解決:把有參構造器加上,這裏也能知道,c 就是所謂的構造器注入!
測試代碼:
@Test
public void test02(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
System.out.println(user);
}
Bean的作用域
在Spring中,那些組成應用程序的主體及由Spring IoC容器所管理的對象,被稱之爲bean。簡單地講,bean就是由IoC容器初始化、裝配及管理的對象 .
幾種作用域中,request、session作用域僅在基於web的應用中使用(不必關心你所採用的是什麼web應用框架),只能用在基於web的Spring ApplicationContext環境。
Singleton
當一個bean的作用域爲Singleton,那麼Spring IoC容器中只會存在一個共享的bean實例,並且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一實例。Singleton是單例類型,就是在創建起容器時就同時自動創建了一個bean的對象,不管你是否使用,他都存在了,每次獲取到的對象都是同一個對象。注意,Singleton作用域是Spring中的缺省作用域。要在XML中將bean定義成singleton,可以這樣配置:
<bean id="ServiceImpl" class="cn.csdn.service.ServiceImpl" scope="singleton">
測試:
@Test
public void test03(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
User user2 = (User) context.getBean("user");
System.out.println(user==user2);
}
Prototype
當一個bean的作用域爲Prototype,表示一個bean定義對應多個對象實例。Prototype作用域的bean會導致在每次對該bean請求(將其注入到另一個bean中,或者以程序的方式調用容器的getBean()方法)時都會創建一個新的bean實例。Prototype是原型類型,它在我們創建容器的時候並沒有實例化,而是當我們獲取bean的時候纔會去創建一個對象,而且我們每次獲取到的對象都不是同一個對象。根據經驗,對有狀態的bean應該使用prototype作用域,而對無狀態的bean則應該使用singleton作用域。在XML中將bean定義成prototype,可以這樣配置:
<bean id="account" class="com.foo.DefaultAccount" scope="prototype"/>
或者
<bean id="account" class="com.foo.DefaultAccount" singleton="false"/>
Request
當一個bean的作用域爲Request,表示在一次HTTP請求中,一個bean定義對應一個實例;即每個HTTP請求都會有各自的bean實例,它們依據某個bean定義創建而成。該作用域僅在基於web的Spring ApplicationContext情形下有效。考慮下面bean定義:
<bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>
針對每次HTTP請求,Spring容器會根據loginAction bean的定義創建一個全新的LoginAction bean實例,且該loginAction bean實例僅在當前HTTP request內有效,因此可以根據需要放心的更改所建實例的內部狀態,而其他請求中根據loginAction bean定義創建的實例,將不會看到這些特定於某個請求的狀態變化。當處理請求結束,request作用域的bean實例將被銷燬。
Session
當一個bean的作用域爲Session,表示在一個HTTP Session中,一個bean定義對應一個實例。該作用域僅在基於web的Spring ApplicationContext情形下有效。考慮下面bean定義:
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
針對某個HTTP Session,Spring容器會根據userPreferences bean定義創建一個全新的userPreferences bean實例,且該userPreferences bean僅在當前HTTP Session內有效。與request作用域一樣,可以根據需要放心的更改所創建實例的內部狀態,而別的HTTP Session中根據userPreferences創建的實例,將不會看到這些特定於某個HTTP Session的狀態變化。當HTTP Session最終被廢棄的時候,在該HTTP Session作用域內的bean也會被廢棄掉。