java面试0621

1、SpringIOC执行流程
执行的第一件事,就是哟啊加载applicationContext对象,这个ApplicationContext是一个接口,并且是beanfactory的子接口,BeanFactory就是存放与bean相关数据的一个容器,所以说applicationcontext就是初始化beanfactory,与bean相关的操作都是基于applicationcontext来执行的,或者准确来说并不是由applicationContext亲自执行的,它内部还有一个beanfactory属性,这个beanfactory最终会被赋值为一个defaultListableBeanfactory对象,那其实所有的bean操作都是基于这个属性完成的。
在创建好beanfactory后,之后就要会对配置文件进行解析,每一个bean标签都会解析成一个beandefinition对象,然后注册到beanfactory中,注册的方式是基于一个concurrenthashmap,key值为bean标签的名,value就是这个beandefinition对象。
注册完了之后,接下来就是对bean进行实例化,实例化过程分两种情况,如果对应的类使用了动态代理,那么久要实例化它对应的proxy代理类,若没有使用动态代理,则通过反射进行创建。创建好的实例同样是注册在beanfactory中的一个concurrenthashmap中,至此applicationContext的创建就算是完成了。后续调用getBean方法,其实就是从applicationContext的beanfactory属性中的concurrenthashMap进行获取

applicationContext ---> beanfactory---> defaultListablebeanfactory--->创建完成之后,进行解析,-->beandefinition对象--->注册到beanfactory--->实例化--->动态代理还是反射生成。

2、Spring事务

事务的特性:acid
原子性:要么全部完成,要么完全不完成
一致性:一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态。
隔离性:每个事务都应该与其他事务隔离开来,防止数据损坏
持久性:一旦事务完成,无论系统发送什么错误,它的结果不会受到影响。

实现方式:
编程式事务管理对于基于pojo的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法。这就是编程式事务管理。
基于TransactionProxyfactorybean的声明式事务管理
基于@transaction的声明式事务管理
基于aspectj AOP配置事务。


3、SpringMVC执行流程

用户请求(request) --> dispatcherServlet ---> handleMappering --->handlerAdapter --->数据格式转换 ---> handler ---> views-->dispathcerservlet-->用户响应(response)

4、synchronized关键字最主要的三种使用方式的总结
修饰实例方法,作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁
修饰静态方法,作用域当前类对象加锁,进入同步代码前要获得当前类对象的锁。
修改代码块,指定加锁对象,给对定对象加锁,进入同步代码库前要获得给定对象的锁。

5、说说 synchronized 关键字和 volatile 关键字的区别
volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronize关键字要好。但是volatile关键字只能用于变量而synchronize关键字可以修饰方法以及代码块。多线程访问volatile关键字不会发生阻塞,而synchronize关键字可能会发生阻塞。
volatile关键字能保证数据的可见性,但不能保证数据的原子性。synchronized关键字都可以保证
volatile关键字用于解决变量在多个线程之间的可见性,而synchronize关键字解决的是多个线程之间访问资源的同步性。

6、为什么要用线程池?
降低资源消耗
提高响应速度
提高线程的可管理性

7、如何创建线程池?
通过threadPoolexecutor的方式,
1、通过构造方法实现
2、通过executor框架的工具类Executor来实现,我们可以创建三种类型的ThreadPoolExecutor:
FixedThreadPool:该方法返回一个固定线程数量的线程池。
SingleThreadExecutor:该方法返回一个只有一个线程的线程池。
CachedThreadPool:该方法返回一个可根据实际情况调整线程数量的线程池。




8、SpringBoot执行流程

开始

---> 收集各种条件和回调接口,例如,applicationContextIntializer、applicationListener
--->通告started()
---> 创建并准备Environment
--->通告environmentprepared()
--> 创建并初始化applicationContext,例如,设置Environment,加载配置等。
--->通告contextPrepared(),通告contextLoaded()
---> 调用applicationContext的refresh()方法,完成最终程序启动
---> 执行applicationRunner和CommandLineRunner通告finished()

--> 结束


9、redis有哪些优势?
1、首先是性能高,每秒能达到读11万次,写81000次。
2、提供丰富的数据类型String、list、Set、Hashes等
3、Redis所有操作都是原子性的,要么成功要么失败,多个操作也支持事务
4、丰富的特性例如支持订阅发布、key过期等。

10、Redis的性能优势主要来自3个方面:
1、它是基于ANSI C语言编写的,接近于汇编语言的机器语言,运行速度十分快
2、它是基于内存的读写,
3、它只有6种数据类型,数据结构比较简单,规则比较少
主要应用场景:
1、缓存常用的数据
2、需要高速读/写的场合

11、mybatis常用标签?
定义sql语句:select、insert、delete、update
配置java实体类属性与查询结果集中列名对应关系:resultMap
控制动态sql拼接:if、foreach、choose
格式化输出:where、set、trim
配置关联关系:collection、association
定义常量及引用:sql、include


12、数据库调优的方式?
1、创建索引
2、避免在索引上使用计算
3、使用预编译查询
4、调整where字句的连接顺序
5、尽量将多条sql语句压缩到一句sql中
6、用where字句替换having字句
7、使用表的别名

13、spring常用注解
1、声明bean的注解
@Component组件,没有明确的角色
@Service 在业务逻辑层使用(service层)
@Repository在数据访问层使用(dao层)
@Controller在展现层使用,控制器的声明(controller层)
2、注入bean的注解
@Autowired
@Resource
3、java配置类相关注解
@Configuration 声明当前类为配置类,相当于xml形式的Spring配置
@Bean注解在方法上,声明当前方法的返回值为一个bean,替代xml的方式
@ComponentScan 用于对Component进行扫描,相当于xml
@
4、AOP相关注解
@Aspect声明一个切面
@After在方法执行之后执行
@Before在方法执行之前执行
@Around在方法执行之前与之后执行
@PointCut声明切点

5、@Bean的属性支持
@Scope设置Spring的容器如何新建Bean实例
@PostConstruct,在构造函数执行完之后执行,


一、解决数据库中属性名和实体类中字段名不一致问题?
1、直接用sql语句别名进行处理
2、使用结构集映射resultMap
3、用mybatis全局配置文件的方式,打开驼峰命名自动映射的功能,默认是关闭的

二、mybatis中一级缓存和二级缓存
一级缓存
mybatis对缓存提供支持,但是没有配置的情况下,它只开启一级缓存,一级缓存只是相对于同一个sqlsession而言。所以在参数和sql完全一样的情况下,我们使用同一个sqlsession对象调用同一个Mapper方法,往往只执行一次sql,因为使用sqlsession第一次查询后,mybatis会将其放在缓存中,以后查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,sqlsession都会取出当前缓存的数据,而不会再次发送sql到数据库。
二级缓存
mybatis的二级缓存是application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。二级缓存默认是不开启的,开启需要进行配置,mybatis要求返回的实体类是可序列化的。配置方法很简单,只需要映射xml文件配置就可以。

 

posted on 2021-06-21 23:42  小鱼米  阅读(48)  评论(0)    收藏  举报