1. 关于Spring容器,下面说法错误的是( )
A Spring容器也叫IoC容器,本质上就是一个工厂。
B Spring容器不但可以管理Bean,还能管理Bean的生命周期、作用域。
C 一个Web应用中,通常只有一个Spring容器,该容器需要我们主动创建。
D Spring容器的顶层接口是BeanFactory,而常用的是其子接口ApplicationContext。
正确答案:C
解析:
在Web应用中,服务器启动过程中会自动创建Spring容器。
一个类实现ApplicationContextAware接口,重写setApplicationContext方法就可以获取到ApplicationContext对象。
一个应用程序中可以有多个spring容器 不同容器里的bean可以同名 ,但scope=application的时候,同名的bean只有一个。
2. 下列关于@Bean注解的说法中,错误的是( )
A @Bean注解作用在方法上,表示该方法的返回值将被装配到容器中。
B @Bean注解包含name属性,可以通过该属性指定装配的Bean的名称。
C @Bean注解依赖于@Configuration注解,即它所在的类必须带有@Configuration注解。
D @Bean注解可以装配任意的Bean,尤其适合装配那些初始化过程十分复杂的Bean。
正确答案:C
解析:
首先说一下结论:只要当前类会被容器解析为beanDefinition(或者可以简单理解为bean),那么他内部的@Bean等注解就会生效。
其次,针对“@Bean只在配置类中生效”这一看法,判断当前类是不是“配置类”,首先第一优先的肯定是@Configuration注解,但是还有很多的备选方案:
甚至是内部的方法上是否存在@Bean注解:
能满足上述条件之一的都会被容器视为“配置类”(因为这一块儿的代码是位于ConfigurationClassxxx.java中的,所以...)。
当确定这个类是配置类之后,下一步就会开始解析这个类,而这一步其实就和@Configuration注解没有多大的关系了,会直接找当前类中的@Bean修饰的方法:
但是请注意,这三步都需要当前类能在项目启动的时候,会被容器扫描到,能注册为bean才可以!!!
最后,@Service注解能生效是因为它的元注解是@Component,而且上述代码中针对注解的扫描,是针对的元注解:
3. 在Spring MVC中,我们可以通过URL携带参数。例如,"/user/{id}" 是为某Controller中某方法声明的访问路径,其中“{id}”代表这一级携带的是id参数。那么,下列注解中可以用于提取id参数的是( )
A @RequestParam
B @RequestMapping
C @ResponseBody
D @PathVariable
正确答案:D
解析:用于从URL中提取参数的注解是@PathVariable。
4. @RequestMapping注解的属性不包括以下哪个( )
A method
B value
C required
D params
正确答案:C
解析:
method属性代表指定请求的method的类型
value属性指请求的实际地址
params是指定request中一定要有的参数值
required是@RequestParam注解的属性,是指该参数是否为必传项,默认为true,表示请求中一定要传入对应的参数
5. 下列关于Spring MVC注解的说法中,正确的是( )
A @ControllerAdvice用于定义控制器的通知类,它可以对指定的控制器进行增强。
B @InitBinder用于定义控制器参数绑定规则,如转换规则,它会在参数转换之前执行。
C @ExceptionHandler用于定义控制器发生异常后的操作。
D @ModelAttribute用于定义控制器方法执行之前,对数据模型的操作。
正确答案:ABCD
6. SpringBoot注解中,主要功能是启动Spring应用程序上下文时进行自动配置的注解是( )
A @SpringBootApplication
B @Import
C @EnableAutoConfiguration
D @Conditional
正确答案:C
解析:
@EnableAutoConfiguration的主要功能是启动Spring应用程序上下文时进行自动配置,它会尝试猜测并配置项目可能需要的Bean。自动配置通常是基于项目classpath中引入的类和已定义的Bean来实现的,在此过程中,被自动配置的组件来自项目自身和项目依赖的jar包中.
7. 下列选项中,哪个不是Spring MVC拦截器的方法( )
A preHandle()
B postHandle()
C afterHandle()
D afterCompletion()
正确答案:C
解析:
1.preHandle:处理器执行之前执行,如果返回 false 将跳过处理器、拦截器 postHandle 方法、视图渲染等,直接执行拦截器 afterCompletion 方法。
2.postHandle:处理器执行后,视图渲染前执行,如果处理器抛出异常,将跳过该方法直接执行拦截器 afterCompletion方法。
3.afterCompletion:视图渲染后执行,不管处理器是否抛出异常,该方法都将执行
8. 下列不属于Spring Boot注解的是( )
A @Controller
B @EnableAutoConfiguration
C @Conditional
D @SpringBootApplication
正确答案:A
解析:
@Controller是Spring MVC的注解。
9. SpringApplication调用的run方法作用包括( )
A 获取监听器参数配置
B 打印Banner信息
C 创建并初始化容器
D 监听器发送通知
正确答案:ABCD
解析:
SpringApplication调用的run方法执行流程如下:
1. 初始化监听器,以及添加到SpringApplication的自定义监听器。
2. 发布ApplicationStartedEvent事件,如果想监听ApplicationStartedEvent事件,你可以这样定义:public class ApplicationStartedListener implements ApplicationListener,然后通过SpringApplication.addListener(..)添加进去即可。
3. 装配参数和环境,确定是web环境还是非web环境。
4. 装配完环境后,就触发ApplicationEnvironmentPreparedEvent事件。
5. 如果SpringApplication的showBanner属性被设置为true,则打印启动的Banner。
6. 创建ApplicationContext,会根据是否是web环境,来决定创建什么类型的ApplicationContext。
7. 装配Context的环境变量,注册Initializers、beanNameGenerator等。
8. 发布ApplicationPreparedEvent事件。
9. 注册springApplicationArguments、springBootBanner,加载资源等
10. 遍历调用所有SpringApplicationRunListener的contextLoaded()方法。
11. 调用ApplicationContext的refresh()方法,装配context beanfactory等非常重要的核心组件。
12. 查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们。
13. 发布ApplicationReadyEvent事件,启动完毕,表示服务已经可以开始正常提供服务了。通常我们这里会监听这个事件来打印一些监控性质的日志,表示应用正常启动了
10. 以下关于@Autowired注解说法正确的是( )
A @Autowired是Spring提供的注解。
B @Autowired是JDK提供的注解。
C @Autowired注解只能根据类型注入Bean。
D @Autowired注解既可以根据类型注入Bean也可以根据名称注入Bean。
正确答案:AC
解析:
Resource默认按 byName自动注入罢了。
@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Autowired,Autowired同样实现了bean注入功能。只不过他是默认按照byType进行装配,如果匹配类型是多个直接抛出异常、当然这个问题是可以解决的那就是@Qualifier注解进行匹配