Spring面试基础

Spring框架相关组件

  • Spring Core:核心类库,提供IOC服务。
  • Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等)。
  • Spring AOP:AOP服务。
  • Spring DOA:对JDBC的抽象,简化了数据访问异常的处理。
  • Spring ORM:对现有的ORM框架的支持。
  • Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传。
  • Spring MVC:提供面向Web应用的Model-View-Controller实现。

    什么是IOC和DI

  • IOC

IOC就是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到Spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。DI依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部资源。

  • DI

DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

Spring Bean的配置方式

  • 基于XML的配置
  • 基于注解的配置(@Component、@Respository、@Controller、@Service)

在Spring的配置文件中定义注解扫描的范围
<context:component-scan base-package="com.itcast" />
或在主配置类上使用@ComponentScan注解
这样com.itcast包下所有标注了 @Component、@Repository、@Controller注解的类,会被注册到容器中。

  • 基于Java类+配置注解的方式(@Comfiguration 写在类上、@Bean 写在方法上)

    IOC容器Bean的常见属性

  • id:Bean的唯一标识,IOC容器中Bean的id标签不能重复,否则报错。

  • name:Bena的别名,可以定义多个。
  • class:Bean的全限定类名,指向ClassPath下类定义走在位置。
  • factory-method:工厂方法属性,通过该属性我们可以调用一个指定的静态工厂方法,创建Bean实例。
  • scope:Bean的作用范围。
  • init-method:Bean初始化时执行的方法。
  • destory-method:Bean销毁时执行的方法。
  • autowrie:Bean的自动装配方式,可选值,默认值:no不进行自动装配。
  • property:用setter方法给Bean的对象注入属性,类似set方法。
  • constructor-arg:用构造器给Bean对象注入属性。

    IOC容器Bean的作用域

  • singleton:单例模式,表示整个IOC容器共享一个Bean,也就是说每次通过getBean()方法获取的Bean都是同一个。

  • prototype:多例模式,每次对该Bean请求时(将其注入到另一个Bean中,或者以程序的方式调用容器的getBean()方法)都会创建一个新的Bean实例。
  • request:每次HTTP请求将会生成各自的Bean实例。
  • session:每次会话请求对应一个Bean实例。
  • global-session:全局作用域。

    IOC依赖注入方式

  • 构造器注入:constructor-arg标签

  • setter方法注入:property标签
  • 更具注解自动注入:@AutoWtied

    IOC容器中重要的类

    IOC容器的体系结构.png

  • BeanFactory接口:顶级接口,仅提供了最基本的容器方法,如getBean()。

    • 实现类
      • XmlBeanFactory。
  • ApplicationContext接口:扩展了BeanFactory,提供了很多功能,是我们常用的容器。

    • 实现类
      • ClassPathXmlApplicationContext
        • 可以加载类路径下的配置文件,实现容器的实例化。基于XML配置。
      • FileSystemXmlApplicationContext
        • 可以加载磁盘任意路径下的配置文件,实现容器的实例化。
      • AnnotationConfigApplicationContext
        • 扫描配置注解,根据注解配置实现容器的实例化。基于注解配置。

          Spring的常用注解

  • @ComponentScan:组件扫描,会扫描指定包下的以下注解

    • @Controller:标注当前类为容器的对象,代表控制组件。
    • @Service:标注当前类为容器的对象,代表服务组件。
    • @Repository:标注当前类为容器的对象,代表持久组件。
    • @Component:标注当前类为容器的对象,代表组件。
  • @Autowired:自动装配注解,默认按类型装配 。
  • @Transactional:事务注解。
  • @Value:将配置文件中的值注入到指定字段。
  • @Bean:配置bean对象,与标签作用一致。
  • @Configuration:标注当前的java类是一个配置类。

    @AutoWried注解和@Resource注解的区别

  • 两者都可以用来装配Bean,都可以写在字段上,或写在setter方法上。

  • @AutoWried默认按类型装配(这个注解是属于spring的),默认情况下必须要求以来对象存在,如果要允许null值,可以设置它的required属性为false:@Autowired(required=false) ,如果我们想使用名称装配可以搭配@Qualifier注解进行使用。
  • @Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

    Spring面试重点

    IOC容器初始化流程