牛客网刷题错题记录(Spring)

牛客网刷题错题记录(Spring)

笔记

@ResponseBody的作用其实是将java对象转为json格式的数据。 @ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。 注意:在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。 @ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】。

spring AOP的术语:

Aspect:切面,由一系列切点、增强和引入组成的模块对象,可定义优先级,从而影响增强和引入的执行顺序。事务管理(Transaction management)在java企业应用中就是一个很好的切面样例。所以他不是一个被代理的对象。

Join point:接入点,程序执行期的一个点,例如方法执行、类初始化、异常处理。 在Spring AOP中,接入点始终表示方法执行。

Advice:增强,切面在特定接入点的执行动作,包括 “around,” “before” and "after"等多种类型。包含Spring在内的许多AOP框架,通常会使用拦截器来实现增强,围绕着接入点维护着一个拦截器链。

**Pointcut:切点,**用来匹配特定接入点的谓词(表达式),增强将会与切点表达式产生关联,并运行在任何切点匹配到的接入点上。通过切点表达式匹配接入点是AOP的核心,Spring默认使用AspectJ的切点表达式。

Introduction:引入,为某个type声明额外的方法和字段。Spring AOP允许你引入任何接口以及它的默认实现到被增强对象上。

Target object:目标对象,被一个或多个切面增强的对象。也叫作被增强对象。既然Spring AOP使用运行时代理(runtime proxies),那么目标对象就总是代理对象。

AOP proxy:AOP代理,为了实现切面功能一个对象会被AOP框架创建出来。在Spring框架中AOP代理的默认方式是:有接口,就使用基于接口的JDK动态代理,否则使用基于类的CGLIB动态代理。但是我们可以通过设置proxy-target-class="true",完全使用CGLIB动态代理。

**Weaving:织入,**将一个或多个切面与类或对象链接在一起创建一个被增强对象。织入能发生在编译时 (compile time )(使用AspectJ编译器),加载时(load time),或运行时(runtime) 。Spring AOP默认就是运行时织入,可以通过枚举AdviceMode来设置。

Spring对事务隔离级别提供了支持:

NESTED表示,若当前存在事务,则采用嵌套事务执行此方法,否则就创建新事务来执行此方法。

@RequestMapping注解的属性:

method属性代表指定请求的method的类型,value属性指请求的实际地址,params是指定request中一定要有的参数值。required是@RequestParam注解的属性,是指该参数是否为必传项,默认为true,表示请求中一定要传入对应的参数。

Spring提供了众多容器类,最常用的有BeanFactory和ApplicationContext。

Spring容器中Bean包含五种作用域:singleton、prototype、request、session、globalSession。

Spring 七大模块

七大模块,如下:

  1. Spring Core: Core封装包是框架的最基础部分,提供IOC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。

  2. Spring Context: 构建于Core封装包基础上的 Context封装包,提供了一种框架式的对象访问方法,有些象JNDI注册器。Context封装包的特性得自于Beans封装包,并添加了对国际化(I18N)的支持(例如资源绑定),事件传播,资源装载的方式和Context的透明创建,比如说通过Servlet容器。

  3. Spring DAO: DAO (Data Access Object)提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。 并且,JDBC封装包还提供了一种比编程性更好的声明性事务管理方法,不仅仅是实现了特定接口,而且对所有的POJOs(plain old Java objects)都适用。

  4. Spring ORM: ORM 封装包提供了常用的“对象/关系”映射APIs的集成层。 其中包括JPAJDOHibernateiBatis 。利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,如前边提到的简单声明性事务管理。

  5. Spring AOP: Spring的 AOP 封装包提供了符合AOP Alliance规范的面向方面的编程实现,让你可以定义,例如方法拦截器(method-interceptors)和切点(pointcuts),从逻辑上讲,从而减弱代码的功能耦合,清晰的被分离开。而且,利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中。

  6. Spring Web: Spring中的 Web 包提供了基础的针对Web开发的集成特性,例如多方文件上传,利用Servlet listeners进行IOC容器初始化和针对Web的ApplicationContext。当与WebWork或Struts一起使用Spring时,这个包使Spring可与其他框架结合。

  7. Spring Web MVC: Spring中的MVC封装包提供了Web应用的Model-View-Controller(MVC)实现。Spring的MVC框架并不是仅仅提供一种传统的实现,它提供了一种清晰的分离模型,在领域模型代码和Web Form之间。并且,还可以借助Spring框架的其他特性。

错题

下列关于@RequestParam注解的说明中,错误的是( )

正确答案: D 你的答案: A (错误)

A、@RequestParam注解用于对HTTP请求参数和控制器方法参数进行映射。
B、@RequestParam注解的value成员用于指定要映射的HTTP请求参数名。
C、@RequestParam注解的required成员用于指定该参数是否必填。
D、@RequestParam注解的required成员默认值为false,也就是映射的参数默认可以为空。

@RequestParam注解的required成员用于指定该参数是否必填,其默认值为true,也就是映射的参数默认不能为空。

下列关于Spring MVC视图的说法中,错误的是( )

正确答案: D 你的答案: B (错误)

A、View是视图的顶层接口。
B、AbstractJackson2View不是逻辑视图,它不依赖ViewResolver的定位,直接将模型渲染为json。
C、AbstractUrlBasedView是逻辑视图,它依赖ViewResolver定位模板,然后将模型传入模板并渲染。
D、其他说法都不对

A、B、C选项的说法都是正确的。..??

下列关于Spring MVC获取参数的说法中,错误的是( )

正确答案: D 你的答案: B (错误)

A、@DateTimeFormat注解用于获取格式化的日期参数。
B、@NumberFormat注解用于获取格式化的数字参数。
C、@RequestBody注解用于从请求体中获取参数。
D、其他说法都不对

A、B、C三个选项的说法均是正确的。

关于Spring AOP的织入,下列说法错误的是( )

正确答案: D 你的答案: C (错误)

A、织入,就是将方面组件中定义的横切逻辑,织入到目标对象的连接点的过程。
B、可以在编译时织入,需要使用特殊的编译器。
C、可以在装载类时织入,需要使用特殊的类装载器。
D、可以在运行时织入,需要使用特殊的JRE。

D 织入是将增强添加对目标类具体连接点上的过程。AOP像一台织布机,将目标类、增强或引介通过AOP这台织布机天衣无缝地编织到一起。根据不同的实现技术,AOP有三种织入的方式: a、编译期织入,这要求使用特殊的Java编译器。 b、类装载期织入,这要求使用特殊的类装载器。 c、动态代理织入,在运行期为目标类添加增强生成子类的方式。 Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。

可以在运行时织入,需要为目标生成代理对象。

下列关于@ComponentScan注解的说法中,错误的是( )

正确答案: B 你的答案: A (错误)

A、@ComponentScan注解用于定义Bean的扫描策略。
B、@ComponentScan注解默认规则是对当前包的子包中的Bean进行扫描。
C、@ComponentScan注解的basePackages属性用于自定义要扫描哪些包。
D、@ComponentScan注解只是定义了扫描范围,在此范围内带有特定注解的Bean才会被载入容器。

@ComponentScan注解默认规则是对当前包及其子包中的Bean进行扫描。

关于Spring MVC拦截器,下列说法错误的是( )

正确答案: A 你的答案: D (错误)

A、开发Spring MVC拦截器,需实现WebMvcConfigurer接口。
B、preHandle方法在Controller之前执行,若返回false,则终止执行后续的请求。
C、postHandle方法在Controller之后、模板之前执行。
D、afterCompletion方法在模板之后执行。

拦截器需实现HandlerInterceptor接口,而WebMvcConfigurer接口是MVC配置类要实现的接口。

下列选项中,属于Spring MVC的注解的有( )

正确答案: A B C D 你的答案: A D (错误)

A、@RequestMapping
B、@RequestParam
C、@RequestBody
D、@PathVariable

上述4个选项均是Spring MVC的注解。

关于BeanFactory和FactoryBean,下列说法正确的是( )

正确答案: A D 你的答案: B C (错误)

A、BeanFactory是所有Spring Bean的容器根接口。
B、BeanFactory是一种创建Bean的方式。
C、FactoryBean是所有Spring Bean的容器根接口。
D、FactoryBean是一种创建Bean的方式。

BeanFactory是所有Spring Bean的容器根接口,其给IoC容器提供了一套完整的规范。FactoryBean是 一种创建Bean的方式,是对Bean的一种扩展。

以下关于@Autowired注解说法正确的是( )

正确答案: A C 你的答案: A D (错误)

A、@Autowired是Spring提供的注解。
B、@Autowired是JDK提供的注解。
C、@Autowired注解只能根据类型注入Bean。
D、@Autowired注解既可以根据类型注入Bean也可以根据名称注入Bean。

Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。 @Autowired**,Autowired同样实现了bean注入功能。只不过他是默认按照byType进行装配,如果匹配类型是多个直接抛出异常、当然这个问题是可以解决的那就是@Qualifier注解进行匹配**

下列关于Spring MVC注解的说法中,正确的是( )

正确答案: A B C D 你的答案: B C D (错误)

A、@ControllerAdvice用于定义控制器的通知类,它可以对指定的控制器进行增强。
B、@InitBinder用于定义控制器参数绑定规则,如转换规则,它会在参数转换之前执行。
C、@ExceptionHandler用于定义控制器发生异常后的操作。
D、@ModelAttribute用于定义控制器方法执行之前,对数据模型的操作。

A、B、C、D选项的说法都是正确的。

Spring创建Bean的方式有哪几种方式( )

正确答案: A C D 你的答案: A B D (错误)

A、构造器
B、接口
C、实例工厂
D、静态工厂

Spring容器创建Bean对象的方法有三种方式,分别是:用构造器来实例化,使用静态工厂方法实例化和使用实例工厂方法实例化。

在使用@Autowired注解时,如果一个类可以有多种类型,就会对Spring IoC 容器注入造成困扰,这种情况我们称之为歧义性,为解决这一问题,我们可以使用( )注解。

正确答案: B D 你的答案: C D (错误)

A、@Component
B、@Primary
C、@Resource
D、@Qualifier

@Autowired 注入声明的SpringBean对象,根据一定的规则首先按照注入的类型去查找,如果没有找到安装注入的名称去匹配你要注入的属性名称,如果都没有找到启动项目时抛出异常**,@Autowired(required = false) 表示没有找到注入对象时,不抛异常,注入null。**

@Primary 如果有多个相同类型的SpringBean,我们可以使用@Primary注解,优先注入带该注解标识的类,@Primary可以在多个类上标注,那就会抛异常。

@Qualifier 使用SpringBean的名称(SpringBean的名称都是唯一的)进行注入。

当发现有多种类型的Bean时,@Primary注解会通知IoC容器优先使用它所标注的Bean进行注入;@Quelifier注解可以与@AutoWired注解组合使用,达到通过类型和名称一起筛选Bean的效果。

关于IoC注解,下面说法错误的是( )

正确答案: A B C 你的答案: A B C D (错误)

A、@Autowired用于注入Bean,该注解只能写在成员变量的前面。
B、@Qualifier用于声明Bean的名称,该注解只能引用Bean的自定义名称。
C、@Bean用于装配第三方的Bean,它不能装配自定义的Bean。
D、@Configuration用于声明配置类,该注解是基于@Component实现的。

@AutoWired注解还可以写在set方法、构造器上;@Qualifier注解也可以引用默认名称;@Bean注解可以用于装配任何Bean。

Which method is used by a servlet to place its session ID in a URL that is written to the servlet’s response output stream?

正确答案: B 你的答案: C (错误)

A、The encodeURL method of the HttpServletRequest interface.
B、The encodeURL method of the HttpServletResponse interface.
C、The rewriteURL method of the HttpServletRequest interface.
D、The rewriteURL method of the HttpServletResponse interface.

B.

HttpServletResponse 接口提供了重写 URL 的方法:public java.lang.String encodeURL(java.lang.String url) 该方法的实现机制为: ● 先判断当前的 Web 组件是否启用 Session,如果没有启用 Session,直接返回参数 url。 ● 再判断客户端浏览器是否支持 Cookie,如果支持 Cookie,直接返回参数 url;如果不支持 Cookie,就在参数 url 中加入 Session ID 信息,然后返回修改后的 url。

Servlet接口的方法有哪些?

正确答案: C 你的答案: A B C D (错误)

A、doGet方法
B、doPost方法
C、init方法
D、forward方法

C.init方法

doGet和doPost是HttpServlet中的方法;forward是RequestDispatcher的方法

spring默认使用jdk动态代理,那么下面哪个配置是开启强制使用cglib代理

正确答案: A 你的答案: B (错误)

A、<aop:aspectj-autoproxy proxy-target-class="true"/>
B、<aop:scoped-proxy proxy-target-class="true" >
C、<aop:aspectj-autoproxy expose-proxy="true"/>
D、<aop:config proxy-target-class="false"/>
  • aop:aspectj-autoproxy/自动为配置了@AspectJ的 Bean 创建。

  • aop:scoped-proxy用于 Bean 之间的生命周期。

  • aop:config用于完成 AOP 相关配置。

  • proxy-target-class="false"表示使用 JDK 动态***织入。

  • proxy-target-class="true"表示使用 CGLIB ***织入。

Spring框架中的核心思想包括什么?

正确答案: A B D 你的答案: A B (错误)

A、依赖注入
B、控制反转
C、面向对象
D、面向切面

DI(依赖注入),IOC(控制反转),AOP(面向切面编程)

以下关于Spring的说法是正确( )

正确答案: B D 你的答案: B D (正确)

A、Spring 不能和Hibernate一样设置bean是否为延迟加载
B、在Spring配置文件中,就可以设置Bean初始化函数和消亡函数
C、属性注入只能是简单数据,构造方法注入可以是对象
D、对象的设计应使类和构件之间的耦合最小

A、延迟加载有2种方法:一是hibernate提供的延迟载入机制;二是Spring框架提供的DAO模式结合Hibernate延迟加载的Web方案。故A错; B、spring可以 在配置文件中 配置Bean初始化函数和消亡函数,故B对; C、spring可以注入复杂的数据类型比如对象、数组、List集合、map集合、Properties等,故C错; D、对象之间的耦合越高,维护成本越高。对象的设计应使类和构件之间的耦合最小,故D对. 综上所述,答案为B、D.

end
  • 作者:AWhiteElephant(联系作者)
  • 发表时间:2022-03-20 11:18
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 评论