文章目錄
-
- 建立bean對象的四種方式
-
- 1.使用預設的構造函數建立bean對象
- 2.通過靜态工廠方法建立bean
- 3.通過執行個體工廠方法建立bean
- 4.實作FactoryBean接口
目前,我們講了以下幾個知識點:
1.如何擷取bean執行個體,有幾種方式
2.如何為bean的屬性指派(通過構造方法,通過set方法)
3.bean的作用域
下面一個知識點主要來講如何建立bean,java裡面建立對象首先想到的就是通過構造方法建立對象,那麼現在如何建立bean對象呢?
建立bean對象的四種方式
1.使用預設的構造函數建立bean對象
在Spring的配置檔案中使用bean标簽,配置id和class屬性之後,且沒有其他屬性和标簽時,采用的就是預設構造函數建立bean标簽,此時如果類中沒有構造函數,就無法建立對象。
首先寫一個實體類:
@Data
public class Car {
private String carName;
private int price;
private String color;
}
實體類中有一個預設的空參數構造函數,拿到ClassPath類路徑以後,通過反射建立car對象。
<bean id="car" class="com.hh.pojo.Car">
</bean>
2.通過靜态工廠方法建立bean
靜态工廠:工廠本身 不需要建立對象,通過靜态方法調用
對象=工廠類.工廠方法名();
執行個體工廠:工廠本身需要建立對象
工廠類 工廠對象=new 工廠類();
工廠對象.getAirPlane("張三");
首先寫一個實體類AirPlane
@Data
public class AirPlane {
//飛機名
private String name;
//飛機異常
private String yc;
//飛機載客量
private Integer personNum;
//飛機機長姓名
private String jzName;
}
寫一個靜态工廠類 AirPlaneStaticFactory,用來建立飛機對象AirPlane
由于靜态工廠類中的方法為靜态的,是以不需要建立靜态工廠對象,直接通過類名調用方法即可。
//靜态工廠
public class AirPlaneStaticFactory {
//AirPlaneStaticFactory.getAirplane
//靜态工廠類中的擷取飛機對象的方法時靜态的,可以直接通過類名擷取
public static AirPlane getAirplane(String jzName){
System.out.println("靜态工廠正在造飛機....");
AirPlane airPlane = new AirPlane();
airPlane.setName("吉祥");
airPlane.setJzName(jzName);
airPlane.setPersonNum(500);
airPlane.setYc("198.89m");
return airPlane;
}
}
寫配置配置檔案,用來通過靜态工廠類傳回AirPlane對象
class:指定靜态工廠全類名
factory-method:指定工廠方法
constructor-arg:可以為方法傳遞參數
<bean id="airPlane01" class="com.hh.factory.AirPlaneStaticFactory"
factory-method="getAirplane">
<constructor-arg value="張三"/>
</bean>
寫測試類:
public class MyTest4 {
//根據spring的配置檔案得到ioc容器對象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring4.xml");
@Test
public void test(){
System.out.println("容器啟動完成....");
AirPlane airPlane01 =
context.getBean("airPlane01", AirPlane.class);
System.out.println(airPlane01);
}
}

3.通過執行個體工廠方法建立bean
執行個體工廠:工廠本身需要建立對象
工廠類 工廠對象=new 工廠類();
工廠對象.getAirPlane("張三");
先寫一個執行個體工廠類,執行個體工廠類需要建立工廠對象,因為裡面的方法不是靜态方法。
//執行個體工廠
public class AirPlaneInstanceFactory {
//new AirPlaneInstanceFactory().getAirplane
public AirPlane getAirplane(String jzName){
System.out.println("靜态工廠正在造飛機....");
AirPlane airPlane = new AirPlane();
airPlane.setName("吉祥");
airPlane.setJzName(jzName);
airPlane.setPersonNum(500);
airPlane.setYc("198.89m");
return airPlane;
}
}
配置檔案:
1.先配置出執行個體工廠對象
2.factory-bean:指定使用哪個工廠執行個體
3.factory-method:使用哪個工廠方法
<!--執行個體工廠的建立-->
<bean id="airPlaneInstanceFactory"
class="com.hh.factory.AirPlaneInstanceFactory">
</bean>
<bean id="airplane02" class="com.hh.pojo.AirPlane"
factory-method="getAirplane" factory-bean="airPlaneInstanceFactory">
<constructor-arg value="李四"/>
</bean>
寫一個測試類:
public class MyTest4 {
//根據spring的配置檔案得到ioc容器對象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring4.xml");
@Test
public void test1(){
System.out.println("容器啟動完成....");
AirPlane airPlane02 =
context.getBean("airPlane02", AirPlane.class);
System.out.println(airPlane02);
}
}
4.實作FactoryBean接口
實作了FactoryBean接口的類是Spring可以認識的工廠類,Spring會自動調用工廠方法建立執行個體
首先寫一個類實作FactoryBean接口
public class MyFactoryBean implements FactoryBean<Book>{
//getObject:工廠方法,傳回建立的對象
public Book getObject() throws Exception {
Book book = new Book();
book.setBookName(UUID.randomUUID().toString());
return book;
}
// 傳回建立對象的類型
public Class<?> getObjectType() {
return null;
}
//isSingleton:是單例嗎?
public boolean isSingleton() {
return false;
}
}
在配置檔案中配置這個類:
<!--FactoryBean:Spring規定的一個接口-->
<bean id="myFactoryBean" class="com.hh.controller.MyFactoryBean">
</bean>