# litespring **Repository Path**: kenwar/litespring ## Basic Information - **Project Name**: litespring - **Description**: 从零开始造spring - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-04-03 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## IOC 实现 ### 读取xml配置文件,实例化bean ``` ``` ### 单元测试 ``` @Test public void testGetBean() throws Exception { BeanFactory factory = new DefaultBeanFactory("petstore-v1.xml"); BeanDefinition bd = factory.getBeanDefinition("petStore"); // 获取配置中配置的bean的class名 Assert.assertEquals("com.ken.litespring.service.v1.PetStoreService",bd.getBeanClassName()); // 获取bean的实例 PetStoreService petStore = (PetStoreService)factory.getBean("petStore"); Assert.assertNotNull(petStore); } ``` ### 定义一个BeanDefinition 接口,可以获取bean的定义 ``` public interface BeanDefinition { String getBeanClassName(); } ``` #### BeanDefinition的默认实现类 ``` public class GenericBeanDefinition implements BeanDefinition { private String id; private String beanClassName; public GenericBeanDefinition(String id, String beanClassName) { this.id = id; this.beanClassName = beanClassName; } public String getBeanClassName() { return this.beanClassName; } } ``` ### 定义一个BeanFactory接口 ``` public interface BeanFactory { /** 根据beanId获取bean的定义 */ BeanDefinition getBeanDefinition(String beanId); /** 根据beanId获取bean的实例 */ Object getBean(String beanId); } ``` #### BeanFactory的默认实现 ``` public class DefaultBeanFactory implements BeanFactory { public static final String ID_ATTRIBUTE = "id"; public static final String CLASS_ATTRIBUTE = "class"; private final Map beanDefinitionMap = new ConcurrentHashMap(); public DefaultBeanFactory(String configFile) { this.loadBeanDefinition(configFile); } /** * 加载bean的配置 * @param configFile */ private void loadBeanDefinition(String configFile){ Document document = null; SAXReader saxReader = new SAXReader(); try { document = saxReader.read(new File(configFile)); Element rootElement = document.getRootElement(); // Iterator elementIterator = rootElement.elementIterator(); while (elementIterator.hasNext()) { Element element = elementIterator.next();// String id = element.attributeValue(ID_ATTRIBUTE); String beanClassName = element.attributeValue(CLASS_ATTRIBUTE); BeanDefinition bd = new GenericBeanDefinition(id, beanClassName); beanDefinitionMap.put(id, bd); } } catch (DocumentException e) { e.printStackTrace(); } } public BeanDefinition getBeanDefinition(String beanId) { return this.beanDefinitionMap.get(beanId); } public Object getBean(String beanId) throws Exception { // 根据beanId获取bean的定义 BeanDefinition beanDefinition = this.getBeanDefinition(beanId); if (beanDefinition == null) { return null; } String beanClassName = beanDefinition.getBeanClassName(); // 获取classLoader ClassLoader cl = null; if (cl == null) { // getClassLoader() returning null indicates the bootstrap ClassLoader try { cl = ClassLoader.getSystemClassLoader(); } catch (Throwable ex) { // Cannot access system ClassLoader - oh well, maybe the caller can live with null... } } // 根据类名实例化bean Class clz = cl.loadClass(beanClassName); return clz.newInstance(); } } ``` ### UML 类图 ![image](http://pubimg.kenwar.cn/v1.0uml.png) ``` ```