Spring-2-spring核心容器的兩個介面ApplicationContext和BeanFactory
阿新 • • 發佈:2021-01-24
文章目錄
1 ApplicationContext
此介面建立核心容器時,物件的建立策略為立即載入,即 只要讀取並解析完xml配置檔案,馬上就建立配置檔案中所配置的物件
,因此介面適用於單例物件模式,但是也可在xml配置檔案中配置多例物件模式,因此,此介面使用較多。
ApplicationContext有三個常用的實現類:
- ClassPathXmlApplicationContext:可以載入類路徑下的配置檔案,配置檔案必須在類路徑下,否則無法載入配置檔案。
- FileSystemXmlApplicationContext:可以載入磁碟任意路徑下的配置檔案,例如使用任意一個合法的路徑名(c:\users\zhangsan\desktop\bean.xml)。
- AnnotaConfigXmlApplicationContext:可以通過讀取註解建立容器。
1.1 ClassPathXmlApplicationContext
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id ="accountService" class="com.fy.applicationContext.service.AccountServiceImpl"/>
</beans>
package com.fy.applicationContext.service;
public interface AccountService {
public void saveAccount();
}
package com.fy.applicationContext.service;
import com.fy.applicationContext.dao.AccountDao;
import com.fy.applicationContext.dao.AccountDaoImpl;
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao = new AccountDaoImpl();
@Override
public void saveAccount() {
accountDao.saveAccount();
}
}
package com.fy.applicationContext.ui;
import com.fy.applicationContext.dao.AccountDao;
import com.fy.applicationContext.service.AccountService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class Client {
public static void main(String[] args) {
// ----------------ApplicationContext-----------立即載入
// 1 獲取核心容器物件 - 通過ClassPathXmlApplicationContext
// 執行完此行程式碼,讀取xml配置檔案後就建立所有類的例項
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("bean1.xml");
// 2 兩種方式根據id獲取bean物件
AccountService accountService1 = (AccountService)applicationContext.getBean("accountService");
AccountService accountService2 = applicationContext.getBean("accountService", AccountService.class);
System.out.println(accountService1);
System.out.println(accountService2);
}
}
1.2 FileSystemXmlApplicationContext
package com.fy.applicationContext.ui;
import com.fy.applicationContext.dao.AccountDao;
import com.fy.applicationContext.service.AccountService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class Client {
public static void main(String[] args) {
// ----------------ApplicationContext-----------立即載入
// 1 獲取核心容器物件 - 通過FileSystemXmlApplicationContext
// 執行完此行程式碼,讀取xml配置檔案後就建立所有類的例項
ApplicationContext applicationContext = new
FileSystemXmlApplicationContext("c:/users/iain/desktop/bean1.xml");
// 2 兩種方式根據id獲取bean物件
AccountService accountService1 = (AccountService)applicationContext.getBean("accountService");
AccountService accountService2 = applicationContext.getBean("accountService", AccountService.class);
// 因為ApplicatContext預設為單例物件模式,因此下面兩個物件的引用相同
System.out.println(accountService1);
System.out.println(accountService2);
}
}
1.3 AnnotaConfigXmlApplicationContext
2 BeanFactory
此介面建立核心容器時,物件的建立策略為延遲載入,即 物件的建立不是讀取並解析完xml配置檔案時建立,而是推遲到真正使用物件時再建立
,因此介面適用於多例物件模式。
package com.fy.applicationContext.ui;
import com.fy.applicationContext.dao.AccountDao;
import com.fy.applicationContext.service.AccountService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class Client {
public static void main(String[] args) {
// ----------------BeanFactory-----------延遲載入
Resource resource = new ClassPathResource("bean1.xml");
BeanFactory beanFactory = new XmlBeanFactory(resource);
AccountService accountService1 = (AccountService) beanFactory.getBean("accountService");
// 類例項的建立在真正用到時才執行,比如下面要輸出accountService1時才建立物件
System.out.println(accountService1);
}
}