日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring bean三种创建方式

發(fā)布時間:2023/12/13 javascript 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring bean三种创建方式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  spring共提供了三種實例化bean的方式:構造器實例化(全類名,反射)、工廠方法(靜態(tài)工廠實例化 ? 動態(tài)工廠實例化)和FactoryBean ,下面一一詳解:

?

1、構造器實例化

City.java

1 package com.proc.bean; 2 3 public class City { 4 5 private String name; 6 private String code; 7 8 public City() { 9 } 10 11 public City(String name, String code) { 12 this.name = name; 13 this.code = code; 14 } 15 16 public String getName() { 17 return name; 18 } 19 20 public void setName(String name) { 21 this.name = name; 22 } 23 24 public String getCode() { 25 return code; 26 } 27 28 public void setCode(String code) { 29 this.code = code; 30 } 31 32 @Override 33 public String toString() { 34 return "City [name=" + name + ", code=" + code + "]"; 35 } 36 }

?

通過構造方式配置Bean

1 <bean id="city" class="com.proc.bean.City"> 2 <constructor-arg value="北京"/> 3 <constructor-arg value="BJ"/> 4 </bean>

?

測試代碼

1 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); 2 City city=ctx.getBean("city", City.class); 3 System.out.println(city);

輸出結果

City [name=北京, code=BJ]

?

2、靜態(tài)工廠實例化

  先創(chuàng)建一個靜態(tài)工廠StaticCityFactory

1 package com.proc.bean; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 public class StaticCityFactory { 7 8 private static Map<String, City> cities; 9 10 static{ 11 cities=new HashMap<String, City>(); 12 cities.put("BJ", new City("北京", "BJ")); 13 cities.put("SH", new City("上海", "SH")); 14 cities.put("CD", new City("成都", "CD")); 15 cities.put("SZ", new City("深圳", "SZ")); 16 } 17 18 public static City getCity(String code){ 19 return cities.get(code); 20 } 21 }

?

  配置bean

1 <!-- 通過靜態(tài)工廠實例化對象 2 class:靜態(tài)工廠類型 3 factory-method:靜態(tài)工廠靜態(tài)方法名稱 4 constructor-arg:為靜態(tài)工廠方法指定參數(shù) 5 --> 6 <bean id="city" class="com.proc.bean.StaticCityFactory" factory-method="getCity"> 7 <constructor-arg value="BJ"/> 8 </bean>

?

3、動態(tài)工廠實例化

  先創(chuàng)建一個實例化工廠

1 package com.proc.bean; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 public class InstanceCityFactory { 7 8 private Map<String, City> cities; 9 { 10 cities=new HashMap<String, City>(); 11 cities.put("BJ", new City("北京", "BJ")); 12 cities.put("SH", new City("上海", "SH")); 13 cities.put("CD", new City("成都", "CD")); 14 cities.put("SZ", new City("深圳", "SZ")); 15 } 16 17 public City getCity(String code){ 18 return cities.get(code); 19 } 20 }

  配置

1 <!-- 配置實例化工廠 --> 2 <bean id="cityFacotry" class="com.proc.bean.InstanceCityFactory"/> 3 4 <!-- 通過實例化工廠獲取對象 --> 5 <bean id="city" factory-bean="cityFacotry" factory-method="getCity"> 6 <constructor-arg value="SH"/> <!-- 配置參數(shù) --> 7 </bean>

?

4、FactoryBean

  

? ?一般情況下,Spring 通過反射機制利用 <bean> 的 class 屬性指定實現(xiàn)類實例化 Bean ,在某些情況下,實例化 Bean 過程比較復雜,如果按照傳統(tǒng)的方式,則需要在 <bean> 中提供大量的配置信息。配置方式的靈活性是受限的,這時采用編碼的方式可能會得到一個簡單的方案。 Spring 為此提供了一個org.springframework.bean.factory.FactoryBean 的工廠類接口,用戶可以通過實現(xiàn)該接口定制實例化 Bean 的邏輯。

  FactoryBean接口對于 Spring 框架來說占用重要的地位, Spring 自身就提供了 70 多個 FactoryBean 的實現(xiàn)。它們隱藏了實例化一些復雜 Bean 的細節(jié),給上層應用帶來了便利。從 Spring 3.0 開始, FactoryBean 開始支持泛型,即接口聲明改為 FactoryBean<T> 的形式:

1 public interface FactoryBean<T> { 2 T getObject() throws Exception; 3 Class<?> getObjectType(); 4 boolean isSingleton(); 5 }

  在該接口中還定義了以下3 個方法:

    T getObject():返回由 FactoryBean 創(chuàng)建的 Bean 實例,如果 isSingleton() 返回 true ,則該實例會放到Spring 容器中單實例緩存池中;

    boolean isSingleton():返回由 FactoryBean 創(chuàng)建的 Bean 實例的作用域是 singleton 還是 prototype ;

    Class<T> getObjectType():返回 FactoryBean 創(chuàng)建的 Bean 類型。

  當配置文件中<bean> 的 class 屬性配置的實現(xiàn)類是 FactoryBean 時,通過 getBean() 方法返回的不是FactoryBean 本身,而是 FactoryBean#getObject() 方法所返回的對象,相當于 FactoryBean#getObject() 代理了getBean() 方法。

?

  例:如果使用傳統(tǒng)方式配置下面Car 的 <bean> 時, Car 的每個屬性分別對應一個 <property> 元素標簽。

1 public class Car { 2 private int maxSpeed; 3 private String brand; 4 private double price; 5 public int getMaxSpeed() { 6 return this.maxSpeed; 7 } 8 public void setMaxSpeed(int maxSpeed) { 9 this.maxSpeed = maxSpeed; 10 } 11 public String getBrand() { 12 return this.brand; 13 } 14 public void setBrand(String brand) { 15 this.brand = brand; 16 } 17 public double getPrice() { 18 return this.price; 19 } 20 public void setPrice(double price) { 21 this.price = price; 22 } 23 }

  如果用FactoryBean 的方式實現(xiàn)就靈活點,下例通過逗號分割符的方式一次性的為 Car 的所有屬性指定配置值:

public class CarFactoryBean implements FactoryBean<Car> {private String carInfo;public Car getObject() throws Exception {Car car = new Car();String[] infos = carInfo.split(",");car.setBrand(infos[0]);car.setMaxSpeed(Integer.valueOf(infos[1]));car.setPrice(Double.valueOf(infos[2]));return car;}public Class<Car> getObjectType() {return Car.class;}public boolean isSingleton() {return false;}public String getCarInfo() {return this.carInfo;}// 接受逗號分割符設置屬性信息public void setCarInfo(String carInfo) {this.carInfo = carInfo;} }

  有了這個CarFactoryBean 后,就可以在配置文件中使用下面這種自定義的配置方式配置 Car Bean 了:

1 <bean id="car" class="com.baobaotao.factorybean.CarFactoryBean"> 2 <property name="carInfo" value="法拉利 ,400,2000000"/> 3 </bean>

  當調(diào)用getBean("car") 時, Spring 通過反射機制發(fā)現(xiàn) CarFactoryBean 實現(xiàn)了 FactoryBean 的接口,這時Spring 容器就調(diào)用接口方法 CarFactoryBean#getObject() 方法返回。如果希望獲取 CarFactoryBean 的實例,則需要在使用 getBean(beanName) 方法時在 beanName 前顯示的加上 "&" 前綴:如 getBean("&car");

轉(zhuǎn)載于:https://www.cnblogs.com/caoyc/p/5624697.html

總結

以上是生活随笔為你收集整理的Spring bean三种创建方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。