Java重点技术点面试汇总

Spring重点技术点面试汇总

  • 谈谈你对spring ioc的理解
  • Spring如何解决循环依赖的问题
  • Spring导入bean有多少种方式
  • 什么叫做bean定义(BeanDefinition),和单例bean对象有什么区别
  • mysql中创建视图
  • linux中查看CPU,内存,磁盘,网络的指令
  • sql左连接
  • mysql常用函数和存储过程
  • Spring Boot有哪些核心注解
  • Spring Boot自动装配原理
  • Spring Boot配置文件的加载顺序
  • Spring Boot的全局异常处理
  • Spring的定时任务是怎么实现的
  • Spring bean的作用域
  • Spring中的BeanFactory和ApplicationContext是什么关系?
  • BeanFactory和FactoryBean
  • Spring Bean的生命周期

谈谈你对spring ioc的理解

spring ioc就是控制反转的意思(Inversion of Control)
控制反转:创建和管理 bean对象的能力由Spring容器来做,不再由程序开发人员手动创建。
Spring通过依赖注入来管理对象。
控制反转的优点
1>对象的创建和维护由Spring容器来做,尤其是当对象之间的依赖关系比较复杂的时候,解少了程序员的工作量,也减少了出错的可能性。
2>解耦 由容器去维护具体的对象,对象的创建和业务逻辑分离,让项目代码逻辑更加清晰,更利于维护。

Spring如何解决循环依赖的问题

什么是循环依赖:一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用
Java重点技术点面试汇总_第1张图片
spring自身可以解决单例的setter注入的循环依赖,主要依靠Spring的三级缓存来解决的。
singletonObjects 一级缓存,用于保存实例化、注入、初始化完成的bean实例
earlySingletonObjects 二级缓存,用于保存实例化完成的bean实例singletonFactories 三级缓存,用于保存bean创建工厂,以便于后面扩展有机会创建代理对象
spring二级缓存理论上来说可以解决循环依赖问题。使用三级缓存可以保证代理对象的循环依赖

protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
    Assert.notNull(singletonFactory, "Singleton factory must not be null");
    synchronized (this.singletonObjects) {
        if (!this.singletonObjects.containsKey(beanName)) {
            this.singletonFactories.put(beanName, singletonFactory);
            this.earlySingletonObjects.remove(beanName);
            this.registeredSingletons.add(beanName);
        }
    }
}

这段代码发生在createBeanInstance之后,也就是说单例对象此时已经被创建出来(调用了构造器)。这个对象已经被生产出来了,虽然还不完美(还没有进行初始化的第二步和第三步),但是已经能被人认出来了(根据对象引用能定位到堆中的对象),所以Spring此时将这个对象提前曝光出来让大家认识
为啥Spring不能解决构造器的循环依赖。因为加入singletonFactories三级缓存的前提是执行了构造器,所以构造器的循环依赖没法解决

Spring导入bean有多少种方式

  • xml
<bean></bean>
  • @Bean
  • @Import
  • @ComponentScan + @Component/@Service/@Controller/@Repository

什么叫做bean定义(BeanDefinition),和单例bean对象有什么区别

bean定义-》beanFactoryPostProcessor-》getbean-》BeanPostProcessor
来进行修改-》bean的单例对象
受精卵-》基因工程-》刚刚出生(人)-》整容变性-》18岁

mysql中创建视图

视图的作用:
1.简化复杂的查询
2.可以进行权限控制,某些列不允许用户查询,可以通过视图开放其中可以查询的列,起到权限控制的作用。
语法:CREATE VIEW 视图名称 AS +正常的sql查询语句。
Java重点技术点面试汇总_第2张图片

例子见图:https://blog.csdn.net/yiibai/article/details/80125768

linux中查看CPU,内存,磁盘,网络的指令

一.查看cpu方面
top 命令查看系统的实时负载, 包括进程、CPU负载、内存使用等等
uptime,系统性能命令的精简版
二.查看内存方面
free -h
free命令默认是显示单位kb,可以采用free -m和free -g命令查看,分别表示MB和GB
在这里插入图片描述

三.查看磁盘相关
在这里插入图片描述
磁盘剩多少写的快不快可以用df、dd、iotop
du命令用来查看目录或文件所占用磁盘空间的大小。常用选项组合为:du -sh
du常用的选项:
  -h:以人类可读的方式显示
  -a:显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小
  -s:显示目录占用的磁盘空间大小,不要显示其下子目录和文件占用的磁盘空间大小
  -c:显示几个目录或文件占用的磁盘空间大小,还要统计它们的总和
  --apparent-size:显示目录或文件自身的大小
  -l :统计硬链接占用磁盘空间的大小
  -L:统计符号链接所指向的文件占用的磁盘空间大小  
du -sh : 查看当前目录总共占的容量。而不单独列出各子项占用的容量

du -lh --max-depth=1 : 查看当前目录下一级子文件和子目录占用的磁盘容量。

du -sh * | sort -n 统计当前文件夹(目录)大小,并按文件大小排序
du -sk filename 查看指定文件大小
四.网络相关
ifstat
推荐博客:https://www.cnblogs.com/lzghyh/p/13035675.html

sql左连接

以左表为基准联合查询右表,如果右表中未查询出有匹配的数据,查询结果只展示一条数据,未查出字段展示为null。如果右表中查询出有匹配的数据,匹配出几条数据,查询结果便是几条。
Java重点技术点面试汇总_第3张图片

mysql常用函数和存储过程

聚集函数
avg
count
max
min
sum
用于处理字符串的函数
合并字符串函数:concat(str1,str2,str3…)
比较字符串大小函数:strcmp(str1,str2)
获取字符串字节数函数:length(str)
获取字符串字符数函数:char_length(str)
字母大小写转换函数:大写:upper(x),ucase(x);小写lower(x),lcase(x)
字符串查找函数
获取指定位置的子串
字符串去空函数
字符串替换函数:
用于处理数值的函数
绝对值函数:abs(x)
向上取整函数:ceil(x)
向下取整函数:floor(x)
取模函数:mod(x,y)
随机数函数:rand()
四舍五入函数:round(x,y)
数值截取函数:truncate(x,y)
用于处理时间日期的函数
获取当前日期:curdate(),current_date()
获取当前时间:curtime(),current_time()
获取当前日期时间:now()
从日期中选择出月份数:month(date),monthname(date)
从日期中选择出周数:week(date)
从日期中选择出周数:year(date)
从时间中选择出小时数:hour(time)
从时间中选择出分钟数:minute(time)
从时间中选择出今天是周几:weekday(date),dayname(date)
推荐博客:https://www.cnblogs.com/progor/p/8832663.html

Spring Boot有哪些核心注解

@SpringBootApplication
在这里插入图片描述

@EnableAutoConfiguration
@SpringBootConfiguration
@ComponentScan
在这里插入图片描述

@AutoConfigurationPackage
@Import

Spring Boot自动装配原理

Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。

Spring Boot配置文件的加载顺序

Spring Boot启动会扫描以下位置的application.properties或者application.yml文件作为Spring Boot的默认配置文件

来自java:comp/env的JNDI属性
java系统属性(System.getProperties())
操作系统环境变量
RandomValuePropertySource配置的random.*属性值
jar包外部的application-{profile}.properties或者application.yml(带spring.profile)配置文件
jar包内部的application-{profile}.properties或者application.yml(带spring.profile)配置文件
jar包外部的application.properties或者application.yml(不带spring.profile)配置文件
jar包内部的application.properties或者application.yml(不带spring.profile)配置文件
@Configuration注解类上的@PropertySource
通过SpringApplication.setDefaultProperties指定的默认属性

Spring Boot的全局异常处理

定义全局异常处理类。
通过 @ControllerAdvice 指定该类为 Controller 增强类。
通过 @ExceptionHandler 自定捕获的异常类型。
通过 @ResponseBody 返回 json 到前端。

Spring的定时任务是怎么实现的

@EnableScheduling引入Schedule的相关配置
@Scheduled(cron = “xxx”)在需要定时执行的方法上添加注解

Spring bean的作用域

  • singleton 在 Spring 容器中仅存在一个 Bean 实例, Bean 以单例的形式存在。
  • prototype 每次从容器中调用 Bean 时,都会返回一个新的实例,即相当于执行 new XxxBean() 的实例化操作。
  • request 每次 http 请求都会创建一个新的 Bean , 仅用于 WebApplicationContext 环境。
  • session 同一个 http Session 共享一个 Bean ,不同的 http Session 使用不同的 Bean,仅用于 WebApplicationContext 环境。
  • globalSession 同一个全局 Session 共享一个 bean, 用于 Porlet, 仅用于 WebApplication 环境。

Spring中的BeanFactory和ApplicationContext是什么关系?

  • BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean
  • ApplicationContext继承了BeanFactory,BeanFactory是Spring中比较原始的Factory,它不支持AOP、Web等Spring插件,而ApplicationContext不仅包含了BeanFactory的所有功能,还支持Spring的各种插件

BeanFactory和FactoryBean

BeanFactory负责生产和管理Bean的一个工厂接口提供一个Spring Ioc容器规范

FactoryBean可以说为IOC容器中Bean的实现提供了更加灵活的方式,FactoryBean在IOC容器的基础上给Bean的实现加上了一个简单工厂模式和装饰模式,我们可以在getObject()方法中灵活配置。
FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String BeanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类中的getObject()方法返回的对象。要想获取FactoryBean的实现类,就要getBean(&BeanName),在BeanName之前加上&

Spring Bean的生命周期

实例化->属性赋值->初始化->销毁
销毁在容器关闭时调用

你可能感兴趣的:(面试题,spring,面试,java)