天天看點

Spring 基礎

一、認識Bean

在Spring中,那些組成應用的主體(backbone)及由Spring IoC容器所管理的對象被稱之為bean。簡單地講,bean就是由Spring容器初始化、裝配及被管理的對象,除此之外,bean就沒有特别之處了(與應用中的其他對象沒有什麼差別)。而bean定義以及bean互相間的依賴關系将通過配置中繼資料來描述。

二、認識BeanFactory

org.springframework.beans.factory.BeanFactory是Spring IoC容器的實際代表者,IoC容器負責容納此前所描述的bean,并對bean進行管理。

BeanFactory負責讀取Bean定義檔案,管理對象的加載、生成、維護Bean對象與Bean對象之間的依賴關系,負責Bean的生命周期,對于簡單的應用程式來說,使用BeanFactory就足夠來管理Bean,在對象的管理上就可以獲得許多的便利性。

BeanFactory是整個Spring圍繞的重點。它負責讀取Bean配置管理。可以借由getBean()方法來擷取Bean的執行個體。

三、ApplicationContext

不過作為一個應用程式架構,隻提供Bean容器管理的功能是不夠的,若要利用Spring所提供的一些特色以及進階的容器功能,則可以使用BeanFactory的子接口ApplicationContext,此接口的基本功能與BeanFactory接口很相似,另外還提供了一個應用程式所需的更完整的架構功能:

1、提供擷取資源檔案的更友善的方法;

2、提供文字消息解析的方法;

3、支援國際化消息;

4、ApplicationContext可以釋出時間,對時間感興趣的Bean可以接收到這些事件。

簡而言之,BeanFactory提供了配制架構及基本功能,而ApplicationContext則增加了更多支援企業核心内容的功能。ApplicationContext完全由BeanFactory擴充而來,因而BeanFactory所具備的能力和行為也适ApplicationContext

Spring的創始者Rod Johnson建議使用ApplicationContext來取代BeanFactory,在實作ApplicationContext的類中,最常使用的大概是一下三個:

org.springframework.context.support.ClassPathXmlApplicationContext

org.springframework.context.support.FileSystemXmlApplicationContext

org.springframework.web.context.support.XmlWebApplicationContext

四、接口選擇之惑

在實際應用中,使用者有時候不知道到底是選擇BeanFactory接口還是ApplicationContext接口。但是通常在建構J2EE應用時,使用ApplicationContext将是更好的選擇,因為它不僅提供了BeanFactory的所有特性,同時也允許使用更多的聲明方式來得到我們想要的功能。

五、Spring的Bean配置

Spring支援三種配置中繼資料格式:XML格式、Java屬性檔案格式或使用Spring公共API程式設計實作。

六、執行個體化Spring Ioc容器

Resource resource = new FileSystemResource("beans.xml");

BeanFactory factory = new XmlBeanFactory(resource);

ClassPathResource resource = new ClassPathResource("beans.xml");

ApplicationContext context = new FileSystemXmlApplicationContext("beans.xml");

ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml", "applicationContext-part2.xml"});

// of course, an ApplicationContext is just a BeanFactory

BeanFactory factory = (BeanFactory) context;

七、Spring Demo

注入一個Bean,通過Bean上下文工具擷取Bean對象并輸出其中的屬性。

/** 

* Created by IntelliJ IDEA.<br> 

* <b>User</b>: leizhimin<br> 

* <b>Date</b>: 2008-4-17 16:53:54<br> 

* <b>Note</b>: 測試Bean 

*/ 

public class Person { 

    private String name; 

    private String age; 

    public String getName() { 

        return name; 

    } 

    public void setName(String name) { 

        this.name = name; 

    public String getAge() { 

        return age; 

    public void setAge(String age) { 

        this.age = age; 

}

package com.lavasoft.springnote.ch01; 

import org.springframework.context.ApplicationContext; 

import org.springframework.context.support.ClassPathXmlApplicationContext; 

* <b>Date</b>: 2008-4-18 15:00:46<br> 

* <b>Note</b>: Spring上下文工具 

public class BeanContextHelper { 

    private static ApplicationContext applicationContext; 

    static { 

        applicationContext = buildApplicationContext(); 

    private BeanContextHelper() { 

    /** 

     * 重新建構ApplicationContext對象 

     * @return ApplicationContext 

     */ 

    public static ApplicationContext buildApplicationContext() { 

        return new ClassPathXmlApplicationContext("applicationContext.xml"); 

     * 擷取一個ApplicationContext對象 

    public static ApplicationContext getApplicationContext() { 

        return applicationContext; 

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 

<beans> 

    <bean id="person" class="com.lavasoft.springnote.ch01.Person"> 

        <property name="name"> 

            <value>lavasoft</value> 

        </property> 

        <property name="age"> 

            <value>22</value> 

    </bean> 

</beans>

import org.springframework.beans.factory.BeanFactory; 

import org.springframework.beans.factory.xml.XmlBeanFactory; 

import org.springframework.core.io.Resource; 

import org.springframework.core.io.FileSystemResource; 

* <b>Date</b>: 2008-4-17 16:58:54<br> 

* <b>Note</b>: BeanFactory擷取工具(測試版) 

public class SpringUtils { 

    private static SpringUtils _instance = new SpringUtils(); 

    private SpringUtils() { 

    public static ClassPathXmlApplicationContext getClassPathXmlApplicationContext() { 

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 

        return context; 

    public static BeanFactory getBeanFactory() { 

        Resource rs = new FileSystemResource("applicationContext.xml"); 

        BeanFactory factory = new XmlBeanFactory(rs); 

        return factory; 

* <b>Date</b>: 2008-4-17 16:58:07<br> 

* <b>Note</b>: 用戶端測試 

public class Test { 

    public static void main(String args[]) { 

        Test test = new Test(); 

        test.test3(); 

//        test.test2(); 

    public void test1() { 

        //bean的配置檔案“/applicationContext.xml”必須位于CLASSPATH下 

        BeanFactory factory = SpringUtils.getBeanFactory(); 

        Person person = (Person) factory.getBean("person"); 

        System.out.println(person.getName()); 

        System.out.println(person.getAge()); 

    public void test2(){ 

        //bean的配置檔案“/applicationContext.xml”必須位于源碼src下 

        ApplicationContext context = SpringUtils.getClassPathXmlApplicationContext(); 

        Person person = (Person) context.getBean("person"); 

    public void test3(){ 

        ApplicationContext context = BeanContextHelper.getApplicationContext(); 

運作結果:

log4j:WARN No appenders could be found for logger (org.springframework.core.CollectionFactory). 

log4j:WARN Please initialize the log4j system properly. 

lavasoft 

22 

Process finished with exit code 0 

 本文轉自 leizhimin 51CTO部落格,原文連結:http://blog.51cto.com/lavasoft/73432,如需轉載請自行聯系原作者