面试题-框架类

1、为什么要用spring?

    轻量级的IOC和AOP框架,主要针对javaBean的生命周期进行管理的轻量级容器;使用IOC更加容易组合对象之间的直接关系,面向接口编程,降低耦合;使用AOP更加容易进行程序扩展;创建对象默认是单例的,不需要在使用单例模式进行处理

2、springboot是干什么的?

    微框架,用来实现微服务;基于Spring4,简化监控,简化部署,简化配置,简化编码。
    Spring Boot:Build Anything, Build任何东西
    SpringCloud:Coordinate Anything,协调任何事情
    SpringCloud Data Flow:Connect everything,连接任何东西

4、Spring装配Bean的过程(生命周期)?

    1). 实例化;

    2). 设置属性值;

    3). 如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name;

    4). 如果实现BeanFactoryAware接口,调用setBeanFactory 设置BeanFactory;

    5). 如果实现ApplicationContextAware,调用setApplicationContext设置ApplicationContext

    6). 调用BeanPostProcessor的预先初始化方法;

    7). 调用InitializingBean的afterPropertiesSet()方法;

    8). 调用定制init-method方法;

    9). 调用BeanPostProcessor的后初始化方法;

5、Spring容器关闭过程

    1). 调用DisposableBean的destroy();

    2). 调用定制的destroy-method方法;

6、@Order注解作用?

    设置bean加载的顺序(值越小越先执行)

7、@Bean注解的作用?

    方法级别的注解,放在方法上产生一个bean,id就是方法名

8、什么是ORM?
    对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术;简单的说,ORM是通过使用描述对象和数据库之间映射的元数据(在Java中可以用XML或者是注解),将程序中的对象自动持久化到关系数据库中或者将关系数据库表中的行转换成Java对象,其本质上就是将数据从一种形式转换到另外一种形式。

9、持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些?
    所谓"持久"就是将数据保存到可掉电式存储设备中以便今后使用,简单的说,就是将内存中的数据保存到关系型数据库、文件系统、消息队列等提供持久化支持的设备中。持久层就是系统中专注于实现数据持久化的相对独立的层面。

持久层设计的目标包括:
- 数据存储逻辑的分离,提供抽象化的数据访问接口。
- 数据访问底层实现的分离,可以在不修改代码的情况下切换底层实现。
- 资源管理和调度的分离,在数据访问层实现统一的资源调度(如缓存机制)。
- 数据抽象,提供更面向对象的数据操作。

持久层框架有:
- Hibernate
- MyBatis
- TopLink
- Guzz
- jOOQ
- Spring Data
- ActiveJDBC

10、Hibernate中SessionFactory是线程安全的吗?Session是线程安全的吗(两个线程能够共享同一个Session吗)?
    SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被多个线程并发访问。SessionFactory一般只会在启动的时候构建。对于应用程序,最好将SessionFactory通过单例模式进行封装以便于访问。
Session是一个轻量级非线程安全的对象(线程间不能共享session),它表示与数据库进行交互的一个工作单元。Session是由SessionFactory创建的,在任务完成之后它会被关闭。Session是持久层服务对外提供的主要接口。Session会延迟获取数据库连接(也就是在需要的时候才会获取)。为了避免创建太多的session,可以使用ThreadLocal将session和当前线程绑定在一起,这样可以让同一个线程获得的总是同一个session。Hibernate 3中SessionFactory的getCurrentSession()方法就可以做到。

11、Hibernate如何实现分页查询?
    通过Hibernate实现分页查询,开发人员只需要提供HQL语句(调用Session的createQuery()方法)或查询条件(调用Session的createCriteria()方法)、设置查询起始行数(调用Query或Criteria接口的setFirstResult()方法)和最大查询行数(调用Query或Criteria接口的setMaxResults()方法),并调用Query或Criteria接口的list()方法,Hibernate会自动生成分页查询的SQL语句。

12、MyBatis中使用#和$书写占位符有什么区别?
       #将传入的数据都当成一个字符串,会对传入的数据自动加上引号;
       $将传入的数据直接显示生成在SQL中。
注意:使用$占位符可能会导致SQL注射攻击,能用#的地方就不要使用$,写order by子句的时候应该用$而不是#。

13、解释一下MyBatis中命名空间(namespace)的作用。
    在大型项目中,可能存在大量的SQL语句,这时候为每个SQL语句起一个唯一的标识(ID)就变得并不容易了。为了解决这个问题,在MyBatis中,可以为每个映射文件起一个唯一的命名空间,这样定义在这个映射文件中的每个SQL语句就成了定义在这个命名空间中的一个ID。只要我们能够保证每个命名空间中这个ID是唯一的,即使在不同映射文件中的语句ID相同,也不会再产生冲突了。

14、MyBatis中的动态SQL是什么意思?
    对于一些复杂的查询,我们可能会指定多个查询条件,但是这些条件可能存在也可能不存在,此时就需要根据用户指定的条件动态生成SQL语句。如果不使用持久层框架我们可能需要自己拼装SQL语句,还好MyBatis提供了动态SQL的功能来解决这个问题。MyBatis中用于实现动态SQL的元素主要有:
- if
- choose / when / otherwise
- trim
- where
- set
- foreach

15、什么是IoC和DI?DI是如何实现的?
    IoC叫控制反转,是Inversion of Control的缩写,DI(Dependency Injection)叫依赖注入,是对IoC更简单的诠释。
控制反转是把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的"控制反转"就是对组件对象控制权的转移,从程序代码本身转移到了外部容器,由容器来创建对象并管理对象之间的依赖关系。
DI是对IoC更准确的描述,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。

16、Spring中Bean的作用域有哪些?
    singleton和prototype,前者表示Bean以单例的方式存在;后者表示每次从容器中调用Bean时,都会返回一个新的实例,prototype通常翻译为原型。
    Spring 2.x中针对WebApplicationContext新增了3个作用域,分别是:request(每次HTTP请求都会创建一个新的Bean)、session(同一个HttpSession共享同一个Bean,不同的HttpSession使用不同的Bean)和globalSession(同一个全局Session共享一个Bean)。

猜你喜欢

转载自blog.csdn.net/m0_37524661/article/details/81662393