Bootstrap jre/lib ext jre/ext/lib AppClassLoader classpath:
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
根据注解或者xml配置的扫描路径,通过Resource[] resources = getResourcePatternResolver().getResources(packageSearchPath);根据包名找到类文件,层层递归找到所有的class对象。根据反射生成class对象。并解析类的各种描述信息,比如是否是单例对象,是否需要懒加载等。
此处自动生成的是非懒加载的单实例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
