Java开发框架和中间件面试题(7)

63.Spring中都应用了哪些设计模式?

1.简单工厂模式:简单工厂模式的本质就是一个工厂类根据传入的参数,动态的决定实例化哪个类。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象。

2.工厂方法模式:应用程序将对象的创建以及初始化职责交给工厂对象,工厂Bean。定义工厂方法,然后通过config.xml配置文件,将其纳入Spring容器来管理,需要通过factory menthod指定静态方法名称。

3.单例模式:Spring用的是双重判断加锁的单例模式。

4.代理模式:Spring的AOP中,使用的Advice(通知)来增强被代理类的功能。Spring实现AOP功能的原理就是代理模式(①JDK动态代理,②CGlib字节码生成技术代理。)对类进行方法级别的切面增强。

5.装饰器模式:动态的给一个对象添加一些额外的功能。Spring的ApplicationContext中配置所有的DataSource。这些DataSource可能是不同的数据库,然后SessionFactory根据用户的每次请求,将DataSource设置成不同的数据源,以达到切换数据源的目的。在Spring中有两种表现:

一种是类名中含有Wrapper

另一种是类名中含有Decorator

6.观察者模式:定义对象间的一对多的关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并自动更新。Spring中观察者模式一般用在listener的实现。

7.策略模式:策略模式是行为性模式,调用不同的方法,适应行为的变化,强调父类的调用子类的特性。getHandler是HandlerMapping接口中唯一方法,用于根据请求找到匹配的处理器。

8.模板方法模式:Spring JdbcTemplate的query方法总体结构是一个模板方法和回调函数,query方法中调用的execute()时一个模板方法,而预期的回调doInStatement(Statement state)方法也是一个模板方法。

64.请举例说明如何在Spring中注入一个Java Collection?

1.Spring注入有四种方式:

set注入,构造器注入,基于注解的注入,xml配置文件注入

2.可以注入的Java collection集合类如下:

list,set,map,props:该标签支持注入键和值都是字符串类型的键值对。

list和set都使用value标签;map使用entry标签;props使用prop标签。

65.说一下都有哪些基本理念?

1.横切关注点

对哪些方法进行拦截,拦截后怎么处理,这些关注点称为横切关注点;

2.Aspect(切面)通常是一个类,里面可以定义切入点和通知。

3.JointPoint(连接点)程序执行过程中明确的点,一般是方法的调用,被拦截到的点。因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。

4.Advice(通知)AOP在特定的切入点上执行的增强处理,有before(前置),after(后置),afterReturning(最终),afterThrowing(异常),around(环绕)。

5.Pointcut(切入点)带有通知的连接点,在程序中主要体现在书写切入点表达式。

6.weave(织入)将切面应用到目标对象并导致代理对象创建的过程。

7.introduction(引入)在不修改代码的前提下,引入可以在运行期为类动态地增加一些方法或者字段。

8.AOP代理(AOP proxy)AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以是JDK动态代理,也可以是CGlib代理,前者基于接口,后者基于子类。

9.目标对象(Target Object)包含连接点的对象,也被称作被通知或者被代理对象,POJO。

66.说一下AOP的使用场景?

1.Authentication权限

2.Caching缓存

3.Context passing内容传递

4.Error handling 错误处理

5.Lazy loading懒加载

6.Debugging调试

7.logging,tracing,profiling and monitor记录跟踪,优化,校准

8.Performance optimization性能优化

9.Persistence持久化

10.Resource pooling资源池

11.Synchronization同步

12.Transaction事务

67.Spring Bean的生命周期?

Spring bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。

Spring Bean Factory负责管理在Spring容器中被创建的Bean的生命周期。

bean的生命周期由两组回调(call back)方法组成,初始化之后调用的回调方法。

销毁之前调用的回调方法。

Spring框架提供了以下四种方式来管理bean的生命周期事件。

initializingBean和DisposableBean回调接口

针对特殊行为的其他Aware接口

Bean配置文件中的Custom init()方法和destroy()方法

@PostConstruct和@PreDestroy注解方式

68.说说Spring AOP的实现原理?

Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGlib动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。

如果目标类没有实现接口,那么Spring AOP会选择使用CGlib来动态代理目标类。CGlib(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGlib是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么他是无法使用CGlib做动态代理的。

69.Spring中事务的实现方式?

1.编码方式

所谓编程式事务指的是通过编程方式实现事务,即类似于JDBC编程实现事务管理。

2.声明式事务管理方式

声明式管理又有两种实现方式:基于XML配置文件的方式;另一个是在业务方法上进行@Transaction注解,将事务规则应用到业务逻辑中。

70.说说Spring事务的底层原理?

1.划分处理单元

IOC由于Spring解决的问题是对单个数据库进行局部事务处理单元。并且将对事务的各种配置放到了IOC容器中(设置事务处理管理器,设置事务的传播特性以及隔离机制)。

2.AOP拦截需要进行事务处理的类Spring事务处理模块是通过AOP功能来实现声明式事务处理的,具体操作(比如事务实行的配置和读取,实物对象的抽象),用TransactionProxyFactoryBean接口来使用AOP功能,生成proxy代理对象,通过TransactionInterceptor完成对代理方法的拦截,将事务处理的功能编织到拦截的方法中。读取IOC容器事务配置属性,转化为Spring事务处理需要的内部数据结构(TransactionAttributeSourceAdvisor),转化为TransactionAttribute表示的数据对象。

3.对事物处理的实现)事务的生成,提交,回滚,挂起)Spring委托给具体的事务处理器实现。实现了一个抽象和适配。适配的具体事务处理器:DataSource数据源支持,hibernate数据源事务处理支持,JDO数据源事务处理支持,JPA,JTA数据源事务处理支持。这些支持都是通过设计PlatformTransactionManager,AbtractPlatforTransaction一系列事务处理的支持。为常用数据源支持提供了一系列的TransactionManager。

4.结合PlatformTransactionManager实现了TransactionInterception接口,让其与TransactionProxyFactoryBean结合起来,形成一个Spring声明式事务处理的设计体系。

71.Spring依赖注入有哪几种方式?

1.构造器注入

2.setter方法注入

3.静态工厂注入

4.实例工厂注入

72.如何防止表单重复提交?

1.通过JavaScript屏蔽提交按钮(不推荐)

2.给数据库添加唯一键约束

3.利用Session防止表单重复提交(推荐)

4.使用AOP自定义切入实现

73.说一下Spring MVC的运行流程?

1.SpringMVC将所有的请求都提交给DispatcherServlet,他会委托应用系统的其他模块负责对请求进行真正的处理工作。

2.DispatcherServlet查询到一个或者多个HandlerMapping,找到处理请求的Controller。

3.DispatcherServlet请求提交到目标Controller;

4.Controller进行业务逻辑处理后,会返回一个ModelAndView;

5.Dispathcher查询一个或者多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象。

6.视图对象负责渲染返回给客户端。

74.SpringMVC启动流程?

1.web.xml文件中给Spring MVC的servlet配置了load on startup,所以程序启动的时候会初始化SpringMVC;

2.然后在HttpServletBean中配置的contextConfigLocation属性设置到Servlet中;

3.接着在FrameworkServlet中创建了WebApplicationContext;

4.DispatcherServlet根据contextConfigLocation配置的classpath下的xml文件初始化SpringMVC中的各组件。

75.什么是ORM框架?

ORM(object relation mapping),对象关系映射。是为了解决面向对象与关系型数据库存在的不匹配问题。

ORM框架的优点:

1.开发效率跟高

2.数据访问更抽象,轻便

3.支持面向对象封装

76.mybatis中的#和${}的区别是什么?

1.#{}带引号,${}不带引号;

2.#{}可以防止SQL注入;

3.${}常用于数据库表名,order by子句;

一般能用#{}就不要使用${}

77.Mybatis是否支持延迟加载?延迟加载的原理是什么?

mybatis是否支持延迟加载?延迟加载其实就是讲数据加载时机推迟,比如推迟嵌套查询的时机。延迟加载可以实现先查询主表,按需实时做关联查询,返回关联表结果集,一定程度上提高了效率。mybatis仅支持关联对象association和关联集合对象collection的延迟加载,associatation是一对一,collection是一对多查询,在mybatis配置文件中可以配置lazyloadingEnable=true/false。

延迟加载的原理是什么?使用CGlib为目标对象建立代理对象,当调用目标对象的方法时进入拦截器方法。

比如调用a.getB().getName()拦截器方法invoke()发现a.getB()为null,会单独发送事先准备好的查询关联B对象的SQL语句,把B查询出来然后调用a.setB(b),也是a的对象的属性b就有值了,然后调用getName(),这就是延迟加载的原理。

78.说一下mybatis的一级缓存和二级缓存?

一级缓存是session级别的缓存,默认开启,当查询一次数据库时,对查询结果进行缓存,如果之后的查询在一级缓存中存在,则无需再访问数据库。

二级缓存是sessionFactory级别的缓存,需要配置才会开启。当进行SQL语句查询时,先查看一级缓存,如果不存在,访问二级缓存,降低数据库访问压力。

79.mybatis有哪些执行器(Executor)?

1.mybatis有三种基本的Excutor执行器:

1.1SimpleExecutor,每执行一次update或者select,就开启一个Statement对象,用完立刻关闭Statement。

1.2PauseEcecutor,执行update或者select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而且放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。

1.3BatchExecutor,执行update,将所有SQL通过addBatch()都添加到批处理中,等待统一执行executeBatch().他缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一executeBatch()批处理。与JDBC批处理相同。

2.作用范围Executor的这些特点,都严格限制在SqlSession生命周期范围内。

3.Mybatis中如何指定使用哪一种Excutor执行器?在mybatis的配置文件中,可以指定默认的ExcutorType执行器类型,也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数。

80.Mybatis和hibernate的区别有哪些?

1.两者最大的区别

针对简单逻辑,都有对应的代码生成工具,可以生成简单基本的dao层方法;针对高级查询,Mybatis要手动编写SQL语句和resultMap,而hibernate有良好的映射机制;

2.开发难度对比

hibernate>mybatis

3.日志统计

hibernate有自己的日志统计功能,而Mybatis需要借助log4j来记录日志。

4.数据库扩展比较

hibernate>mybatis

5.缓存机制比较,因为hibernate对查询对象有良好的管理机制,用户无需关心sql,所以使用二级缓存如果出现脏数据,系统会报错。而Mybatis,如果不能获取最新数据,应该避免缓存的使用,脏数据的出现会给系统的正常运行带来很大的隐患。

6.如何选择Mybatis需要编写SQL和映射规则,工作量大于hibernate;Mybatis支持的工具也有限,不能像hibernate那样有许多插件可以帮助生成映射代码和关联关系;对于性能要求不太苛刻的系统,比如管理系统,ERP等推荐hibernate;对于性能要求高,响应快,灵活的系统,比如电商系统,推荐使用Mybatis;

81.Mybatis如何根据多个id进行查询?

根据多个id进行查询的示例代码如下所示:

Page getUserListByIds(@Param("ids") List ids);

select * from student where id in #{userid}

相关推荐
爱吃喵的鲤鱼9 分钟前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
LuckyLay14 分钟前
Spring学习笔记_27——@EnableLoadTimeWeaving
java·spring boot·spring
向阳121827 分钟前
Dubbo负载均衡
java·运维·负载均衡·dubbo
newxtc30 分钟前
【客观理性深入讨论国产中间件及数据库-科创基础软件】
数据库·中间件·国产数据库·国产中间件·科创
idealzouhu31 分钟前
【canal 中间件】canal 常见的启动方式
中间件
DARLING Zero two♡35 分钟前
关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧
c语言·开发语言·科技
Gu Gu Study37 分钟前
【用Java学习数据结构系列】泛型上界与通配符上界
java·开发语言
芊寻(嵌入式)1 小时前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
WaaTong1 小时前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
m0_743048441 小时前
初识Java EE和Spring Boot
java·java-ee