java的求职者经常面临的一些面试题目,springmvc的题目,虽然市面上大部分公司都已不在使用mvc,而是用springboot,但是在面试的时候还是会问这些问题来验证求职者对于其原理的理解程度.
first day:
(1)用户发送请求至前端控制器DispatcherServlet;
(2)DispatcherServlet 收到请求后,调用HandlerMapping 处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
(4)DispatcherServlet 调用HandlerAdapter 处理器适配器;
(5)HandlerAdapter 经过适配调用具体处理器(Handler,也叫后端控制器);
(6)Handler 执行完成返回ModelAndView;
(7)HandlerAdapter将Handler的执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet 将ModelAndView 传给ViewResolver 视图解析器进行解析;
(9)ViewResolver 解析后返回具体View;
(10)DispatcherServlet 对View 进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet 响应用户。
附注:关于spring的一些注解
注解总结
注解的属性:如果注解中有且只有一个属性要赋值时,且名称是 value,value 在赋值是可以不写。
1.spring
1.1声明bean的 创建对象的
1.1.1 @Componet:
作用:把资源让 spring 来管理。相当于在 xml 中配置一个 bean。
属性:value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写。
1.1.1.1 @Controller:一般用于表现层的注解。
1.1.1.2 @Service:一般用于业务层的注解。
1.1.1.3 @Repository::一般用于持久层的注解。
1.1.2 @Bean
作用:该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。
属性:name:给当前@Bean 注解方法创建的对象指定一个名称(即 bean 的 id)
1.2注入数据的
1.2.1 @Autowired
作用:自动按照类型注入。当使用注解注入属性时,不写set 方法。它只能注入其他 bean 类型。当有多个
类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到
就报错。
1.2.2 @Qualifier
作用:在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和
@Autowire 一起使用;但是给方法参数注入时,可以独立使用
属性:value:指定 bean 的 id
1.2.3 @Resource
作用:直接按照 Bean 的 id 注入。它也只能注入其他 bean 类型。
属性:name:指定 bean 的 id。
1.2.1. @Value("${属性名}")
作用:注入基本数据类型和 String 类型数据
属性:value:用于指定值
1.3用于改变作用范围的
1.3.1 @Scope
作用:指定 bean 的作用范围。
属性:value:指定范围的值。 取值:singleton(单实例) prototype request session globalsession
1.4和生命周期相关的:
1.4.1 @PostConstruct 作用:用于指定初始化方法。
1.4.2 @PreDestroy 作用:用于指定销毁方法。
1.5 新注解
1.5.1 @Configuration
作用:用于指定当前类是一个 spring 配置类,当创建容器时会从该类上加载注解。
获取容器时需要使用AnnotationApplicationContext(有@Configuration 注解的类.class)。
属性:value:用于指定配置类的字节码
1.5.2 @ComponentScan
作用:用于指定 spring 在初始化容器时要扫描的包。作用和在 spring 的 xml 配置文件中的:是一样的。
属性:basePackages:用于指定要扫描的包。和该注解中的 value 属性作用一样。
1.5.3 @PropertySource
作用:用于加载.properties 文件中的配置。例如我们配置数据源时,
可以把连接数据库的信息写到properties 配置文件中,就可以使用此注解指定 properties 配置文件的位置
属性:value[]:用于指定 properties 文件位置。如果是在类路径下,需要写上 classpath
1.5.4 @Import
作用:用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration 注解。当然,写上也没问题。
属性:value[]:用于指定其他配置类的字节码
2.AOP 相关
2.1 @Aspect
作用:把当前类声明为切面类。
2.2 @Before
作用:把当前方法看成是前置通知。
属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用
2.3 @AfterReturning
作用:把当前方法看成是后置通知。
属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用
2.4 @AfterThrowing
作用:把当前方法看成是异常通知。
属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用
2.5 @After
作用:把当前方法看成是最终通知。
属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用
2.6 @Around
作用:把当前方法看成是环绕通知。
属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用。
2.7 @Pointcut
作用:指定切入点表达式
属性:value:指定表达式的内容
2.8 @EnableAspectJAutoProxy:
作用:表示开启AOP代理自动配置
2.9 事务相关
2.9.1 @EnableTransactionManagement
作用:开启spring事务管理,
2.9.2 @Transactional
作用:出现接口上,表示该接口的所有实现类都有事务支持。
出现在类上,表示类中所有方法有事务支持
出现在方法上,表示方法有事务支持。
以上三个位置的优先级:方法>类>接口
3.mybatis 相关
3.1 @Insert:作用:实现新增
3.2 @Update:作用:实现更新
3.3 @Delete:作用:实现删除
3.4 @Select:作用:实现查询
3.5 @Result:
作用:实现结果集封装
属性:id、column,property,one,many
3.6 @Results:可以与@Result 一起使用,封装多个结果集
3.4 @ResultMap:实现引用@Results 定义的封装
3.8 @One:作用:实现一对一结果集封装
3.9 @Many:作用:实现一对多结果集封装
3.10 @SelectProvider:作用: 实现动态 SQL 映射
3.11 @CacheNamespace:作用:实现注解二级缓存的使用
3.12 @SelectKey 作用:与@Insert和@update 一起使用返回修改的id
3.13 @Param 作用:入参绑定
3.14 @ResultType 作用:返回值
4.SpringMVC:
4.1 @RequestMapping
作用:是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
属性: value, method,
4.2 @RequestParam
作用:把请求中指定名称的参数给控制器中的形参赋值。
属性:value:请求参数中的名称。
4.3 @RequestBody
作用:用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。get 请求方式不适用。
属性:required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值为 false,get 请求得到是 null
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
4.4 @PathVaribale
作用:用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之后加入的。
是 springmvc 支持 rest 风格 URL 的一个重要标志。
属性:value:用于指定 url 中占位符名称。required:是否必须提供占位符
4.5 @ResponseBody
作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;\
4.6 @RequestHeader
作用:用于获取请求消息头。
属性:value:提供消息头名称required:是否必须有此消息头
注:在实际开发中一般不怎么用。
4.7 @CookieValue
作用:用于把指定 cookie 名称的值传入控制器方法参数。
属性:value:指定 cookie 的名称。required:是否必须有此 cookie。
4.8 @ModelAttribute
作用:该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可
以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值。
属性:value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
4.9 @SessionAttribute
作用:用于多次执行控制器方法间的参数共享。
属性:value:用于指定存入的属性名称type:用于指定存入的数据类型。
5.junit: @BeforeClass –> @Before –> @Test –> @After –> @AfterClass
5.1 @RunWith
作用:可以更改测试运行器 ,缺省值 org.junit.runner.Runner
属性:value 用什么运行:SpringJUnit4ClassRunner.class spring;JUnit4.class)就是指用JUnit4来运行 Suite.class)的话就是一套测试集合,
@SuitClasses(MyTest.Class,MyTest2.Class)
这个是打包测试功能,多个class 可以一起执行测试,不需要一个一个执行,这样节省时间,提高效率
5.2 @ContextConfiguration
作用:Spring整合JUnit4测试时,使用注解引入多个配置文件
属性: locations = { "classpath:spring1.xml", "classpath:spring2.xml" };classes = SimpleConfiguration.class
5.3 @BeforeClass:作用: 针对所有测试,只执行一次,且必须为static void
5.4 @Before:作用:初始化方法,执行当前测试类的每个测试方法前执行。
5.5 @Test:作用:测试方法,在这里可以测试期望异常和超时时间
5.6 @After:作用:释放资源,执行当前测试类的每个测试方法后执行
5.7 @AfterClass:作用:针对所有测试,只执行一次,且必须为static void
5.8 @Ignore:作用:忽略的测试方法(只在测试类的时候生效,单独执行该测试方法无效)
6.springboot 相关注解
6.1 @SpringBootApplication
作用:引导类
包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文。
6.2 @EnableAutoConfiguration 自动配置。
6.3 @ComponentScan 组件扫描,可自动发现和装配一些Bean。
6.4 @Component可配合CommandLineRunner使用,在程序启动后执行一些基础任务。
6.5 @RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。
6.6 @ConfigurationProperties
作用 可以将配置文件中的配置自动与实体进行映射
属性 prefix
6.7 @Mapper
作用 标记该类是一个mybatis的mapper接口,可以被spring boot自动扫描到spring上下文中
6.8 @SpringBootTest
属性 class:@SpringBootTest的属性指定的是引导类的字节码对象
7.jpa
7.1 @Entity
作用:声明实体类
7.2 @Table
作用:建立实体类和表的映射关系
属性 name
7.3 @Id//声明当前私有属性为主键
7.4 @GeneratedValue
作用:配置主键的生成策略
属性:(strategy=GenerationType.*)
7.5 @Column(")
作用:指定和表中字段的映射关系
属性:name
7.6 @Query
作用: 使用jpql的方式查询。
7.7 @Modifying
作用:修改
7.8 @One
作用:用于映射多对一的关系
7.9 @Many
作用:用于映射多对多关系
属性:cascade:配置级联操作。
fetch:配置是否采用延迟加载。
targetEntity:配置目标的实体类。映射多对多的时候不用写