spring基础题笔记(1)
已知项目中定义了如下Controller:
@Controller
@RequestMapping("/user")
public class UserControlelr {
@RequestMapping(path = "/otp/{phone}", method = RequestMethod.GET)
@ResponseBody
public String getOTP(@PathVariable("phone") String phone) {
...
}
}
以下URL中,可以正确访问UserController的getOTP方法的是( )
A./user/otp
B./otp/user
C./user/otp/13912345678
D./otp/13912345678/user
答案解析:Controller中方法的访问路径是“类的访问路径+方法的访问路径”,而getOTP()方法的访问路径有两级,其中第二级是代表手机号的字符串
Springboot三层架构--DAO层、Service层、Colltroler层--这波我在外太空-CSDN博客
下列选项中,哪一项不是Spring AOP支持的通知类型( )
A.前置通知
B.后置通知
C.织入通知
D.异常通知
答案解析:Spring AOP支持的通知类型包括前置通知、后置通知、环绕通知、返回通知、异常通知。
SpringAOP(图文详解)_spring aop-CSDN博客
在BeanFactory定义方法中,哪个方法可以用于获取Bean的Class类型( )
A.getType(String name)
B.getBean(String name)
C.containsBean(String name)
D.isSingleton(String name)
答案解析:getBean(String name)方法是从Spring容器中获取对应Bean对象的方法,如存在,则返回该对象。containsBean(String name)方法用于判断Spring容器中是否存在该对象。isSingleton(String name)方法用于判断Bean对象是否为单例对象。
Spring之BeanFactory详解-CSDN博客
有关MVC的处理过程,描述不正确的是( )
A.首先控制器接收用户的请求,决定调用哪个模型来进行处理。
B.模型处理用户的请求并返回数据。
C.模型确定调用哪个视图进行数据展示。
D.视图将模型返回的数据呈现给用户。
答案解析:MVC的处理过程,首先控制器接受用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
关于Spring MVC拦截器,下列说法错误的是( )
A.开发Spring MVC拦截器,需实现WebMvcConfigurer接口。
B.preHandle方法在Controller之前执行,若返回false,则终止执行后续的请求。
C.postHandle方法在Controller之后、模板之前执行。
D.afterCompletion方法在模板之后执行。
答案解析:拦截器是SpringMVC中的一个核心应用组件,主要用于处理多个 Controller的共性问题.当我们的请求由DispatcherServlet派发 到具体Controller之前首先要执行拦截器中一些相关方法,在这些 方法中可以对请求进行相应预处理(例如权限检测,参数验证),这些方法可以决定对这个请求进行拦截还是放行.
>>服务器一启动,就会创建拦截器对象, >>对拦截器配置延迟加载是没有用的 >>拦截器是单例的,整个过程,拦截器只有一个实例对象 拦截器需要实现 HandleInterceptor接口,或者继承HandlerInterceptorAdaptor抽象类;
HandlerInterceptor接口的三个方法:
1,preHandle() 是拦截器最先执行的方法,是在请求到达Controller之前执行的,其实就是拦截器用于拦截请求的,三个参数,分别是request,response,handelr就是这个请求要去找的后端处理器Controller.方法的返回值是bloolean类型,如果返回为false,就说明请求在此终结,不能执行后面的代码了.如果返回值为true,那么这个拦截器就要放行,将请求交给后端处理器Controller.
2,postHandle() 这个方法,是在后端控制器controller处理完请求之后,就执行的,这个方法,多了一个参数,ModelAndView,后端控制器controller处理请求可能需要返回页面和数据,所以会多一个ModelAndView,但是这个方法,是在渲染页面之前执行的,渲染热面是交个前端控制器来完成的.
3,afterCompletion() 拦截器最后执行的方法
Spring MVC详解(学习总结)_springmvc技能经验描述-CSDN博客
下列关于Spring MVC注解的描述中,错误的是( )
A.@RequestMapping可以声明类或方法的访问路径,还可以声明请求的方式。
B.@PathVariable可以将请求路径中的参数,绑定到控制器中方法的参数。
C.@RequestParam可以将请求对象中的参数,绑定到控制器中方法的参数。
D.@ResponseBody用于向浏览器响应字符串,它只能应用于异步请求之中。
答案解析:
@RequestMapping
注解确实可以声明类或方法的访问路径,并且可以指定请求的方式(如GET、POST等),所以A是正确的。@PathVariable
注解用于将URL中的占位符参数绑定到Controller的方法参数上,所以B是正确的。@RequestParam
注解用于将请求参数(通常来自查询字符串或表单数据)绑定到Controller的方法参数上,所以C是正确的。@ResponseBody
注解用于告诉Spring MVC框架,该方法的返回值应该直接作为HTTP响应的正文返回给客户端,而不是返回一个视图。它并不仅限于异步请求,而是用于同步和异步请求中,只要需要将方法的返回值直接写入HTTP响应体中。因此,D描述错误,@ResponseBody
可以用于任何类型的请求中,不仅仅是异步请求。
深入解析Spring MVC注解:@PathVariable、@ResponseBody和@RequestParam的用法和区别_pathvariable responsebody-CSDN博客
下列类型中,不可以作为Spring MVC数据模型的是( )
A.Model
B.ModelAttribute
C.ModelMap
D.ModelAndView
答案解析:
-
ModelAndView:
当Controller的方法返回值类型为ModelAndView
时,可以在方法体内通过这个对象添加模型数据,并且指定视图名称。 -
Map及Model:
如果Controller的方法参数是org.springframework.ui.Model
、org.springframework.ui.ModelMap
或者java.util.Map
类型,那么在方法执行完毕后,这些Map中的数据会自动添加到模型中。 -
@SessionAttributes:
@SessionAttributes
注解用于将模型中的某个属性暂存到HttpSession
中,以便在多个请求之间共享这个属性。这通常用于表单数据的跨请求持久化。 -
@ModelAttribute:
@ModelAttribute
注解可以用于方法的参数,这样标记的参数对象会自动添加到数据模型中。这通常用于将表单数据绑定到Controller的方法参数上。
关于Spring MVC开发,下列说法错误的是( )
A.在控制器的方法中,我们可以直接使用Request、Response对象处理请求与响应。
B.ModelAndView对象,既可以存储模型数据,又可以存储模板路径。
C.Model对象只能存放模型数据,它和ModelAndView一样,需要主动实例化。
D.Spring MVC的核心组件是DispatcherServlet,它负责分发所有的请求。
答案解析:Model 对象可以被自动实例化。
关于BeanFactory和FactoryBean,下列说法正确的是( )
A.BeanFactory是所有Spring Bean的容器根接口。
B.BeanFactory是一种创建Bean的方式。
C.FactoryBean是所有Spring Bean的容器根接口。
D.FactoryBean是一种创建Bean的方式。
答案解析:
BeanFactory以Factory结尾,表示它是⼀个⼯⼚类(接⼝),⽤于管理Bean的⼀个⼯⼚。在Spring中,BeanFactory是 IOC容器的核⼼接⼝,它的职责包括:实例化、定位、配置应⽤程序中的对象及建⽴这些对象间的依赖。
FactoryBean以Bean结尾,表示它是⼀个Bean,不同于普通Bean的是:它是实现了FactoryBean接⼝的Bean,根据该 Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,⽽不是FactoryBean本身,如果要获 取FactoryBean对象,请在id前⾯加⼀个&符号来获取。
关于IoC注解,下面说法错误的是( )
A.@Autowired用于注入Bean,该注解只能写在成员变量的前面。
B.@Qualifier用于声明Bean的名称,该注解只能引用Bean的自定义名称。
C.@Bean用于装配第三方的Bean,它不能装配自定义的Bean。
D.@Configuration用于声明配置类,该注解是基于@Component实现的。
答案解析:@AutoWired注解还可以写在set方法、构造器上;@Qualifier注解也可以引用默认名称;@Bean注解可以用于装配任何Bean。
Java注解之@Autowired,一文掌握@Autowired注解知识(1)-CSDN博客
spring中@Qualifier注解的使用-CSDN博客
@Bean注解详解-CSDN博客
下列关于@RequestParam注解的说明中,错误的是( )
A.@RequestParam注解用于对HTTP请求参数和控制器方法参数进行映射。
B.@RequestParam注解的value成员用于指定要映射的HTTP请求参数名。
C.@RequestParam注解的required成员用于指定该参数是否必填。
D.@RequestParam注解的required成员默认值为false,也就是映射的参数默认可以为空。
答案解析:
@RequestParam
1、可以对传入参数指定参数名
@RequestParam String inputStr // 下面的对传入参数指定为aa,如果前端不传aa参数名,会报错 @RequestParam(value="aa") String inputStr
2、可以通过required=false或者true来要求@RequestParam配置的前端参数是否一定要传
// required=false表示不传的话,会给参数赋值为null,required=true就是必须要有 @RequestMapping("testRequestParam") public String filesUpload( @RequestParam(value="aa", required=true) String inputStr, HttpServletRequest request)
默认值是true,映射的参数不能为空。
3、如果用@RequestMapping注解的参数是int基本类型,但是required=false,这时如果不传参数值会报错,因为不传值,会赋值为null给int,这个不可以
@RequestMapping("testRequestParam") public String filesUpload( @RequestParam(value="aa", required=true) String inputStr, @RequestParam(value="inputInt", required=false) int inputInt, HttpServletRequest request) { // ......省略 return "index"; }
4.@RequestParam 有三个属性:
(1)value:请求参数名(必须配置)
(2)required:是否必需,默认为 true,即 请求中必须包含该参数,如果没有包含,将会抛出异常(可选配置)
(3)defaultValue:默认值,如果设置了该值,required 将自动设为 false,无论你是否配置了required,配置了什么值,都是 false(可选配置)
5.比较常用的两种配置
//配置一个 @RequestParam("") 或 @RequestParam(value="") //配置多个 @RequestParam(value="", required=true, defaultValue="")
深入理解@RequestParam注解:Spring MVC参数绑定的利器-CSDN博客
@RequestMapping详解-CSDN博客
@RequestMapping注解的属性不包括以下哪个( )
A.method
B.value
C.required
D.params
答案解析:method属性代表指定请求的method的类型,value属性指请求的实际地址,params是指定request中一定要有的参数值。required是@RequestParam注解的属性,是指该参数是否为必传项,默认为true,表示请求中一定要传入对应的参数。
下列关于Spring AOP的实现方式的说法中,正确的是( )
A.JDK动态代理,是Java提供的动态代理技术,可以在运行时创建接口的代理实例。
B.JDK动态代理,是Java提供的动态代理技术,可以在运行时创建子类的代理实例。
C.CGLib动态代理,采用底层的字节码技术,在运行时创建接口代理的实例。
D.CGLib动态代理,采用底层的字节码技术,在运行时创建子类代理的实例。
答案解析:
静态代理:也就是自己手动创建的代理对象
动态代理:也就是在程序运行中通过配置参生的
那么Spring的AOP也就是面向切面编程,就是基于动态代理来实现的,通过代理原始类增加额外功能,我们可以将额外功能一次定义然后配合切点达到多次使用的效果,比如 做日志 事物 时间等…提高了复用性 开发效率.
在Spirng当中动态代理有两种
第一种也就是JDK自带的动态代理
1.JDK动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理.需要指定一个类加载器,然后生成的代理对象实现类的接口或类的类型,接着处理额外功能.JDK是基于接口
第二种也就是Cglib的动态代理
2.Cglib是动态代理利用asm的开源包,对代理对象的Class文件加载进来,通过修改其字节码生成的子类来处理
Cglib是基于继承父类生成的代理类.
在Spirng当中动态代理的使用
1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理来实现AOP
2.如果目标对象实现了接口,也可以强制使用CGlib来实现AOP
3.如果目标对象没有实现接口,必须采用Cglib库,Spirng会自动在JDK和CGlib用切换
如何强制使用CGlib来实现AOP?
1.添加CGlibjar包:SPRING_HOME/cglib/*.jar
2.在Spring的配置文件中加入 //默认是false 也就是用JDK的 改为true就是用Cglib的
JDK和动态代理和CGlib字节码的生成区别?
1.JDK动态代理制能对实现了接口的类生成代理,而不是针对类
2.CGLIB是针对类实现代理,主要对指定的类生成一个子类,覆盖其中的方法,添加额外功能,因为是继承,所以该类方法不能用final来声明.
在使用@Autowired注解时,如果一个类可以有多种类型,就会对Spring IoC 容器注入造成困扰,这种情况我们称之为歧义性,为解决这一问题,我们可以使用( )注解。
A.@Component
B.@Primary
C.@Resource
D.@Qualifier
@Autowired
注入声明的SpringBean对象,根据一定的规则首先按照注入的类型去查找,如果没有找到安装注入的名称去匹配你要注入的属性名称,如果都没有找到启动项目时抛出异常,@Autowired(required = false) 表示没有找到注入对象时,不抛异常,注入null。
@Primary
如果有多个相同类型的SpringBean,我们可以使用@Primary注解,优先注入带该注解标识的类,@Primary可以在多个类上标注,那就会抛异常。
@Quelifier
使用SpringBean的名称(SpringBean的名称都是唯一的)进行注入。
@Primary-在spring中常被忽视的注解-CSDN博客
以下关于@Autowired注解说法正确的是( )
A.@Autowired是Spring提供的注解。
B.@Autowired是JDK提供的注解。
C.@Autowired注解只能根据类型注入Bean。
D.@Autowired注解既可以根据类型注入Bean也可以根据名称注入Bean。
答案解析:@Autowired
不是JDK提供的注解,而是Spring框架提供的。@Autowired
注解默认情况下是按照类型(byType)进行注入的,但是它也支持按照名称(byName)注入。
-
@Autowired 的默认行为:
@Autowired
注解默认情况下是按照类型(byType)进行自动装配的。如果容器中存在多个相同类型的Bean,Spring将无法决定注入哪一个,除非使用@Qualifier
注解指定Bean的名称,或者只有一个Bean被标记为@Primary
。
-
@Autowired 的装配模型:
@Autowired
并没有AUTOWIRE_NO
、AUTOWIRE_BY_NAME
、AUTOWIRE_BY_TYPE
和AUTOWIRE_CONSTRUCTOR
这些枚举值。这些值实际上是@Autowired
注解的required
属性的配置选项,用于控制是否需要自动装配以及如何装配:required=true
(默认):如果找不到匹配的Bean,则抛出异常。required=false
:如果找不到匹配的Bean,则注入null
。
@Autowired
注解本身并不直接支持byName装配,这是通过@Qualifier
注解来实现的。
-
@Resource 注解:
@Resource
注解确实是由JDK提供的,用于依赖注入。它默认按照byName进行自动装配,但也可以通过name
属性指定Bean的名称,或者通过type
属性指定Bean的类型。@Resource
可以与@Primary
注解一起使用,以解决多个Bean匹配的情况。
-
@Autowired 和 @Resource 的区别:
@Autowired
是Spring提供的注解,而@Resource
是JDK提供的注解。@Autowired
默认按类型装配,而@Resource
默认按名称装配。@Autowired
可以与@Qualifier
注解一起使用来指定Bean的名称,而@Resource
可以通过name
属性直接指定Bean的名称。
菜鸟的springboot常用注解总结-CSDN博客