Spring源码分析(一)-导读

作者: 紫霞等了至尊宝五百年 | 来源:发表于2018-01-29 21:24 被阅读24次

    本系列博文全部分析基于Spring4.0.0.RELEASE版本

    先看一个Spring的最基本使用

    LoginService.java

    public class LoginService {
        public void login() {
            System.out.println("execute LoginService");
        }
    }
    
    public class LoginResource {
        private LoginService loginService;
        
        public LoginService getLoginService() {
            return loginService;
    
        public void setLoginService(LoginService loginService) {
            this.loginService = loginService;
        }
        
        public void login() {
            loginService.login();
        }
    }
    

    applicationgContext.xml

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        ">
    
        <bean id="loginService" name="loginService" class="spring.LoginService"/>
        
        <bean id="loginResource" name="loginResource" class="spring.LoginResource">
            <property name="loginService" ref="loginService"/>
        </bean>
    </beans>
    

    TestClient.java

    public class TestClient {
        @Test
        public void test() {
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationgContext.xml");
            LoginResource loginResource = (LoginResource) applicationContext.getBean("loginResource");
            loginResource.login();
        }
    }
    

    概括性描述Spring的操作:

    • 解析applicationgContext.xml,将xml中定义的bean解析成Spring内部的BeanDefinition
    • 以bean name(如loginService,String类型)为key,bean definition objects(也就是上面的BeanDefinition)(如loginService相应的BeanDefinition)为value存储到DefaultListableBeanFactory中的beanDefinitionMap(一个ConcurrentHashMap)
    • 同时将bean name存入beanDefinitionNames(List类型)中,然后遍历beanDefinitionNames中的bean name
    • 进行bean的实例化并填充属性,在实例化的过程中,如果有依赖没有被实例化将先实例化其依赖,然后实例化本身
    • 实例化完成后将实例存入单例bean的缓存中
    • 当调用getBean方法时,到单例bean的缓存中查找,如果找到并经过转换后返回这个实例(如LoginResource的实例),之后就可以直接使用了

    以上只是一个简单的描述,具体实现过程还是很复杂的,后续将深入源码分析实现,如有错误之处还请不吝赐教!

    相关文章

      网友评论

        本文标题:Spring源码分析(一)-导读

        本文链接:https://www.haomeiwen.com/subject/krbfzxtx.html