1. java基础(1)2. javaweb(1)3. ssm+springboot+springCloud(1.5)
4. spring框架
4.1 IOC总结4.2 BeanFactory(懒加载初始bean)和ApplicatonContext(立即初始bean)区别4.3 spring的DI4.4 aop4.5 通知 5. springmvc框架
5.1 Spring容器和SpringMVC容器的区别以及关系?5.2 SpringMVC中为什么不会出现post请求的中文乱码问题?5.3 SpringMVC 核心处理器有那些?5.4 SpringMVC 执行流程5.5 SpringMVC 的拦截器和过滤器什么区别 6. Mybatis
6.1 持久层框架6.2 mybatis在进行多表查询时,什么时候立即加载,什么时候懒加载?6.3 # 和 $ 符号什么区别?6.4 mybatis的缓存问题6.5 mybatis基于接口开发 7. SSM 结束 之环绕依赖问题8.SpringBoot
8.1. 什么SpringBoot8.2. SpringBoot构建的项目如何部署和运行8.3. SpringBoot和Spring(SpringMVC)框架区别8.4. SpringBoot常用的启动器,分别有什么用8.5. SpringBoot自动装配原理8.6. SpringBoot 配置文件
8.6.1. 全局的配置文件(名称必须按照写)8.6.2 自定义的配置文件8.6.3 springBoot框架中使用启动器,启动默认自带的配置文件8.6.4 配置文件的里面的数据是什么, 有什么作用呢? 9. SpringCloud 4. 企业开发的项目: 技术说明(1.5)5. 面试总结(3,4)
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容器中.
相同点: 都是spring容器BeanFactory 顶层接口(父容器)ApplicationContext 子接口(子容器)实现初始bean对象,把bean对象装配到容器中.是以上接口的子类.
- 如果是普通的java项目:
*基于配置文件开发:
手动创建 ClassPathXmlApplicationContext容器对象,读取配置文件,实现初始bean对象
*基于注解开发:
手动创建AnnotationConfigApplicationContext容器对象,扫描注解,实现初始化bean对象如果是web项目:
基于配置文件开发:
在服务器启动时, 由ContextLoadListener监听器,自动创建XmlServletWebServerApplicationContext容器对象,
读取配置文件,实现bean对象的初始化.基于注解开发
在服务器启动时,由监听器负责自动创建AnnotationConfigWebApplicationContext容器对象,扫描注解,实现bean对象的初始化.
4.3 spring的DI
DI: 依赖注入,在一个类中注入这个类所需的bean对象.方式一: set方法注入方式二: 构造方法注入基于配置文件: 实现DI,如下图
基于注解开发,实现DI
- @Resource :
实现在类中注入bean对象,底层根据注入bean的类名(首字母小写,比如: cat---->Cat对象),
从容器中拿到bean对象,注入到当前类中@Autowired:
实现在类中注入bean对象,底层根据bean的类型,从容器中拿到bean对象,注入到当前类中
Qualifier(“bean的名称”): 如果根据类型找不到, 才会 Qualifier(“bean的名称”)的bean名称找
Spring框架AOP: 对业务层的方法进行增强.应用场景: 事务控制(底层就是aop)事务:
- 读问题,写问题 ,引发开发者在业务层使用事务控制事务隔离级别事务的传播属性
通知: 就是增强的业务逻辑分类
- 前置通知,后置通知,返回通知,异常通知,环绕通知执行顺序:
前置通知: 在执行目标方法(切点)前,执行
后置通知: 在执行目标方法(切点)后,不管执行过程中,是否有异常,都会执行的通知
返回通知: 在执行目标方法(切点)后,执行,在执行过程中,有异常,返回通知不执行
异常通知: 在执行目标方法(切点)后,如果有异常,才会执行.
注意: 返回通知和异常通知不能同时执行
环绕通知配置在切点上面,如果配置了环绕通知,一般情况下不用前置,后置,返回通知.
Spring容器是父容器, 可以初始化任意层(web层,service层,dao层)的bean对象
@Component,@Controller, @Service, @RepositorySpringMVC容器称之为子容器,作用初始化web层的bean对象
@ControllerSpring容器可以初始化@Controller注解下面的bean,
SpringMVC容器可以初始化@Controller注解下面的bean,就会出现冲突.
怎么解决这个问题?
Spring容器扫描时,排除web层的@Controller注解.
SpringMVC容器扫描时,只扫描web层的@Controller注解.
5.2 SpringMVC中为什么不会出现post请求的中文乱码问题?
使用了CharacterEncodingFilter过滤器类, 默认处理了post请求的中文乱码问题.
过滤器的作用: 拦截请求和响应.
比如: 浏览器 提交post请求的中文-------->CharacterEncodingFilter过滤器(处理post乱码)-------->后台端
中央处理器: 分发请求,比如: http://域名:port/controller的访问路径处理映射器: 将中央处理器分发的请求进行解析,根据解析controller的访问路径,访问对应的controller视图解析器: 将controller返回的数据展示视图页面.需要视图解析器解析视图页面.将数据展示
视图: Freemarker, Thyemleaf数据处理器: 比如 springmvc默认使用的JaskSon,将后台的数据转成json数据进行返回
5.4 SpringMVC 执行流程
1).Springmvc中的拦截器interceptor用于对控制器controller进行预处理和后处理的技术;
2).可以定义拦截器链,拦截器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
3).拦截器interceptor与过滤器filter的区别
1.过滤器是servlet中的,任何框架都可以使用过滤器技术;
2.拦截器是Springmvc所独有的
3.过滤器设置
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 结束 之环绕依赖问题
如图描述:
解决方案:
- 在开发中尽量避免出现这种环绕问题.使用spring的缓存机制: 保存spring容器初始化的bean对象.注意,这里不是函数的循环调用,是对象的相互依赖关系。循环调用其实就是一个死循环,除非有终结条件。
Spring中循环依赖场景有:
(1)构造器的循环依赖 (在类中,通过构造方法传入依赖的对象)
(2)field属性的循环依赖(在类中,通过set方法注入依赖的对象),上图演示的: 属性的循环依赖
其中,构造器的循环依赖问题无法解决,只能拋出BeanCurrentlyInCreationException异常,在解决属性循环依赖时,spring采用的是提前暴露对象的方法(底层采用spring的三级缓存机制)。
用来简化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配置
比如:
com.fasterxml.jackson.core jackson-core 2.9.8 com.fasterxml.jackson.core jackson-databind 2.9.8
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细节:
- 如果启动器是以spring-boot-starter-x开头的, 那就表示该启动器是springBoot封装的如果启动器是以x-spring-boot-starter开头的,那就表示该启动器是不是springBoot封装的,是第三方封装的
自动装配
- 扫描开发者自定义带注解的类, 初始化bean对象,装配到容器(ConCurrentHashMap)读取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.properties
spring-boot-autoconfigure-版本号:spring.properties, spring-autoconfigure-metadata.properties
全局配置文件: 作用配置springboot框架的的全局信息,比如: 启动的端口号自定义配置文件: 作用配置springboot项目所需的数据信息,比如: 自定义数据源配置文件springboot自带的配置文件
- spring-boot-x: spring.properties:
里面配置的大多是监听器,监听器的作用在springboot启动时,会自动加载全局的配置文件.
当引导类执行main方法(启动),触发ApplicaitonEvent事件–>
ConfigFileApplicationListener执行初始全局配置文件的操作
2.spring-boot-autoconfigure-版本号:spring.properties, spring-autoconfigure-metadata.properties
spring-autoconfigure-metadata.properties配置文件: 配置启动器关联第三方的核心类信息
比如: JaskSon, CharacterEncodingFilter等等
作用:
当引导类执行main方法(启动)–> 通过读取 spring-autoconfigure-metadata.properties核心类–>自动装配搭配容器里面.
当引导类执行main方法(启动)–>同时开启包扫描机制: 将开发者定义带注解的类,初始化成bean–>自动装配搭配容器里面.



