javascript
java 实例化 bean,Spring(02)——bean实例化
2 bean的實例化
2.1 構造方法實例化
bean的實例化默認是通過構造方法進行的,在未指定構造方法參數的情況下,默認會通過無參構造方法來進行bean的實例化。如下這種就是通過無參構造方法進行實例化的。
所以在像如上這種沒有配置構造參數使用無參構造方法進行實例化時一定要保證對應的Class擁有一個public的無參構造方法。如果我們的構造方法是有參數的,則需要通過constructor-arg來指定對應的參數,如下這種就是通過配置構造參數使用構造方法進行實例化的。
當參數類型為基本數據類型時可以直接通過constructor-arg元素的value屬性指定對應的值,如上面示例中的value=”hello”就是這樣的。
當有多個構造參數時就需要使用多個constructor-arg進行定義,默認會將定義的順序作為參數的順序。
public class Hello {
public Hello(String str1, boolean b2, int i3) {
}
}
如上Class,我們在定義對應的bean時可以如下定義,這個時候默認會按照定義的順序將第一個參數賦值給構造方法的第一個參數,第二個給第二個,第n個給第n個。
當然,我們也可以明確的利用index來指定constructor-arg對應參數的位置,index是從0開始的,即第一個參數對應的index為0。使用index時,Hello對應的bean可以如下定義。
當構造參數對應于ApplicationContext中的一個bean時,我們也可以通過ref屬性關聯對應的bean。
public class Hello {
public Hello(World world1) {
}
}
我們還可以通過constructor-arg元素的name屬性來指定對應constructor-arg對應的參數,如:
public class Hello {
public Hello(String s1, int i2) {
}
}
但是這需要我們的Class是通過debug方式進行編譯的,這樣Spring才能識別出對應的參數名稱。當然我們也可以通過JDK提供的@ConstructorProperties注解來指定構造參數對應的名稱。如:
public class Hello {
@ConstructorProperties({"s1", "i2"})
public Hello(String s1, int i2) {
}
}
當我們的構造參數比較復雜,比如是一個array、list、set、map等或者需要定義一個內部的bean時,我們可以直接在constructor-arg元素中間進行定義,如:
2.2 靜態方法實例化
如果我們的bean是通過指定Class的靜態方法進行實例化的,則我們可以通過指定Class為擁有對應靜態方法的Class,指定factory-method為對應的實例化靜態方法。假設我們擁有如下這樣一個Class。
public class Hello {
public static World createWorld() {
return new World();
}
public static class World {
}
}
現需要通過Hello的createWorld靜態方法來構造一個類型為World的bean,那么我們可以如下定義:
從以上定義我們可以看到在通過靜態方法實例化對應的bean時是不需要指定對應的bean的類型的,指定的class是對應靜態方法所在的Class。實例化的bean的類型Spring將根據factory-method指定方法的返回值決定。
如果我們用于實例化的靜態方法factory-method是需要接收參數的,那么對應的參數將通過constructor-arg來定義,定義的規則和定義構造方法參數是一樣的。來看一個示例,現將我們的Hello和World的定義改為如下這樣,Hello中用來實例化World對象的createWorld方法需要接收兩個參數。
public class Hello {
public static World createWorld(String s1, int i2) {
return new World(s1, i2);
}
}
public class World {
public World(String s1, int i2) {
}
}
那么我們對應的bean定義應該是這樣的:
2.3 通過實例方法進行實例化
有時候我們的bean可能是需要通過某個對象進行實例化的,這個時候我們可以通過factory-bean指定用來實例化該bean的對應對象,通過factory-method指定factory-bean中用來實例化該bean的方法。factory-bean必須也是屬于ApplicationContext中的一個bean。如我們有如下這樣一個類Hello,其中擁有一個實例方法createWorld將實例化一個World對象。
public class Hello {
public World createWorld() {
return new World();
}
}
如果我們需要定義一個bean使用Hello的實例對象的createWorld方法來實例化對應的World對象,則可以這樣定義:
此時也是不需要指定class的,如果用戶指定了class,Spring也會將其忽略,對應bean的類型將由factory-method指定方法的返回值決定。當factory-method需要接收參數時,則對應的參數可以通過constructor-arg來定義。如我們的Hello是這樣定義的,其createWorld方法需要接收參數。
public class Hello {
public World createWorld(String s1, int i2) {
return new World(s1, i2);
}
}
那么,對應的bean應該如下定義:
(注:本文是基于Spring4.1.0所寫)
本文轉自:http://elim.iteye.com/blog/2382031
總結
以上是生活随笔為你收集整理的java 实例化 bean,Spring(02)——bean实例化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flex socket java,Fle
- 下一篇: java代码上传到私服,java生成 j