1. 程式人生 > >Spring IOC DefaultListableBeanFactory解析1

Spring IOC DefaultListableBeanFactory解析1

       Spring的核心所在就是IOC以及AOP。但是我認為最為重要的還是IOC。關於IOC的基本概念我不涉及,反正就是將物件以及以來的權力交給Spring容器來處理。通常我們Spring入門的時候都會建立一個Java Bean。然後配置檔案去定義這個bean。之後使用ApplicationContext或者BeanFactory來獲取這個Bean的物件。我首先定義了一個User:

public class User {
	
	private int id;
	private String name;
	private String password;
    ......
     省略setter、getter、toString


}

     在ApplicationContext.xml中定義bean:

<?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">

    <bean id="user" class="org.apache.czg.start_re.ioc.User">   
	</bean>

</beans>

     下面是我的測試類:首先測試ApplicationContext容器獲取bean

    @Test
    public void testIoc() {
		@SuppressWarnings("resource")
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		User user = (User)context.getBean("user");
		user.setId(66);
		user.setName("caozg");
		user.setPassword("lucu%%%");
		System.out.println(user);
    }

    大家都知道Spring容器有兩個,一個是ApplicationContext,還有一個是BeanFactory。BeanFactory被認為是Spring容器中的基類,並且是屌絲,它的實現是DefaultListableBeanFactory。在Spring3之前,我們還可以使用XmlBeanFactory。它繼承了DefaultListableBeanFactory。但是spring3.1之後XmlBeanFactory過時啦,成為遺留容器。

/**
 * @deprecated Spring 3.1 
 * {@link XmlBeanDefinitionReader}
 *
 */
@Deprecated
@SuppressWarnings({"serial", "all"})
public class XmlBeanFactory extends DefaultListableBeanFactory {}

    因此,下面的Beanfactory的實現使用的是DefaultListableBeanFactory,而不是XmlBeanFactory:

        @Test
	public void testIoc2() {
		/**
		 * 1 讀取資原始檔
		 */
		Resource resource = new ClassPathResource("applicationContext.xml");
		/**
		 * 2 xmlBeanFactory過時啦,這裡使用DefaultListableBeanFactory初始化IOC容器
		 */
		BeanFactory factory = new DefaultListableBeanFactory();
		/**
		 * 3 構建Bean註冊讀取器、讀取器讀取Bean工廠資訊
		 */
		BeanDefinitionReader bdr=new XmlBeanDefinitionReader((BeanDefinitionRegistry) factory);  
		/**
		 * 4 根據資原始檔、註冊Bean
		 */
		bdr.loadBeanDefinitions(resource);
		
		User user = factory.getBean(User.class);
		user.setId(66);
		user.setName("caozg");
		user.setPassword("lucu%%%");
		System.out.println(user);
	}

    下圖是SpringIOC容器結構:

    上述程式碼可以看出,先讀取配置檔案,然後i建立容器。之後Bean註冊讀取配置檔案註冊Bean。