• Spring中的面试题01


    面试题

    Spring框架中,如果通过组件扫描来创建类的对象

    在某个配置类上添加@ComponentScan注解,必要的话,配置这个注解的value / basePackages属性,可以指定组件扫描的根包。

    将需要被Spring创建对象的类型,声明在这个根包之下,并且,在类上添加组件注解即可。

    常用的基本组件注解有:@Component@Controller@Service@Repository

    使用Spring框架时,如何选取@Bean方法和组件扫描,使得Spring创建对象

    自定义的类应该使用组件扫描,其它类(不是自行创建的类型)必须使用@Bean方法。

    请描述@Autowired的自动装配机制

    首先,在Spring容器中查找匹配类型的Spring Bean的数量

    • 0个:取决于@Autowired注解的required属性
      • required = true:加载Spring时出现NoSuchBeanDefinitionException
      • required = false:放弃自动装配,则属性值为null
    • 1个:直接装配,且成功
    • 多个:将尝试根据名称来自动装配,要求被自动装配的属性名与Spring Bean的名称是匹配的,如果存在匹配的,则成功装配,否则,加载Spring时出现NoUniqueBeanDefinitionException
      • 关于名称匹配,可以是属性名改为某个Spring Bean名称,或在属性上添加@Qualifier注解来指定某个Spring Bean的名称

    请描述@Autowired@Resource的装配机制的区别

    【先回答以上@Autowired的装配机制】

    @Resource的装配机制是:先尝试根据名称查找匹配的Spring Bean,且类型也匹配,则自动装配,如果没有匹配名称的Spring Bean,将尝试按照类型来装配,简单来说,是先根据名称,再根据类型的装配机制。

    请描述@Autowired@Resource的区别

    【先回答以上题目的答案】

    @Resourcejavax.annotation包中的注解,而@Autowired是Spring框架定义的注解。

    @Resource注解可以添加在类上、属性上、方法上,但是,只有添加在属性上,才被解释为自动装配。

    @Autowired注解可以添加在属性上、Setter方法上、构造方法上,所以,当尝试自动装配时,可以:

    1. public class BrandController {
    2. @Autowired
    3. private IBrandService brandService;
    4. }
    1. // 本示例代码的效果,使用@Resource无法实现
    2. public class BrandController {
    3. private IBrandService brandService;
    4. @Autowired
    5. public void setBrandService(IBrandService brandService) {
    6. this.brandService = brandService;
    7. }
    8. }
    1. // 本示例代码的效果,使用@Resource无法实现
    2. public class BrandController {
    3. private IBrandService brandService;
    4. @Autowired
    5. public BrandController(IBrandService brandService) {
    6. this.brandService = brandService;
    7. }
    8. }

    其实,关于Spring框架自动调用构造方法:

    • 如果类中仅有无参构造方法,则直接调用(不需要使用@Autowired注解)
    • 如果类中仅有1个非无参构造方法,则直接调用(不需要使用@Autowired注解)
    • 如果类中有多个构造方法,则尝试调用无参数构造方法(不需要使用@Autowired注解)
    • 如果类中有多个构造方法,且都是有参数的,则尝试调用带@Autowired的那1个

    由于@Autowired可以添加在方法上,如果方法的参数需要被自动装配,但名称不匹配,还可以在方法的参数前添加@Qualifier来指定Spring Bean的名称。

    在Spring框架中,IoC与DI的区别

    IoCInversion OControl,控制反转,表示将对象的控制权(创建、管理)交给框架

    DIDependency Injection,依赖注入,表现为给对象的依赖属性赋值

    Spring框架通过DI实现了(完善了)IoC。

    Spring MVC的核心处理流程

    Spring MVC的核心组件:

    • DispathcerServlet:用于统一接收请求,并分发
    • HandlerMapping:记录了请求路径与处理请求的控制器组件的对应关系
    • Controller:实际请求的组件
    • ModelAndView:封装了数据与视图名称的结果
    • ViewResolver:根据视图名称确定实际应用的视图组件

     

            

    使用Mybatis的查询时,如何选取resultType和resultMap

    在配置