面试的java八股文*框架

框架

spring,springmvc,springboot

mybatis,springcloud

简述下Ioc和DI

它是将创建的对象的权限交由给spring容器,由它统一创建统一分配。
控制反转概念就是对组件对象的控制权的转移,由程序代码本身转移到外部容器。
DI:依赖注入,用一个单独的对象来装配对象之间的依赖关系
在IOC创建号对象之后,为这个对象注入属性,这个过程就是依赖注入

Ioc的实现原理是什么

工厂模式加反射机制,通过反射获取接口的实例,需要传入完整的包名和类名

谈谈spring的事务以及spring事务管理的传播特性

Spring的事务:编程式事务和声明式事务(aop实现的将事务逻辑提出来切面)
编程式事务是用xml实现的,声明式事务是通过注解式实现的
事务管理的传播特性:
① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。

Spring Bean 的生命周期

单个实例(singleton)
创建一个实例,随着spring容器的bean而创建
Spring容器存在,单例对象一直存在
Spring容器的消亡,单例对象跟着一起消亡

多个实例
Spring容器而创建多个实例(容器创建时,多例对象延迟加载,直到使用该对象由spring容器创建)
Spring容器存在,多个实例对象一直存在(只要对象一直被使用,就一直在存在)
Spring容器的消亡,多个实例不会消失,通过java的回收机制消失
谈谈你对mvc的理解
MVC时model-view-controller的简称,即模型-视图-控制器。
mvc是一种设计模式,它强制的吧应用程序的输入、处理和输出分开
视图:视图是用户看到并与之交互的界面,视图向用户显示相关的数据,并接受用户的输入。视图不进行任何的逻辑处理。
模型:模型表示业务数据和业务处理,相当于javaBean。一个模型能为多个视图提供数据。提高了程序的重用性。
控制器:当用户单击页面的提交按时,控制器接受请求并调用相应的模型去处理,然后根据处理结果调用相应的视图来显示处理结果。
MVC的处理过程:首先控制器接受用户请求,调用相应的模型来进行业务处理,并返回数据给控制器,控制器调用相应的视图来显示处理结果,并通过视图呈现给用户
Bean的作用域
spring 支持 5 种作用域,如下:
singleton:spring ioc 容器中只存在一个 bean 实例,bean 以单例模式存在,是系统默认值;
prototype:每次从容器调用 bean 时都会创建一个新的示例,既每次 getBean()相当于执行 new Bean()操作;
Web 环境下的作用域:
request:每次 http 请求都会创建一个 bean;
session:同一个 http session 共享一个 bean 实例;
global-session:用于 portlet 容器,因为每个 portlet 有单独的 session,globalsession 提供一个全局性的 http session。
注意: 使用 prototype 作用域需要慎重的思考,因为频繁创建和销毁 bean 会带来很大的性能开销
Spring依赖注入的三种方式
Setter注入:依赖于类的setter方法,灵活且可读性高。
构造器注入:依赖于类的构造方法实现,构造方法可以有参也可以无参
接口注入(一般不用):注入的资源并非来自本系统,而是系统外部,就能用接口注入,一般很少使用
SpringAOP的通知类型
前置通知:在目标对象方法执行前执行
后置通知(最终通知):在目标对象方法执行完成之后,无论执行过程中是否出现异常,都会执行;
异常通知:目标对象方法执行过程中出现异常时执行。
返回通知:目标对象方法执行过程中不产生异常时执行。
环绕通知:特殊的通知,不以目标对象方法为基准,可以同时实现前置通知和后置通知
简述下springmvc的工作流程

简化版:
在这里插入图片描述

BeanFactory和ApplicationContext的区别
beanFactory:是spring里面最底层的接口,包含各种bean的定义,读取bean配置文件,管理bean的加载,实例化,控制bean的生命周期,维护bean之间的依赖关系。
applicationContext是继承了beanFactory,除了提供BeanFactory'的功能之外,还提供了更完善的框架功能:①继承MessageSource,因此支持国际化。
②统一的资源文件访问方式。
③提供在监听器中注册bean的事件。
④同时加载多个配置文件。
⑤载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
beanFactory采用的是延迟加载的形式来注入Bean,即只有在使用到某个bean时,才对该bean进行加载实例化,这样就会出现一些问题,比如bean的某一个属性没有注入,在beanFactory加载后,知道第一次调用这个bean时才会报出异常。
beanFactory通常以编程的方式被创建,ApplicathionContext还能以声明式的方式创 建
BeanFactory和ApplicationContext都支持BeanPostProcessor、 BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。
Spring的bean是线程安全的嘛?

原型Bean 
对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。
单例Bean 
对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。
如果单例Bean,是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。
对于有状态的bean,Spring官方提供的bean,一般提供了通过ThreadLocal去解决线程安全的方法,比如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等。
Mybatis中#{} 和${} 的区别是什么
#{}是预编译处理,${}是字符替换。
 在使用 #{}时,MyBatis 会将 SQL 中的 #{}替换成“?”,
 配合 PreparedStatement 的 set 方法赋值,
 这样可以有效的防止 SQL 注入,保证程序的运行安全。
解释spring Bean的自动配置
五种自动装配
no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配。 
byName:通过参数名 自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设 置成 byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。
byType:通过参数类型自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被 设置成 byType,之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。如果有多 个 bean 符合条件,则抛出错误。 
constructor:这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数 的构造器参数类型,将会抛出异常。 
autodetect:首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方式
SpringMVC和Sprinboot的区别以及优势
配置简单
独立运行
自动装配
无代码生成和 xml 配置
提供应用监控
易上手
提升开发效率
Springboot如何定义多套不同的环境配置
基于Spring Boot的Profiles来实现。
有两种: 一、提供多个配置文件 ,dev ,test, pro等
二、yml文件多文档:再yml中用--分割
profile激活三种方式:
·配置文件: 再配置文件中配置:spring.profiles.active=dev
·虚拟机参数:在VM options 指定:-Dspring.profiles.active=dev
·命令行参数:java –jar xxx.jar --spring.profiles.active=dev
一般放入git或者nacos里面统一管理
Mybatis动态sql是做什么的?都用哪些动态sql?能描述一下动态sql的执行原理不Sql来当做条件,where,and
mybatis动态sql可以让我们再xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态sql拼接的功能
由九重标签,trim|where|set|foreach|if|choose|when|otherwise|bind
执行原理是使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能
阐述一下mybtais的缓存机制
一级缓存:
一级缓存的作用范围是一次会话,只要会话没有关闭,
那么一级缓存就生效,一次会话(一次SqlSession)共享一个一级缓存空间。
第一次查询数据:第一次查询数据的时候,缓存空间中还没有值,
所以需要去数据库中查找,将查找到的值放置到缓存空间中,
供第二次方位直接拿数据。如果中间任何位置提交了事务(commit),
那么mybatis将清空缓存空间。避免脏读。
第二次查询相同的数据:会先检查缓存空间中是否有值,
如果有值将不再请求数据库查询,而是直接拿到缓存空间中的数据。
二级缓存:
在一个Mapper层面的多个会话,都执行同样的查询语句和结果的时候,
第一次需要从数据库中读取,将读取的数据存放的二级缓存区域中,
当第二次去查询相同的语句的时候,那么直接拿到缓存空间的值,
不再次向数据库发送请求。一旦发生了commit事务的提交,
则会清空二级缓存的值。
你怎么理解session?Session与cookie有什么区别?
session 的工作原理是客户端登录完成之后,服务器会创建对应的 session,session 创建完之后,会把 session 的 id 发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时,都会带着 sessionid,服务器拿到 sessionid 之后,在内存找到与之对应的 session 这样就可以正常工作了。
存储位置不同:session 存储在服务器端;cookie 存储在浏览器端。
安全性不同:cookie 安全性一般,在浏览器存储,可以被伪造和修改。
容量和个数限制:cookie 有容量限制,每个站点下的 cookie 也有个数限制。
存储的多样性:session 可以存储在 Redis 中、数据库中、应用程序中;而 cookie 只能存储在浏览器中。
88.说一下你熟悉的设计模式?
Spring框架中的单例模式
Spring框架中默认将bean设置为单例的,可以极大地提高系统的性能

Spring框架中的工厂方法模式
所谓工厂方法模式,简单的来说,就是自己不再主动创建对象,而是让工厂来帮我们创建对象。
改:Java中一般认为有23 种设计模式, 总体来说设计模式分为三大类:
创建型模式,共五种:
工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:
适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:
策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录 模式、状态模式、访问者模式、中介者模式、解释器模式。
单例模式:饿汉式1.直接创建对象2.私有化构造函数3.返回对象实例、懒汉式1.声明变量2.私有构造函数3.提供对外方法
解释一下什么是 aop?
在业务系统中,总有一些不得不处理的事情,我们
将这些重复性的代码抽取出来,放在专门的类中,
在通过spring的AOP的核心对代码段进行增强处理。
在不改变原代码的基础上进行功能增强。有五种
增强方式,前置增强,后置增强,环绕增强,引介增强。异常增强。
解释一下什么是 ioc?
控制反转是一种通过描述(XML或注解)
并通过第三方去产生或获取特定对象的方式。
使用控制反转带来的最大好处就是降低对象之间的耦合。

什么是 spring cloud?

Spring Cloud 致力于为典型用例提供良好的开箱即用体验,以及为其他用例提供可扩展性机制。
以下功能列表:
Distributed/versioned configuration
分布式/版本化配置    alibaba-nacos
Service registration and discovery
服务注册和发现   alibaba-nacos /  netflix-eureka
Routing
路由选择    netfilx-zuul /spring-cloud-gateway
Service-to-service calls
服务对服务调用  openfeign(netflix)
Load balancing
负载平衡  netflix-ribbon
Circuit Breakers
断路器  netflix-hyxtrix /  resilence4j  / alibaba-sentinel
Global locks
全局锁  redis
Leadership election and cluster state
领导层选举和集群状态
Distributed messaging
分布式消息传递    spring-cloud-bus/stream(rabbitmq)

什么是 ORM 框架?
ORM框架就是连接数据库的桥梁,比较官方的说法叫“对象关系映射”。单单这六个字并不能很好地理解ORM框架。ORM 英文全称为Object Relational Mapping,翻译过来就是对象关系映射。ORM的核心到底是什么呢?万变不离其宗,各种ORM框架的核心说白了都一样,就是将数据库类型转换成面向对象编程语言的类型,可以理解为“翻译”。
通过这张图就能很好地理解ORM的核心思想,Mysql的username字段为varchar类型,但是在JAVA中变量username的类型为String,所以需要通过ORM框架,将varchar类型转换为String类型

总结:框架

下篇总结:原生的JDBC
  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小小刘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值