面試就业题库-05

1. java基础(1)

2. javaweb(1)

3. ssm+springboot+springCloud(1.5)

4. spring框架

4.1 IOC总结

IOC 的全称 inverse of controller , 控制反转, 之前由自己new 对象的方式反转给spring容器.
spring容器其实就是一个ConCurrentHashMap, 如何创建bean对象, 如何装配?
==基于配置文件开发:
spring容器加载和读取文件, 利用反射机制(class.newInstance(),依赖无参构造创建bean),put到map集合中
== 基于注解开发
spring容器开启扫描机制,通过@ComponentScan(“指定扫描的package包”),获取到类的全路径.
常见的注解: @Component (用到普通的javaBean),@Service(用到业务层的bean上) ,@Repository(用 在dao层)
比如: 扫描这个@Repository,就能获取cn.spring.dao.UserDataJpa,
利用Class clz=Class.forName(“cn.spring.dao.UserDataJpa”);
UserDataJpa bean = clz.newInstance(); 把bean装配到map容器中.
在这里插入图片描述

4.2 BeanFactory(懒加载初始bean)和ApplicatonContext(立即初始bean)区别

  • 相同点: 都是spring容器
  • BeanFactory 顶层接口(父容器)
  • ApplicationContext 子接口(子容器)
  • 实现初始bean对象,把bean对象装配到容器中.是以上接口的子类.
  1. 如果是普通的java项目:
    *基于配置文件开发:
    手动创建 ClassPathXmlApplicationContext容器对象,读取配置文件,实现初始bean对象
    *基于注解开发:
    手动创建AnnotationConfigApplicationContext容器对象,扫描注解,实现初始化bean对象
  2. 如果是web项目:
  • 基于配置文件开发:
    在服务器启动时, 由ContextLoadListener监听器,自动创建XmlServletWebServerApplicationContext容器对象,
    读取配置文件,实现bean对象的初始化.
  • 基于注解开发
    在服务器启动时,由监听器负责自动创建AnnotationConfigWebApplicationContext容器对象,扫描注解,实现bean对象的初始化.
    在这里插入图片描述

4.3 spring的DI

  • DI: 依赖注入,在一个类中注入这个类所需的bean对象.
  • 方式一: set方法注入
  • 方式二: 构造方法注入
  • 基于配置文件: 实现DI,如下图
    在这里插入图片描述
  • 基于注解开发,实现DI
  1. @Resource :
    实现在类中注入bean对象,底层根据注入bean的类名(首字母小写,比如: cat---->Cat对象),
    从容器中拿到bean对象,注入到当前类中
  2. @Autowired:
    实现在类中注入bean对象,底层根据bean的类型,从容器中拿到bean对象,注入到当前类中
    Qualifier(“bean的名称”): 如果根据类型找不到, 才会 Qualifier(“bean的名称”)的bean名称找
    在这里插入图片描述

4.4 aop

  • Spring框架AOP: 对业务层的方法进行增强.
  • 应用场景: 事务控制(底层就是aop)
  • 事务:
    1. 读问题,写问题 ,引发开发者在业务层使用事务控制
    2. 事务隔离级别
    3. 事务的传播属性

4.5 通知

  • 通知: 就是增强的业务逻辑
  • 分类
  1. 前置通知,后置通知,返回通知,异常通知,环绕通知
  2. 执行顺序:
    前置通知: 在执行目标方法(切点)前,执行
    后置通知: 在执行目标方法(切点)后,不管执行过程中,是否有异常,都会执行的通知
    返回通知: 在执行目标方法(切点)后,执行,在执行过程中,有异常,返回通知不执行
    异常通知: 在执行目标方法(切点)后,如果有异常,才会执行.
    注意: 返回通知和异常通知不能同时执行
    环绕通知配置在切点上面,如果配置了环绕通知,一般情况下不用前置,后置,返回通知.

5. springmvc框架

5.1 Spring容器和SpringMVC容器的区别以及关系?

  • Spring容器是父容器, 可以初始化任意层(web层,service层,dao层)的bean对象
    @Component,@Controller, @Service, @Repository
  • SpringMVC容器称之为子容器,作用初始化web层的bean对象
    @Controller
  • Spring容器可以初始化@Controller注解下面的bean,
    SpringMVC容器可以初始化@Controller注解下面的bean,就会出现冲突.
    怎么解决这个问题?
    Spring容器扫描时,排除web层的@Controller注解.
    SpringMVC容器扫描时,只扫描web层的@Controller注解.
    在这里插入图片描述
    在这里插入图片描述

5.2 SpringMVC中为什么不会出现post请求的中文乱码问题?

使用了CharacterEncodingFilter过滤器类, 默认处理了post请求的中文乱码问题.
过滤器的作用: 拦截请求和响应.
比如: 浏览器 提交post请求的中文-------->CharacterEncodingFilter过滤器(处理post乱码)-------->后台端

5.3 SpringMVC 核心处理器有那些?

  • 中央处理器: 分发请求,比如: http://域名:port/controller的访问路径
  • 处理映射器: 将中央处理器分发的请求进行解析,根据解析controller的访问路径,访问对应的controller
  • 视图解析器: 将controller返回的数据展示视图页面.需要视图解析器解析视图页面.将数据展示
    视图: Freemarker, Thyemleaf
  • 数据处理器: 比如 springmvc默认使用的JaskSon,将后台的数据转成json数据进行返回

5.4 SpringMVC 执行流程

在这里插入图片描述

5.5 SpringMVC 的拦截器和过滤器什么区别

1).Springmvc中的拦截器interceptor用于对控制器controller进行预处理和后处理的技术;

2).可以定义拦截器链,拦截器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
3).拦截器interceptor与过滤器filter的区别
1.过滤器是servlet中的,任何框架都可以使用过滤器技术;
2.拦截器是Springmvc所独有的
3.过滤器设置/*可以拦截任何资源
4.拦截器只对控制器controller中的方法进行拦截
4).拦截器利用的是AOP思想;
5).自定义拦截器,需要实现HandlerInterceptor接口

6. Mybatis

6.1 持久层框架

  1. myBatis(mybatisPlus, 通用mapper(简化单表操作,使用通用mapper操作单表,不用书写sql))
    优点: 基于配置文件+注解, 可以灵活的书写原生sql语句
    缺点: 在单表操作时,需要写sql语句,比较麻烦
  2. springDataJpa
    和 hibernate类似
  3. hibernate
    优点: 会自动生成sql语句,操作起来比较方便
    缺点: 在进行多表操作时,配置hql语句比较麻烦.

6.2 mybatis在进行多表查询时,什么时候立即加载,什么时候懒加载?

| *默认是立即加载
| * 立即加载: 指的当查询一张表的数据时,将关联的表数据同时查询出来.
| * 懒加载: 指的当查询一张表的数据时,与之关联的表数据不查询.(什么时候查询关联的表数据: 需要时查询)
| * 比如: tab_order订单表,关联的订单详情表: tab_order_item
查询订单数据(订单名称,订单总金额)时,
与之关联的订单详情数据(商品名称,商品个数,商品小计金额)就需要立即加载
| * 比如: tab_order 订单表 , 关联的用户表: tab_user
查询订单表的数据时,与之关联的用户数据不用立即查询.称之为懒加载
当订单付款时, 需要将订单关联的用户数据查询出来(按需加载,就是懒加载)

  • 总结:
  1. 当查询一方表数据时, 需要将它关联的多方表的数据查询出来, 这种情况: (一对多时:)立即加载
    比如: tab_order(一方), 关联的多方: tab_order_item(多方)
  2. 当查询多方表的数据时,与之关联的一方表数据不用立即查询出来,这种情况:(多对一:)懒加载
    比如: tab_order(多方), 与之关联的一方: tab_user(一方)
    在这里插入图片描述

6.3 # 和 $ 符号什么区别?

  • #符号: 占位符,不会sql注入
  • $符号: 字符串拼接,可能会出现sql注入

6.4 mybatis的缓存问题

一级缓存: 会话级别的缓存(针对当前用户(一个线程)),
对应SqlSession,查询时,使用缓存(只能使用一次,面向一个用户)
优点: 当用户在当前会话过程中,
查询一条数据后,从数据库里面查询,放到一级缓存中,
等用户下次查询时,如果查询的sql语句一样,会从缓存中取数据.不查询数据库了.
二级缓存: 工厂级别的缓存,对应SqlSessionFactory,查询,使用缓存(面向所有所用用户)
优点: 面向所有用户.
当用户A查询一条数据后,从数据库里面查询,放到二级缓存中,
等用户A或者其它用户下次查询时,
如果查询的sql语句一样,会从缓存中取数据.不查询数据库了.

6.5 mybatis基于接口开发

模拟代码如下:
1.定义一个接口:

@Mapper
public interface DemoMapper {
    @Select("select * from tab_student where number=#{id}")
    Student findById(String number);
    @Select("select * from tab_student " +
            "where number=#{id} and name=#{n}")
    Student findByIdAndName(@Param("id") String number,@Param("n") String name);
}

2.模拟代码

package com.mapper;

import org.apache.ibatis.annotations.Select;
import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * 描述: mybatis基于接口的底层实现
 * mybatis基于注解开发,使用接口操作数据库
 * 1.引导类: @MapperScan 作用扫描mapper层带有@Mapper的注解
 * 2.mybatis框架根据@Mapper注解,获取到当前注解下的接口的全路径
 *   com.mapper.DemoMapper
 * 3.利用代理机制,利用反射机制
 *    ==代理机制: 给当前接口创建代理对象
 *     jdk动态代理方式: 给接口代理,生成的代理对象实现了该接口的
 *    ==反射机制: 通过得到代理对象,执行对应方法
 *      findById("100")---->增强器: Method ,args
 *   == Method获取上面的注解: Select, Insert ,Delete ,Update
 *   == 通过获取的注解对象: 获取注解里面的sql语句
 *   == 使用原生的jdbc: PreparedStatement执行sql语句(对应的#)
 *                     Statement执行sql语句(对应的$)
 */
public class DemoByMyatis {
    @Test
    public void testX(){
        Class[] inters = {DemoMapper.class};
        //得到代理对象
        Object  proxy = Proxy.newProxyInstance(DemoByMyatis.class.getClassLoader(),
                inters, new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println(method.getName());
                        System.out.println(Arrays.toString(args));
                        //使用注解类, 获取当前方法上面的注解,获取注解里面配置是sql语句
                        Select se = method.getAnnotation(Select.class);//@Select
                        String[] value = se.value();
                        System.out.println(value[0]);
                        //使用jdbc规范: PrepareStatement
                        return null;
                    }
                });
        //类型转换: 为什么不报错? 因为生成的代理实现了该接口
        DemoMapper dm = (DemoMapper) proxy;
       dm.findById("1001");
    }
}

7. SSM 结束 之环绕依赖问题

如图描述:
在这里插入图片描述在这里插入图片描述

解决方案:

  1. 在开发中尽量避免出现这种环绕问题.
  2. 使用spring的缓存机制: 保存spring容器初始化的bean对象.
  3. 注意,这里不是函数的循环调用,是对象的相互依赖关系。循环调用其实就是一个死循环,除非有终结条件。

Spring中循环依赖场景有:

(1)构造器的循环依赖 (在类中,通过构造方法传入依赖的对象)

(2)field属性的循环依赖(在类中,通过set方法注入依赖的对象),上图演示的: 属性的循环依赖

其中,构造器的循环依赖问题无法解决,只能拋出BeanCurrentlyInCreationException异常,在解决属性循环依赖时,spring采用的是提前暴露对象的方法(底层采用spring的三级缓存机制)。
在这里插入图片描述 点击参考: 循环依赖详解

8.SpringBoot

8.1. 什么SpringBoot

  • 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件)
  • 创建独立的spring引用程序 main方法运行
  • 嵌入的Tomcat 无需部署war文件
  • 简化maven配置
  • 自动配置spring添加对应功能starter(启动器)自动化配置

8.2. SpringBoot构建的项目如何部署和运行

  • 开发环境: 直接启动的应用类, 启动我们的项目
  • 生成环境: 项目开发完毕,要上线了.
    方式一: springboot默认是jar包, 通过 java的jar启动命令, 来部署和运行项目.
    方式二: springboot打成war包(排除springboot内嵌的tomcat), 把war包部署到tomcat服务器运行.

8.3. SpringBoot和Spring(SpringMVC)框架区别

  • Spring框架构建应用程序时比较麻烦,配置比较重,如果引入第三方依赖,需要手动在pom.xml配置
    特别是引入核心依赖时,如果该核心依赖还有其它依赖,需要将依赖以及它的其它依赖同时在pom.xml配置
    比如:
<dependency>
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-core</artifactId>
           <version>2.9.8</version>
       </dependency>
       <dependency>
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-databind</artifactId>
           <version>2.9.8</version>
       </dependency>
  • springBoot简化了spring的配置,在构建spring的应用程序时,比较方便.
    springBoot通过封装启动器,将核心依赖以及直接依赖都封装进来,
    在pom.xml配置时,只需引入启动器即可
  • 总结:
    spring重配置,体现pom.xml配置这里.
    springBoot通过启动器,简化了配置.

8.4. SpringBoot常用的启动器,分别有什么用

  • spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持
  • spring-boot-starter-data-jpa 数据库支持
  • spring-boot-starter-data-redis redis数据库支持
  • spring-boot-starter-data-solr solr支持
  • mybatis-spring-boot-starter 第三方的mybatis集成starter
  • 细节:
  1. 如果启动器是以spring-boot-starter-x开头的, 那就表示该启动器是springBoot封装的
  2. 如果启动器是以x-spring-boot-starter开头的,那就表示该启动器是不是springBoot封装的,是第三方封装的

8.5. SpringBoot自动装配原理

  • 自动装配
  1. 扫描开发者自定义带注解的类, 初始化bean对象,装配到容器(ConCurrentHashMap)
  2. 读取spring-boot-autoconfigure-版本号: spring-autoconfigure-metadata.properties这个配置文件
    将配置文件配置的类, 初始化bean对象, 装配到容器(ConCurrentHashMap)
  • 如何实现自动装配的?
    如图:在这里插入图片描述在这里插入图片描述

8.6. SpringBoot 配置文件

8.6.1. 全局的配置文件(名称必须按照写)
 *   application和bootstarp配置文件。
   其中application配置文件分为两种情况
   一种是: application.yml
   二种是: application.properties

注意:
1.扩展名为yml和properties,它们的配置内容是一样,在项目中只需写一种就可了
2.如果版本号不同, yml和properties配置文件的优先级不一样.

  • bootstarp配置文件(后缀名为yml或者 yaml)
    使用Spring Cloud Config注册中心时 需要在bootStarp配置文件中添加链接到配置中 心的配置属性来 加载外部配置中心的配置信息。
    一些固定的不能被覆盖的属性
    一些加密/解密的场景
8.6.2 自定义的配置文件

比如: 自定义数据源配置文件 dataSource.properties

8.6.3 springBoot框架中使用启动器,启动默认自带的配置文件

spring-boot-版本号: spring.factories
spring-boot-autoconfigure-版本号:spring.factories, spring-autoconfigure-metadata.properties

8.6.4 配置文件的里面的数据是什么, 有什么作用呢?
  • 全局配置文件: 作用配置springboot框架的的全局信息,比如: 启动的端口号
  • 自定义配置文件: 作用配置springboot项目所需的数据信息,比如: 自定义数据源配置文件
  • springboot自带的配置文件
  1. spring-boot-x: spring.factories:
    里面配置的大多是监听器,监听器的作用在springboot启动时,会自动加载全局的配置文件.
    当引导类执行main方法(启动),触发ApplicaitonEvent事件–>
    ConfigFileApplicationListener执行初始全局配置文件的操作
    2.spring-boot-autoconfigure-版本号:spring.factories, spring-autoconfigure-metadata.properties
    spring-autoconfigure-metadata.properties配置文件: 配置启动器关联第三方的核心类信息
    比如: JaskSon, CharacterEncodingFilter等等
    作用:
    当引导类执行main方法(启动)–> 通过读取 spring-autoconfigure-metadata.properties核心类–>自动装配搭配容器里面.
    当引导类执行main方法(启动)–>同时开启包扫描机制: 将开发者定义带注解的类,初始化成bean–>自动装配搭配容器里面.

9. SpringCloud

4. 企业开发的项目: 技术说明(1.5)

5. 面试总结(3,4)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值