一、實例
(1)新建maven項目並編寫基礎代碼。
InstanceFactory.java
package com.example.factory;
import com.example.service.IUserService;
import com.example.service.impl.UserServiceImpl;
/**
* @className: InstanceFactory
* @description: 模擬工廠類
* @author: j
* @date: 2020/3/22 15:28
*/
public class InstanceFactory {
//模擬在一個工廠類中得到UserService對象
public IUserService getUserService(){
return new UserServiceImpl();
}
}
StaticFactory.java
package com.example.factory;
import com.example.service.IUserService;
import com.example.service.impl.UserServiceImpl;
/**
* @className: StaticFactory
* @description: 模擬一個工廠類
* @author: j
* @date: 2020/3/22 15:35
*/
public class StaticFactory {
//靜態方法 模擬在一個工廠類中得到UserService對象
public static IUserService getUserService(){
return new UserServiceImpl();
}
}
IUserService.java
package com.example.service;
/**
* @className: IUserService
* @description: 用戶業務層接口
* @author: j
* @date: 2020/3/17 15:36
*/
public interface IUserService {
/**
* 模擬保存用戶
*/
public void saveUser();
}
UserServiceImpl.java
package com.example.service.impl;
import com.example.service.IUserService;
/**
* @className: UserServiceImpl
* @description:
* @author: j
* @date: 2020/3/17 15:38
*/
public class UserServiceImpl implements IUserService {
public void saveUser(){
System.out.println("執行UserServiceImpl中的saveUser()方法");
}
}
Client.java
package com.example.ui;
import com.example.service.IUserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @className: Client
* @description: 模擬一個表現層,用於調用業務層
* @author: j
* @date: 2020/3/17 15:41
*/
public class Client {
/**
* 獲取spring ioc容器
* @param args
*/
public static void main(String[] args) {
//獲取ioc容器對象
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");
//獲取bean對象
IUserService userService= (IUserService) applicationContext.getBean("userService");
//測試
System.out.println("userService對象:" +userService);
//userService.saveUser();
}
}
bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--把對象的創建交給spring來管理-->
<!--方式一:默認創建bean的方式,使用bean標籤和id、class屬性(spring會使用默認構造函數來創建)-->
<bean id="userService" class="com.example.service.impl.UserServiceImpl"/>
</beans>
(2)執行Client.java中的方法,結果如下
此時生成bean採用的是第一種方式(默認方式)
<!--方式一:默認創建bean的方式,使用bean標籤和id、class屬性(spring會使用默認構造函數來創建)-->
<bean id="userService" class="com.example.service.impl.UserServiceImpl"/>
(3)InstanceFactory是一個模擬工廠類,一般情況下我們無法修改其源碼,其裏面有一個得到對象的方法,若根據此類來創建對象,則是spring創建bean的第二種方式
<!--方式二:使用某個類的方法創建bean並存入spring容器-->
<!--<bean id="instanceFactory" class="com.example.factory.InstanceFactory"/>
<bean id="userService" factory-bean="instanceFactory" factory-method="getUserService"/>
(4)StaticFactory與InstanceFactory類似,不過其得到對象的方法是靜態方法,相應的spring創建bean的第三種方式是
<!--方式三:使用某個類中的靜態方法創建bean並存入spring容器-->
<!--<bean id="userService" class="com.example.factory.StaticFactory" factory-method="getUserService"/>
二、總結
spring創建bean一共有三種方式
<!--方式一:默認創建bean的方式,使用bean標籤和id、class屬性(spring會使用默認構造函數來創建)-->
<bean id="" class=""/>
<!--方式二:使用某個類的方法創建bean並存入spring容器-->
<bean id="" class=""/>
<bean id="" factory-bean="" factory-method=""/>
<!--方式三:使用某個類中的靜態方法創建bean並存入spring容器-->
<!--<bean id="" class="" factory-method=""/>
第一種即默認方式:bean標籤賦以id(表示所要生成的bean)和class屬性(所要生成的bean的相應的類所在位置)。
第二種適合對於一些我們無法修改源碼或一些其他類裏面可以得到bean對象的類,第一個bean標籤對應相應的其他類,第二個bean標籤中factory-bean對應第一個bean的id,factory-method對應相應的得到對象的方法。
第三種和第二種類似只不過得到對象的方法是靜態方法而已。
2020.03.22