Spring IOC DefaultListableBeanFactory解析1
阿新 • • 發佈:2018-11-15
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。