spring启动过程

    科技2026-06-19  24

    1 每个类加载器都有它自己的一个加载路径

        Bootstrap jre/lib     ext       jre/ext/lib     AppClassLoader classpath:

    2 BeanNameAware,InitializingBean,BeanPostProcessor

        org.springframework.beans.factory.BeanNameAware#setBeanName     用来获取bean容器生成的beanName     org.springframework.beans.factory.InitializingBean#afterPropertiesSet     用来在bean初始化后处理一些逻辑,是setBeanName在后面执行的     org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization     用来再bean初始化前处理一些逻辑     org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization     用来再bean初始化后处理一些逻辑               InitializingBean和BeanPostProcess的区别:     InitializingBean和BeanPostProcess都是Spring提供的接口

        区别:     1、BeanPostProcess先于InitializingBean执行     2、InitializingBean是在对象已经实例化之后,执行接口的afterPropertiesSet()方法;     BeanPostProcess是在bean构建的过程中,postProcessBeforeInitialization,postProcessAfterInitialization     注意:每个bean在构建的过程中,Spring都会遍历所有的BeanPostProcessor的实现类,调用实现类中的方法,入参为构建好的bean     3、自己实现BeanPostProcess接口时,如果想生效,还需将实现类构建成SpringBean     即需要用@Component注解 等方法

        执行顺序     类构造方法 - postProcessBeforeInitialization - @PostConstruct注解的方法 - InitializingBean的afterPropertiesSet()方法 - postProcessAfterInitialization

         3 spring启动过程

         1)扫描注解路径的bean,生成BeanDefinition

            根据注解或者xml配置的扫描路径,通过Resource[] resources = getResourcePatternResolver().getResources(packageSearchPath);根据包名找到类文件,层层递归找到所有的class对象。根据反射生成class对象。并解析类的各种描述信息,比如是否是单例对象,是否需要懒加载等。

         2)创建非懒加载的单实例bean对象

            此处自动生成的是非懒加载的单实例bean。需要懒加载的单实例bean或者原型(prototype)bean是在每次getBean的时候创建的。这个校验需要根据解析注解或者xml配置。         java.lang.Class#isAnnotationPresent可用来判断此class是否有**注解;java.lang.Class#isAssignableFrom可用来判断是否从某接口或者类派生出来的类。         创建过程:             执行类构造方法             --->org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization              --->@PostConstruct注解的方法             --->org.springframework.beans.factory.InitializingBean#afterPropertiesSet              --->org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization         AutoWire获取类的时候,先根据beanType查找,如果只有一个就返回,如果找到多个再根据beanName查找         javax.annotation.Resource         (1)、@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配         (2)、指定了name或者type则根据指定的类型去匹配bean         (3)、指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错         @Autowired和@Resource两个注解的区别:         1、@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配         2、@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了         Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。         这里有单例池来存储已生成的单例对象,是存储在map中,key是beanName

    Processed: 0.008, SQL: 10