1. 程式人生 > 其它 >Spring-2-spring核心容器的兩個介面ApplicationContext和BeanFactory

Spring-2-spring核心容器的兩個介面ApplicationContext和BeanFactory

技術標籤:JavaEEjavaspring

文章目錄

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);
    }
}