【Java】一些常问的问题

一些常问的问题

  • cookie和session的区别
  • 为什么有Spring IOC和DI
  • Spring中用到了哪些设计模式
  • SQL优化
  • 为什么两个Integer的对象不能用==来判断
  • Mysql的性能调优
    • 为什么要建索引
  • Spring IOC的工作流程
  • 对Spring MVC的理解
  • Springboot自动装配

cookie和session的区别

(1)浏览器端第一次发送请求到服务器端
(2)服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端
(3)浏览器端再次访问服务器端时会携带服务器端创建的Cookie
(4)服务器端通过Cookie中携带的数据区分不同的用户

【Java】一些常问的问题_第1张图片
【Java】一些常问的问题_第2张图片
session是服务器端的容器对象,本质上是一个ConcurrentHashMap,session ID可以弥补HTTP无状态的不足(不能确定客户端就用session ID来确定)

为什么有Spring IOC和DI

用new创建对象依赖关系非常复杂,耦合度高
【Java】一些常问的问题_第3张图片
IOC实现对象管理(创建对象、查找依赖的对象),把创建的对象交给IOC控制,要用到的时候直接去IOC容器找
【Java】一些常问的问题_第4张图片
DI:如果bean之间存在依赖关系,IOC容器需要自动实现依赖对象的实例注入,三种注入方式:

  • 接口注入
  • setter注入
  • 构造器注入

@Resource和@Autowired分别根据bean的name和bean的类型实现依赖注入

Spring中用到了哪些设计模式

  • 工厂模式 : Spring 使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
  • 代理模式 : Spring AOP 功能的实现。
  • 单例模式 : Spring 中的 Bean 默认都是单例的。
  • 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
  • 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
  • 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
  • 适配器模式 : Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。

SQL优化

  • 加索引,但要选择合适的列,避免like,函数导致索引失效
  • 只返回必要的列
  • 根据查询分析器,避免全表扫描和子查询
  • 分库分表(并发连接数过高
  • 读写分离(针对读多写少的场景)

为什么两个Integer的对象不能用==来判断

引入享元(Flyweight)模式,通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。

Integer内部对-128-127之间的数据做了一层缓存,如果两个Integer对象取值范围都在-128-127之间,返回结果肯定是true
【Java】一些常问的问题_第5张图片

Mysql的性能调优

  • 表结构和索引
    • 分库分表
    • 读写分离
    • 为字段选择合适的数据类型
    • 适当的反范式设计
    • 为查询操作创建必要的索引
  • SQL语句优化
    • 通过慢查询分析需要优化的SQL,利用explain或者profile工具分析SQL执行计划
    • 仅查询需要的列
    • 使用索引列扫描
  • Mysql参数优化
    • buffer_pool大小设置为内存的50%-70%
  • 硬件及系统配置

为什么要建索引

Spring IOC的工作流程

前面先解释IOC是什么,Bean的声明方式@Configuration配置类里面的@bean

解析这些bean然后保存在IOC容器中

  • IOC容器初始化:解析或加载后生成BeanDefinition,将其注册到IOC容器中;解析得到的BeanDefinition实体包含bean的一些定义和对象属性,把BeanDefinition实体存到map集合里面,IOC就是对这些定义信息进行处理和维护
  • Bean的初始化和依赖注入:通过反射对没有设置lazy-init属性的单例bean进行初始化,完成bean依赖注入

对Spring MVC的理解

是属于springFramework的一个模块,在Servlet基础上构建并且使用了MVC模式,简化Servlet+JSP开发方式

  1. 把传统MyC框架里面的Controller控制器做了拆分,分成了前端控制器Dispatcherservlet和后端控制器Controller
  2. 把Mode摸型折分成业务层Service和数据访问层Repository
  3. 在视图层,可以支特不同的视图让如Frggmark、velocity、JSP等等
    【Java】一些常问的问题_第6张图片

Springboot自动装配

SpringBoot 自动装配主要是基于注解编程和约定优于配置的思想来设计的。

【Java】一些常问的问题_第7张图片

实际应用只要在启动类上加@SpringApplication就行,这是个复合注解,包含了

  • @SpringBootConfiguration就是@Configuration注解标识的类中声明了1个或者多个@Bean方法,Spring容器可以使用这些方法来注入Bean
  • @EnableAutoConfiguration(实现自动装配的注解)
  • @ComponentScan

【Java】一些常问的问题_第8张图片

自动装配的实现:
【Java】一些常问的问题_第9张图片

  • 第一步:启动依赖组件的时候,组件中必须要包含@Configuration 的配置类,在这个配置类里面声明为@Bean 注解,就将方法的返回值或者属性值注入到IoC 容器中。
  • 第二步:如果是使用第三方jar 包,Spring Boot 采用SPI 机制,只需要在**/META-INF/目录下增加spring.factories 配置文件**。然后,Spring Boot 会根据约定规则,自动使用SpringFactoriesLoader 来加载配置文件中的内容
  • 第三步:Spring 获取到第三方jar 中的配置以后,会使用调用ImportSelector 接口来完成动态加载。

我们使用Spring 创建Web 程序时需要导入非常多的Maven 依赖,而Spring Boot 只需要一个Maven 依赖来创建Web 程序,并且Spring Boot 还把我们最常用的依赖都放到了一起,我们只需要引入spring-boot-starter-web 这一个依赖就可以完成一个简单的Web 应用。

你可能感兴趣的:(java,java,开发语言)