辛苦牛,掌握主流技术栈,包括前端后端,已经7年时间,曾在税务机关从事开发工作,目前在国企任职。希望通过自己的不断分享,可以帮助各位想或者已经走在这条路上的朋友一定的帮助
❤️金九银十马上就要来啦,各位小伙伴们有计划跳槽的要开始准备了,博主接下来一段时间会给大家持续更新面试题目,大家持续关注一下,感谢
今天是一个小面试合集,Spring Data JPA、Spring MVC、AOP
之前的面试文章链接也给到大家
金九银十面试题之Mysql
金九银十面试题之设计模式
金九银十面试题之数据结构和算法
金九银十面试题之Mybatis
ORM 即 Object-Relational Mapping ,表示对象关系映射,映射的不只是对象的值还有对象之间的关 系,通过 ORM 就可以把对象映射到关系型数据库中。操作实体类就相当于操作数据库表,可以不再重 点关注 SQL 语句。
只需要持久层接口继承 JpaRepository 即可,泛型参数列表中第一个参数是实体类类型,第二个参数是主键类型。
运行时通过 JdkDynamicAopProxy 的 invoke 方法创建了一个动态代理对象SimpleJpaRepository ,SimpleJpaRepository 中封装了JPA的操作,通过hibernate(封装了JDBC)完成数据库操作。
@Entity :表明当前类是一个实体类。
@Table :关联实体类和数据库表。
@Column :关联实体类属性和数据库表中字段。
@Id :声明当前属性为数据库表主键对应的属性。
@GeneratedValue : 配置主键生成策略。
@OneToMany :配置一对多关系,mappedBy 属性值为主表实体类在从表实体类中对应的属性名。 @ManyToOne :配置多对一关系,targetEntity 属性值为主表对应实体类的字节码。
@JoinColumn :配置外键关系,name 属性值为外键名称,referencedColumnName 属性值为主表主 键名称。
通过 get 方法查询一个对象的同时,通过此对象可以查询它的关联对象。
对象导航查询一到多默认使用延迟加载的形式, 关联对象是集合,因此使用立即加载可能浪费资源。对象导航查询多到一默认使用立即加载的形式, 关联对象是一个对象,因此使用立即加载。
如果要改变加载方式,在实体类注解配置加上 fetch 属性即可,LAZY 表示延迟加载,EAGER 表示立即 加载。
Web 容器启动时会通知 Spring 初始化容器,加载 Bean 的定义信息并初始化所有单例 Bean,然后遍历 容器中的 Bean,获取每一个 Controller 中的所有方法访问的 URL,将 URL 和对应的 Controller 保存 到一个 Map 集合中。
所有的请求会转发给 DispatcherServlet 前端处理器处理,DispatcherServlet 会请求 HandlerMapping 找出容器中被 @Controler 注解修饰的 Bean 以及被 @RequestMapping 修饰的方法和类,生成 Handler 和 HandlerInterceptor 并以一个 HandlerExcutionChain 处理器执行链的形式返回。
之后 DispatcherServlet 使用 Handler 找到对应的 HandlerApapter,通过 HandlerApapter 调用 Handler 的方法,将请求参数绑定到方法的形参上,执行方法处理请求并得到 ModelAndView。
最后 DispatcherServlet 根据使用 ViewResolver 试图解析器对得到的 ModelAndView 逻辑视图进行解 析得到 View 物理视图,然后对视图渲染,将数据填充到视图中并返回给客户端。
DispatcherServlet :SpringMVC 中的前端控制器,是整个流程控制的核心,负责接收请求并转发给
对应的处理组件。
Handler :处理器,完成具体业务逻辑,相当于 Servlet 或 Action。
HandlerMapping :完成 URL 到 Controller 映射,DispatcherServlet 通过 HandlerMapping 将不同请求映射到不同 Handler。
HandlerInterceptor :处理器拦截器,是一个接口,如果需要完成一些拦截处理,可以实现该接口。
HandlerExecutionChain :处理器执行链,包括两部分内容:Handler 和 HandlerInterceptor。
HandlerAdapter :处理器适配器,Handler执行业务方法前需要进行一系列操作,包括表单数据验 证、数据类型转换、将表单数据封装到JavaBean等,这些操作都由 HandlerAdapter 完成。 DispatcherServlet 通过 HandlerAdapter 来执行不同的 Handler。
ModelAndView :装载模型数据和视图信息,作为 Handler 处理结果返回给 DispatcherServlet。 ViewResolver :视图解析器,DispatcherServlet 通过它将逻辑视图解析为物理视图,最终将渲染的结果响应给客户端。
@RequtestMapping :将URL请求和业务方法映射起来,在类和方法定义上都可以添加该注
解。 value 属性指定URL请求的实际地址,是默认值。 method 属性限制请求的方法类型,包括GET、 POST、PUT、DELETE等。如果没有使用指定的请求方法请求URL,会报405 Method Not Allowed 错误。params 属性限制必须提供的参数,如果没有会报错。
@RequestParam :如果 Controller 方法的形参和 URL 参数名一致可以不添加注解,如果不一致可以使 用该注解绑定。 value 属性表示HTTP请求中的参数名。 required 属性设置参数是否必要,默认 false。 defaultValue 属性指定没有给参数赋值时的默认值。
@PathVariable :Spring MVC 支持 RESTful ⻛格 URL,通过 @PathVariable 完成请求参数与形参的绑定。
AOP 即面向切面编程,简单地说就是将代码中重复的部分抽取出来,在需要执行的时候使用动态代理技 术,在不修改源码的基础上对方法进行增强。
Spring 根据类是否实现接口来判断动态代理方式,如果实现接口会使用 JDK 的动态代理,核心是 InvocationHandler 接口和 Proxy 类,如果没有实现接口会使用 CGLib 动态代理,CGLib 是在运行时动 态生成某个类的子类,如果某个类被标记为 final,不能使用 CGLib 。
JDK 动态代理主要通过重组字节码实现,首先获得被代理对象的引用和所有接口,生成新的类必须实现 被代理类的所有接口,动态生成Java 代码后编译新生成的 .class 文件并重新加载到 JVM 运行。JDK 代理直接写 Class 字节码,CGLib 是采用 ASM 框架写字节码,生成代理类的效率低。但是 CGLib 调用 方法的效率高,因为 JDK 使用反射调用方法,CGLib 使用 FastClass 机制为代理类和被代理类各生成一个类,这个类会为代理类或被代理类的方法生成一个 index,这个 index 可以作为参数直接定位要调用 的方法。
常用场景包括权限认证、自动缓存、错误处理、日志、调试和事务等。
@Aspect :声明被注解的类是一个切面 Bean。
@Before :前置通知,指在某个连接点之前执行的通知。
@After :后置通知,指某个连接点退出时执行的通知(不论正常返回还是异常退出)。
@AfterReturning :返回后通知,指某连接点正常完成之后执行的通知,返回值使用returning属性接 收。
@AfterThrowing :异常通知,指方法抛出异常导致退出时执行的通知,和 @AfterReturning 只会有 一个执行,异常使用throwing属性接收。
Aspect :切面,一个关注点的模块化,这个关注点可能会横切多个对象。
Joinpoint :连接点,程序执行过程中的某一行为,即业务层中的所有方法。。
Advice :通知,指切面对于某个连接点所产生的动作,包括前置通知、后置通知、返回后通知、异常 通知和环绕通知。
Pointcut :切入点,指被拦截的连接点,切入点一定是连接点,但连接点不一定是切入点。
Proxy :代理,Spring AOP 中有 JDK 动态代理和 CGLib 代理,目标对象实现了接口时采用 JDK 动态代
理,反之采用 CGLib 代理。
Target :代理的目标对象,指一个或多个切面所通知的对象。 Weaving :织入,指把增强应用到目标对象来创建代理对象的过程。
Spring AOP 由 BeanPostProcessor 后置处理器开始,这个后置处理器是一个***,可以监听容器触发 的 Bean 生命周期事件,向容器注册后置处理器以后,容器中管理的 Bean 就具备了接收 IoC 容器回调 事件的能力。BeanPostProcessor的调用发生在 SpringIoC容器完成 Bean实例对象的创建和属性的
依赖注入后,为 Bean 对象添加后置处理器的入口是 initializeBean 方法。
Spring中JDK动态代理通过JdkDynamicAopProxy调用Proxy的 newInstance 方法来生成代理类,
JdkDynamicAopProxy也实现了InvocationHandler接口,invoke 方法的具体逻辑是先获取应用到此 方法上的拦截器链,如果有拦截器则创建 MethodInvocation 并调用其proceed 方法,否则直接反射 调用目标方法。因此 Spring AOP 对目标对象的增强是通过拦截器实现的。
希望博主收集的内容能帮到大家,祝大家能找到一个好的工作,过好的生活,如有错误欢迎指正。