Java面经整理(三)框架

1、#{} 和 ${} 的区别,防注入?

#{} 是预编译处理,${}是字符串替换。

  • MyBatis 在处理#{}时,会将 sql 中的#{}替换为?号,sql语句解析会加上"",调用 PreparedStatement 的 set 方法来赋值,使用#{}可以有效的防止 SQL 注入,提高系统安全性。
  • MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值。${} 方式一般用于传入数据库对象,例如传入表名或配置信息。但是一般能用#的就别用$。

PreparedStatement防止SQL注入的本质:把传递进来的参数当作字符

假设其中存在转义字符,比如说 ' 会被直接转义

2、MyBatis 的核心组件?

  • SqlSessionFactoryBuilder(构造器),根据代码或配置生成SqlSessionFactory,采用分布构建的 Builder 模式。
  • SqlSessionFactory(工厂接口),生成SqlSession,采用的是工厂模式。
  • SqlSession(会话),既可以发送SQL去执行并返回结果,也可以获取Mapper的接口。
  • SQL Mapper(映射器),由一个Java接口和一个XML文件(或注解)构成,需要给出对应的SQL和映射规则,负责发送SQL并返回结果。

3、ResultMap 和 ResultType 的区别?

resultType和resultMap功能类似 ,都是返回对象信息,区别在于resultMap要手动配置一下,表和类的对应关系。当实体类和数据库表字段一一对应的时候,resultType会自动建立对应关系;当实体类和数据库表字段不一致的时候,使用resultMap手动建立对应关系。

4、MyBatis的一级缓存和二级缓存

  • 一级缓存:SqlSession 级别的缓存。基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用
  • 二级缓存:Mapper 级别的缓存。与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置

总结:

1)关于一级缓存(sqlsession级别的)

  • 一级缓存是默认开启的
  • 底层其实是基于hashmap的本地内存缓存;
  • 作用域是session(其实就相当于一个方法);
  • 当session关闭或者刷新的时候缓存清空;
  • 不通sqlsession之间缓存互不影响;

2)关于二级缓存(同一个namespace下的mapper,sqlsessionFactory级别的)

  • 首先mybatis默认是没有开启二级缓存的,
  • 二级缓存需要我们手动开启,它是mapper级别的缓存;
  • 同一个namespace下的所有操作语句,都影响着同一个Cache,即二级缓存被多个SqlSession共享,是一个全局的变量。

5、动态sql

Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,Mybatis提供了9种动态sql标签trim|where|set|foreach|if|choose|when|otherwise|bind。

其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

6、介绍以下Spring

优点:

  • Spring是一个开源的免费的框架(容器)!
  • Spring是一个轻量级的、非入侵式的框架
  • 控制反转(IOC),面向切面编程(AOP)
  • 支持事务的处理,对框架整合的支持!

弊端:

发展了太久之后,违背了原来的理念!配置十分繁琐,人称:“配置地狱!”

7、Spring核心原理

IOC

控制反转IOC(Inversion of Control)是一种设计思想,DI(依赖注入)是实现IOC的一种方法

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入(Dependency Injection, DI)

DI依赖注入

  1. 构造器注入

  2. set方式注入

  3. 自动注入 ByName ByType

  4. 注解自动注入 @Autowired

    使用Autowired我们可以不用编写set方法了,前提是你这个自动装配的属性在IOC(Spring)容器中存在,且符合名字

@Resource注解和@Autowired的区别

  • 都是用来自动装配的,都可以放在属性字段上
  • @Autowired默认通过byType方式,如果有多个类型相同的,再通过byName的方式实现
  • @Resource默认通过byName的方式,如果找不到名字,则通过byType实现,两个都找不到就报错!

AOP

面向切面编程

OOP面向对象,允许开发者定义纵向的关系,但并适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用。

AOP,面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。

AOP实现的关键在于代理模式,AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ;动态代理则以Spring AOP为代表。

  • AspectJ是静态代理的增强,所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强,他会在编译阶段将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。
  • pring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法

配置声明式事务

8、Spring常用注解

  • @Component
    • @Controller
    • @Service
    • @Repository
  • @RestController (@ResponseBody+@Controller)
  • @Autowired
  • @RequestMapping
    • GetMapping
    • PostMapping
    • PutMapping
    • DeleteMapping
  • @PathVariable
  • @RequestBody
  • @Override
  • @Bean
  • @Configuration
  • @ComponentScan
  • @Value

9、介绍一下SpringBoot

Spring Boot 基于 Spring 开发,Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。Spring Boot 以约定大于配置的核心思想,默认帮我们进行了很多设置,多数 Spring Boot 应用只需要很少的 Spring 配置。同时它集成了大量常用的第三方库配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用。

10、SpringBoot自动装配原理

Spring Boot 项目的启动注解是:@SpringBootApplication,其实它就是由下面三个注解组成的:

  • @Configuration
  • @ComponentScan
  • @EnableAutoConfiguration

其中 @EnableAutoConfiguration 是实现自动配置的入口,该注解又通过 @Import 注解导入了AutoConfigurationImportSelector,在该类中加载 META-INF/spring.factories 的配置信息。然后筛选出以 EnableAutoConfiguration 为 key 的数据,加载到 IOC 容器中,实现自动配置功能。

yaml加载指定的配置文件

@PropertySource :加载指定的配置文件

@configurationProperties:默认从全局配置文件中获取值

posted @ 2021-05-27 21:42  Barrymeng  阅读(90)  评论(0)    收藏  举报