1、IOC
1.1、IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)?
依赖注入是控制反转的一种方式。控制反转是一种可以帮助我们解耦各业务对象间依赖关系的对象绑定方式。IOC容器主要的作用有:业务对象的构建管理和业务对象间的依赖绑定。
1.2、依赖注入的三种方式?
构造方法注入(constructor injection)、setter方法注入(setter injection)以及接口注入(interface injection)。构造方法注入和setter方法注入侵入性较弱,使用最多。接口注入侵入性较强,不推荐使用。
1.3、Spring提供了哪两种类型的容器?
BeanFactory和ApplicationContext。BeanFactory。基础类型IoC容器,提供完整的IoC服务支持。如果没有特殊指定,默认采用延迟初始化策略;ApplicationContext在BeanFactory的基础上构建,是相对较高级的容器,除了拥有BeanFactory的所有支持,ApplicationContext还提供了其它高级特性。ApplicationContext所管理的对象,在该类型容器启动之后,默认全部初始化并绑定完成。
1.4、BeanFactory、BeanDefinition和BeanDefinitionRegistry之间的关系(这蕴含着BeanFactory的对象注册和依赖绑定的内涵)?
BeanFactory接口定义如何访问容器内管理Bean的方法;对于每个受容器管理的对象,在容器中都会有一个BeanDefinition(也是一个接口)(的实现)的实例与之相对应,该BeanDefinition的实例负责保存对象的所有必要信息,包括其对应的对象的class类型、是否是抽象类、构造方法参数以及其它属性;BeanDefinitionRegistry接口定义抽象了Bean的注册逻辑。具体步骤是:①new 一个将要注册对象对应的BeanDefinition(该接口的实现类)的对象②将该BeanDefinition对象通过BeanDefinitionRegistry(该接口的实现类)注册到容器中,然后设置被注册对象间的依赖关系。③通过BeanFactory的实例获取之前被注册的Bean。
1.5、BeanFactory的对象注册和依赖绑定方式有哪三种?
①直接编码方式②外部配置文件方式(包括properties文件方式和xml文件方式)③注解方式
1.6、在Spring中如何配置Bean?
Bean配置的方式:通过全类名(反射)、通过工厂方法(静态工厂方法和实例工厂方法)、FactoryBean。
1.7、Spring的IoC容器从启动到可以正常使用可分为哪两个阶段?
容器启动阶段和Bean实例化阶段
1.8、Spring容器在容器启动阶段和Bean实例化阶段都加入了哪些扩展点一遍我们根据需要扩展自定义的扩展逻辑?
1)、在容器启动阶段:Spring提供了BeanFactoryPostProcessor的扩展机制。该机制允许我们在容器实例化相应对象之前,对注册到容器的BeanDefinition所保存的信息做相应的修改。比如修改其中Bean定义的某些属性,为Bean定义增加其他信息。
Spring提供几个现成的BeanFactoryPostProcessor实现类,如PropertyPlaceholderConfigurer(允许我们在XML配置文件中使用占位符并将这些占位符所代表的资源配置到properties文件中)、PropertyOverrideConfigurer(对容器中配置的任何你想处理的bean定义的property信息进行覆盖)和CustomEditorConfigurer(来注册自定义的PropertyEditor)。
2)、Bean实例化阶段:在该阶段提供了BeanPostProcessor的扩展机制。BeanPostProcessor会处理容器内所有符合条件的实例化后的对象实例。该接口声明了两个方法:(前置处理器)postProcessorBeforeInitialization(Object bean, String beanname)和(后置处理器)postProcessorAfterInitialization(Object bean, String beanname)。我们几乎可以对传入的对象实例执行任何操作。
1.9、Bean在IoC容器中的生命周期?
1)、通过构造器/工厂方法/FactoryBean来实例化Bean的对象。
2)、设置Bean对象的属性(即注入依赖)。
3)、将Bean对象的传递给BeanPostProcessor的(前置处理器)postProcessorBeforeInitialization(Object bean, String beanname)方法。
4)、调用Bean的初始化方法(init-method)。
5)、将Bean对象的传递给BeanPostProcessor的(后置处理器)postProcessorAfterInitialization(Object bean, String beanname)方法。
6)、使用Bean对象。
7)、容器关闭时调用Bean的销毁方法(destroy-method)。
1.10、Spring为BeanFactory类型容器和ApplicationContext类型容器提供了哪些常用的实现 ?
1)、Spring为BeanFactory类型的容器提供了XmlBeanFactory的实现。
2)、Spring为ApplicationContext类型的容器提供了FileSystemXmlApplicationContext(从文件系统加载Bean定义以及相关资源的ApplicationContext实现)、ClassPathXmlApplicationContext(从Classpath加载Bean的定义以及相关资源的ApplicationContext)、XmlWebApplicationContext(提供用于Web应用程序的ApplicationContext的实现)。
1.11、Spring的统一资源加载策略 ?
Spring提出了Resource(资源抽象)接口和ResourceLoader(资源加载)接口。
1)、Resource接口可以根据资源的不同类型,或者资源所处的不同场合,给出相应的具体实现。具体的实现有:ByteArrayResource、ClassPathResource、FileSystemResource、UrlResource和InputStreamResource。
2)、ResourceLoader的职责主要用于查找和定位这些资源,该接口是资源查找定位策略的统一抽象,具体的查找策略由其实现类给出。具体的实现有:DefaultResourceLoader和FileSystemResourceLoader以及ResourcePatternResolver(批量加载资源)。
1.12、ApplicationContext可以作为ResourceLoader或者ResourcePatternResolver来使用(间接实现了这两个接口)。
1.13、与IoC相关的注解 ?
@autowire(是按照类型进行匹配的)、@Qualifier(为了防止@autowire不能从从容器中同一类型类的多个对象中选择,用该注解给予限制)、除了用@autowire外,也可以使用JSR250的@Resource注解(该注解是根据id的值进行绑定的)、@Component、@Repository、@Service、@Controller.
注意:①、使用@autowire注解时,通常要在配置文件中添加AutowiredAnnotationBeanPostProcessor的BeanPostProcessor,用来为添加了@autowire注解的对象注入相应的依赖。
②、使用@Resource注解时,通常要在配置文件中添加CommonAnnotationBeanPostProcessor的BeanPostProcessor,用来为添加了@Resource注解的对象注入相应的依赖。
③、通常在添加配置文件中配置<context:annotation-config />配置,该配置自动为我们将AutowireAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcesssor注册到容器(就不用显示配置这两个BeanPostProcesssor了),而且还会把PersistenceAnnotationBeanPostProcessor和RequireAnnotationBeanPostProcessor注册到容器。
④、为了使@Component、@Repository、@Service、@Controller这些注解能使用,需要在配置文件中配置<context:component-scan base-package="com.test" />的配置。该配置将遍历扫描com.test路径下的所有类型定义,寻找标注了以上注解的类,并添加到Ioc容器中。
<context:component-scan base-package="com.test" />配置在扫描相关类定义并将它们添加到容器的时候,会使用一种默认的命名规则,来生成那些添加到容器的bean定义的名称(beanname)(规则是将类名首字母小写作为beanname)。
<context:component-scan base-package="com.test" />配置也会将AutowireAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcesssor注册到容器,因此配置<context:component-scan base-package="com.test" />就不用配置<context:annotation-config />。
可以通过:
<context:component-scan base-package="com.test">
<context:include-filter type="annotation" expression="com.test.TestService" />
<context:exclude-filter type="aspectj" expression=".." />
</context:component-scan>
配置的include-filter、exclude-filter来选择扫描时包含或不包含相应的类(其中type类型有annotaion、assignable、regex和aspectj)。
1.1、IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)?
依赖注入是控制反转的一种方式。控制反转是一种可以帮助我们解耦各业务对象间依赖关系的对象绑定方式。IOC容器主要的作用有:业务对象的构建管理和业务对象间的依赖绑定。
1.2、依赖注入的三种方式?
构造方法注入(constructor injection)、setter方法注入(setter injection)以及接口注入(interface injection)。构造方法注入和setter方法注入侵入性较弱,使用最多。接口注入侵入性较强,不推荐使用。
1.3、Spring提供了哪两种类型的容器?
BeanFactory和ApplicationContext。BeanFactory。基础类型IoC容器,提供完整的IoC服务支持。如果没有特殊指定,默认采用延迟初始化策略;ApplicationContext在BeanFactory的基础上构建,是相对较高级的容器,除了拥有BeanFactory的所有支持,ApplicationContext还提供了其它高级特性。ApplicationContext所管理的对象,在该类型容器启动之后,默认全部初始化并绑定完成。
1.4、BeanFactory、BeanDefinition和BeanDefinitionRegistry之间的关系(这蕴含着BeanFactory的对象注册和依赖绑定的内涵)?
BeanFactory接口定义如何访问容器内管理Bean的方法;对于每个受容器管理的对象,在容器中都会有一个BeanDefinition(也是一个接口)(的实现)的实例与之相对应,该BeanDefinition的实例负责保存对象的所有必要信息,包括其对应的对象的class类型、是否是抽象类、构造方法参数以及其它属性;BeanDefinitionRegistry接口定义抽象了Bean的注册逻辑。具体步骤是:①new 一个将要注册对象对应的BeanDefinition(该接口的实现类)的对象②将该BeanDefinition对象通过BeanDefinitionRegistry(该接口的实现类)注册到容器中,然后设置被注册对象间的依赖关系。③通过BeanFactory的实例获取之前被注册的Bean。
1.5、BeanFactory的对象注册和依赖绑定方式有哪三种?
①直接编码方式②外部配置文件方式(包括properties文件方式和xml文件方式)③注解方式
1.6、在Spring中如何配置Bean?
Bean配置的方式:通过全类名(反射)、通过工厂方法(静态工厂方法和实例工厂方法)、FactoryBean。
1.7、Spring的IoC容器从启动到可以正常使用可分为哪两个阶段?
容器启动阶段和Bean实例化阶段
1.8、Spring容器在容器启动阶段和Bean实例化阶段都加入了哪些扩展点一遍我们根据需要扩展自定义的扩展逻辑?
1)、在容器启动阶段:Spring提供了BeanFactoryPostProcessor的扩展机制。该机制允许我们在容器实例化相应对象之前,对注册到容器的BeanDefinition所保存的信息做相应的修改。比如修改其中Bean定义的某些属性,为Bean定义增加其他信息。
Spring提供几个现成的BeanFactoryPostProcessor实现类,如PropertyPlaceholderConfigurer(允许我们在XML配置文件中使用占位符并将这些占位符所代表的资源配置到properties文件中)、PropertyOverrideConfigurer(对容器中配置的任何你想处理的bean定义的property信息进行覆盖)和CustomEditorConfigurer(来注册自定义的PropertyEditor)。
2)、Bean实例化阶段:在该阶段提供了BeanPostProcessor的扩展机制。BeanPostProcessor会处理容器内所有符合条件的实例化后的对象实例。该接口声明了两个方法:(前置处理器)postProcessorBeforeInitialization(Object bean, String beanname)和(后置处理器)postProcessorAfterInitialization(Object bean, String beanname)。我们几乎可以对传入的对象实例执行任何操作。
1.9、Bean在IoC容器中的生命周期?
1)、通过构造器/工厂方法/FactoryBean来实例化Bean的对象。
2)、设置Bean对象的属性(即注入依赖)。
3)、将Bean对象的传递给BeanPostProcessor的(前置处理器)postProcessorBeforeInitialization(Object bean, String beanname)方法。
4)、调用Bean的初始化方法(init-method)。
5)、将Bean对象的传递给BeanPostProcessor的(后置处理器)postProcessorAfterInitialization(Object bean, String beanname)方法。
6)、使用Bean对象。
7)、容器关闭时调用Bean的销毁方法(destroy-method)。
1.10、Spring为BeanFactory类型容器和ApplicationContext类型容器提供了哪些常用的实现 ?
1)、Spring为BeanFactory类型的容器提供了XmlBeanFactory的实现。
2)、Spring为ApplicationContext类型的容器提供了FileSystemXmlApplicationContext(从文件系统加载Bean定义以及相关资源的ApplicationContext实现)、ClassPathXmlApplicationContext(从Classpath加载Bean的定义以及相关资源的ApplicationContext)、XmlWebApplicationContext(提供用于Web应用程序的ApplicationContext的实现)。
1.11、Spring的统一资源加载策略 ?
Spring提出了Resource(资源抽象)接口和ResourceLoader(资源加载)接口。
1)、Resource接口可以根据资源的不同类型,或者资源所处的不同场合,给出相应的具体实现。具体的实现有:ByteArrayResource、ClassPathResource、FileSystemResource、UrlResource和InputStreamResource。
2)、ResourceLoader的职责主要用于查找和定位这些资源,该接口是资源查找定位策略的统一抽象,具体的查找策略由其实现类给出。具体的实现有:DefaultResourceLoader和FileSystemResourceLoader以及ResourcePatternResolver(批量加载资源)。
1.12、ApplicationContext可以作为ResourceLoader或者ResourcePatternResolver来使用(间接实现了这两个接口)。
1.13、与IoC相关的注解 ?
@autowire(是按照类型进行匹配的)、@Qualifier(为了防止@autowire不能从从容器中同一类型类的多个对象中选择,用该注解给予限制)、除了用@autowire外,也可以使用JSR250的@Resource注解(该注解是根据id的值进行绑定的)、@Component、@Repository、@Service、@Controller.
注意:①、使用@autowire注解时,通常要在配置文件中添加AutowiredAnnotationBeanPostProcessor的BeanPostProcessor,用来为添加了@autowire注解的对象注入相应的依赖。
②、使用@Resource注解时,通常要在配置文件中添加CommonAnnotationBeanPostProcessor的BeanPostProcessor,用来为添加了@Resource注解的对象注入相应的依赖。
③、通常在添加配置文件中配置<context:annotation-config />配置,该配置自动为我们将AutowireAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcesssor注册到容器(就不用显示配置这两个BeanPostProcesssor了),而且还会把PersistenceAnnotationBeanPostProcessor和RequireAnnotationBeanPostProcessor注册到容器。
④、为了使@Component、@Repository、@Service、@Controller这些注解能使用,需要在配置文件中配置<context:component-scan base-package="com.test" />的配置。该配置将遍历扫描com.test路径下的所有类型定义,寻找标注了以上注解的类,并添加到Ioc容器中。
<context:component-scan base-package="com.test" />配置在扫描相关类定义并将它们添加到容器的时候,会使用一种默认的命名规则,来生成那些添加到容器的bean定义的名称(beanname)(规则是将类名首字母小写作为beanname)。
<context:component-scan base-package="com.test" />配置也会将AutowireAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcesssor注册到容器,因此配置<context:component-scan base-package="com.test" />就不用配置<context:annotation-config />。
可以通过:
<context:component-scan base-package="com.test">
<context:include-filter type="annotation" expression="com.test.TestService" />
<context:exclude-filter type="aspectj" expression=".." />
</context:component-scan>
配置的include-filter、exclude-filter来选择扫描时包含或不包含相应的类(其中type类型有annotaion、assignable、regex和aspectj)。