美文网首页
Spring-----bean生命周期

Spring-----bean生命周期

作者: _麻辣香锅不要辣 | 来源:发表于2019-11-08 10:57 被阅读0次

    首先创建一个配置类

    @Configuration  //告诉spring这是一个配置类
    @ComponentScan(value = "cn.yb") //扫描包,controller,service等,不然只有@bean里的组件
    public class MainConfig {
        @Bean
        public Person person(){
            System.out.println("person");
            return new Person();
        }
        @Bean
        @Lazy  //懒加载,只有在第一次使用的时候才会初始化
                // 因为在单例模式下,在容器创建的时候就加载了组件
                //原型模式下,组件在调用时才会创建
        public Person person2(){
            System.out.println("person2");
            return new Person("person2",11);
        }
    }
    

    在定义的两个controller类

    @Controller
    public class Controller1 {
        public void test1(){
            System.out.println("test1");
        }
    }
    
    @Controller
    public class Controller2 {
        public void test2(){
            System.out.println("test2");
        }
    }
    

    测试类

    public class SpringTest {
        public static void main(String[] args) {
            //根据配置类来获取容器
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext("cn.yb.config");
           // AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
    
            Person person = applicationContext.getBean(Person.class);
            System.out.println(person);
    
            String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
            for (String beanDefinitionName : beanDefinitionNames) {
                System.out.println(beanDefinitionName);
            }
        }
    }
    

    开始调试:
    首先创建容器,所谓的容器,并不是说里面只有bean,还有beanDefinition等,只是一个环境,bean的扫描,解析,实例化,初始化都在这个环境里进行。


    spring1.png
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext("cn.yb.config");
    

    1.进入AnnotationConfigApplicationContext的构造函数

        public AnnotationConfigApplicationContext(String... basePackages) {
            this();
            //扫描配置文件,并会将配置类放入BeanFactory中
            scan(basePackages);
            refresh();
        }
    

    1.1this():空参的构造函数,此时会有一个隐藏的super()

        public AnnotationConfigApplicationContext() {
            this.reader = new AnnotatedBeanDefinitionReader(this);
            this.scanner = new ClassPathBeanDefinitionScanner(this);
        }
    

    1.1.1super():GenericApplicationContext类中,在这里会创建一个DefaultListableBeanFactory

        public GenericApplicationContext() {
            this.beanFactory = new DefaultListableBeanFactory();
        }
    

    DefaultListableBeanFactory:里面有个 Map<beanName,beanDefinition>保存bean

    public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
            implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
    /** Map of bean definition objects, keyed by bean name */
        private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
    
    

    beanDefinition:就是一个描述bean的类,里面有bean的各种属性(那为什么不用bean呢?而用beanDefinition来描述一个bean对象,spring就是这么命名哒,hhhhh)

    spring2.png

    1.2scan(basePackages) //扫描配置文件,并会将配置类放入BeanFactory中


    spring3.png spring4.png

    1.3 refresh():刷新容器

    public void refresh() throws BeansException, IllegalStateException {
            synchronized (this.startupShutdownMonitor) {
                // Prepare this context for refreshing.
                prepareRefresh();
    
                // Tell the subclass to refresh the internal bean factory.
                ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
    
                // Prepare the bean factory for use in this context.
                prepareBeanFactory(beanFactory);
    
                try {
                    // Allows post-processing of the bean factory in context subclasses.
                    postProcessBeanFactory(beanFactory);
    
                    // Invoke factory processors registered as beans in the context.
                    invokeBeanFactoryPostProcessors(beanFactory);
    
                    // Register bean processors that intercept bean creation.
                    registerBeanPostProcessors(beanFactory);
    
                    // Initialize message source for this context.
                    initMessageSource();
    
                    // Initialize event multicaster for this context.
                    initApplicationEventMulticaster();
    
                    // Initialize other special beans in specific context subclasses.
                    onRefresh();
    
                    // Check for listener beans and register them.
                    registerListeners();
    
                    // Instantiate all remaining (non-lazy-init) singletons.
                    finishBeanFactoryInitialization(beanFactory);
    
                    // Last step: publish corresponding event.
                    finishRefresh();
                }
    
                catch (BeansException ex) {
                    if (logger.isWarnEnabled()) {
                        logger.warn("Exception encountered during context initialization - " +
                                "cancelling refresh attempt: " + ex);
                    }
    
                    // Destroy already created singletons to avoid dangling resources.
                    destroyBeans();
    
                    // Reset 'active' flag.
                    cancelRefresh(ex);
    
                    // Propagate exception to caller.
                    throw ex;
                }
    
                finally {
                    // Reset common introspection caches in Spring's core, since we
                    // might not ever need metadata for singleton beans anymore...
                    resetCommonCaches();
                }
            }
        }
    

    其中最主要是的有两个方法:
    1、invokeBeanFactoryPostProcessors(beanFactory) 在这里进行bean的扫描和解析工作,保存在beanFactory中的BeanDefinitionMap中


    spring5.png

    2.finishBeanFactoryInitialization(beanFactory);在这里进行对bean的创建,实例化

    相关文章

      网友评论

          本文标题:Spring-----bean生命周期

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