001.说说你对Spring的理解?
002.说说Spring框架的优缺点?
003.说说IOC的作用和优点?
004.说说IoC的实现机制是什么?
005.IoC和DI有啥区别?
006.说说BeanFactory的作用?
① Spring核心顶层接口,它是一个容器,职责是产生Bean,管理Bean对象的声明周期。
② 实现了煎蛋工厂设计模式,通过getBean方法获取Bean对象。
③ 实现类比较多,每个实现类都有不同的职责(单一职责原则),最核心的是DefaultListableBeanFactory, Spring底层就是使用这个实现生产Bean。
007.说说BeanDefinition的作用?
① 存储Bean的定义信息机元数据,决定Bean的生产方式,例如OrderService是一个Bean,使用BeanDefinition定义塔的id、class、scope等。
② BeanDefinition通过内部的一个BeanDefinitionMap
③BeanFactory通过BeanDefinition信息结合反射创建对象存放到 IoC容器中。
008.BeanFactory和ApplicationContext的区别?
009.BeanFactory和FactoryBean的区别?
010.Spring IOC容器加载过程?
Bean初始化的几种状态
① 概念态:通过@Bean 或xml中
② 定义态:通过BeanDefinition封装Bean的定义信息,实际上是读取的bean的配置信息。
③ 纯静态:通过BeanDefinition中的bean信息反射new一个实例对象放入到二级缓存中,此时对象中的属性是没有值的。
④ 成熟态:通过依赖注入将纯净态的对象注入后的形成最终可在应用中使用的bean。
IOC 的加载过程(为 new AnnotationConfigApplicationContext() )
① 概念态通过调用invokeBeanFactoryPostProcessors将概念态注册为定义态。
② 调用BeanFactory的getBean生产bean(内部细节下次再说)。
011.SpringBean 和 JavaBean有啥区别?
由Spring IoC 容器管理、实例化的对象。
普通java类对象,由自己new出来的对象。
012.配置Bean有哪几种方式?
通过
通过在类上加@Component、@Controller、@Service、@Repostory注解,本质上是通过反射低啊用类的构造方式实例化对象。
通过在方法上加@Bean的方式,通常会和类上的@Configuration注解结合一起使用,加@Bean的方法要求返回Bean对象,Bean对象可以在@Bean注解修饰的方法中自行创建。
Spring3.0 推迟的,有三种方式: ImportSelector 返回类路径数组、ImportBeanDefinitionRegistrar提供Bean注册器、导入其他的配置类。
013.Bean的作用域有哪几种?
通过
① singleton (默认):单例,只创建一个bean对象。
② prototype:多例,每次getBean都获取一个新的bean对象。
③ request:必须是web应用,每个请求都会创建一个bean对象。
④ session: 必须是web应用,每个session会话都会创建一个bean对象。
⑤ application:全局应用范围内创建一个bean对象。
014.Spring为什么默认要使用单例bean?
015.Spring Bean 线程安全吗?
当bean的作用域为单例(默认) + 有状态时 则会出现线程安全问题
bean本身有数据存储功能,就是有实例变量的bean对象,可以保存数据且数据可变,说人话就是bean对象有实例变量,并且可以读写这个实例变量。
进行无状态话设计,不保存数据,bean中没有实例变量,或者实例变量不可变(常量),通过方法进行一次性读写。
016.Spring实例化bean有哪几种方式?
配置
标签或者@Component注解,Spring则是将bean的class信息读取到BeanDefinition.beanClass属性,然后通过反射调用构造方法实例化对象。
通过配置
中facroty-method属性指定静态方法,在静态方法中实例化对象并返回。
通过
facroty 指定工厂bean名称,facroty-method指定工厂bean实例方法,@Bean注解本质上也是实例工厂的方式。
在bean的基础上实现FactoryBean接口,通过getObjec() 方法返回实例化对象。
017.bean的状态方式有哪几种?
默认方式,不自动装配,通过手工ref属性装配。
byName
通过bean的名称进行自动装配。
byType
通过bean的类型进行自动装配。
constructor
通过构造函数中参数的byType进行装配。
autodelect
自动探测,如果有构造方法通过constructor方式,否则通过byType方式装配(Spring3.0后弃用)。