一、spring框架
Spring是一个轻量级的IoC和AOP容器框架。
如图,以上组件被分别放在核心容器(core container)、数据访问集成(data access/integration)、web、test、AOP、报文发送(messaging)、设备支持(instrumentation)等。
其中spring-core:IOC和DI,控制反转就是将对象交给容器管理。
Spring的优点:
spring属于低侵入式设计,代码的污染极低;
spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;
Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。
spring对于主流的应用框架提供了集成支持。
1.spring的核心原理:
IOC和AOP,IOC让相互协作的组件保持松散的耦合,而AOP编程允许把遍布于应用各层的功能分离出来形成可重用的功能组件。
IOC:控制反转
(1)IOC就是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到Spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。DI依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IOC容器来动态注入对象需要的外部资源。
(2)最直观的表达就是,IOC让对象的创建不用去new了,可以由Spring容器自动生产,使用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。
(3)Spring的IOC常用的有三种注入方式 :构造器注入、setter方法注入、基于注解注入(@Autowired)。
AOP:面向切面
(1)理解:
与业务无关,但是对对象造成密切的影响的行为或者逻辑,将这些公共的提取出来封装起来,减少重复代码,降低模块之间的耦合度。
(2) AOP核心:
切面(Aspect):被抽取出来的公共模块
连接点(Join point):执行的目标方法
通知(Advice):通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
切入点(Pointcut):满足扫描条件的所有连接点的集合
引入(Introduction):声明额外的方法或者某个类型的字段。
目标对象(Target Object):被代理的对象
织入(Weaving):指把增强应用到目标对象来创建新的代理对象的过程。Spring是在运行时完成织入。
(3)切入点表达式:
3.1AOP支持AspectJ切入点指示符:
切入点指示符用来指示切入点表达式目的,,在Spring AOP中目前只有执行方法这一个连接点,Spring AOP支持的AspectJ切入点指示符如下:
execution:用于匹配方法执行的连接点;
within:用于匹配指定类型内的方法执行;
this:用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配;
target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配;
args:用于匹配当前执行的方法传入的参数为指定类型的执行方法;
@annotation:用于匹配当前执行方法持有指定注解的方法;
bean:Spring AOP扩展的,AspectJ没有对应指示符,用于匹配特定名称的Bean对象的执行方法;
4.AOP的代理模式
代理模式有静态代理(AspectJ)和动态代理(springAOP)。
AspectJ是静态代理的增强:在编译时期就生成AOP代理,所以也叫编译时增强,所以字节码会有改变。
springAOP则是动态代理:不会改变字节码,在每次运行的时候,在内存里生成一个临时对象,包含了AOP对象的全部方法,并且在特点切点增强之后,返回被增强的对象。
两者相比前者的性能更好,但是需要的特定的编译器进行处理。
5.动态代理的两种模式:
JDK和GGLIB
JDK:只提供接口的代理,不支持类的代理。InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例, 生成目标类的代理对象。
JDK动态代理实现InvocationHandler接口
GGLIB:CGLIB是通过继承的方式做的动态代理,CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。
采用CGLIB代理实现:需要导入asm版本包,实现MethodInterceptor接口
明显一个是接口一个是类。
静态代理与动态代理区别:在于生成AOP代理对象的时机不同,相对来说AspectJ的静态代理方式具有更好的性能,但是AspectJ需要特定的编译器进行处理,而Spring AOP则无需特定的编译器处理。
6.spring的两大核心接口:Beanfactory和Applicationcontext
BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。
6.1 加载方式
BeanFactroy 采用的是延迟加载形式来注入Bean,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。这样,我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常。
ApplicationContext 是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入。 ApplicationContext启动后预载入所有的单实例Bean,通过预载入单实例bean ,确保当你需要的时候,你就不用等待,因为它们已经创建好了。
相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。
6.2注册方式
BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。
7.Spring容器中的Bean(重点)
生命周期:实例化-属性赋值-初始化-销毁
单例Bean的线程安全和并发问题(重点)
单例Bean分两种:无状态的单例Bean(线程安全)和有状态的单例Bean(线程不安全)。
解决不安全的方法:尽量使用无状态的bean,有状态Bean的线程安全问题推荐使用ThreadLocal进行处理。 最差的方法就是加锁。
7.1作用域:
singleton(单例):只含有一个bean实例,以单例方式存在。
prototype(原型):每次从容器中调用Bean时,都返回一个新的实例
request:每次HTTP请求都会创建一个新的Bean
session:同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。
globalsession:同一个全局 Session 共享一个 bean,用于 Portlet,
7.2:bean的注入方式:
基于注解注入,构造器注入,setter注入
8.spring事务:
本质上是数据库对事物的支持。
8.1事务种类:编程式事务和声明式事务
编程式:通过TransactionTemplate,但是一般使用声明式事务,本质上通过AOP实现:使用@Transactional注解的方式
9.spring用到的设计模式:
9.1:工厂模式
benafactory和applicationcontext创建bean对象。
9.2:单例模式:
bean的默认模式就是单例
9.3:代理模式:
AOP用到了JDK和GGLIB的动态代理。
9.4:模板方法:
eg:RestTemplate
9.5:观察者模式
spring中的listener
二、springboot:
1.理解:
springboot是组件一站式解决,简化spring配置。
优点:独立运行和简化配置
容易上手,开箱即用,提供了大量的业务性功能、简化了配置(XML配置和maven导入版本的冲突)
2.核心注解:
启动类:@springbootapplication
它由三个注解组成:
- @SpringBootConfiguration
- @ComponentScan
- @EnableAutoConfiguration
自动配置原理:
@EnableAutoConfiguration 是实现自动配置的入口,该注解又通过 @Import 注解导入了AutoConfigurationImportSelector,在该类中加载 META-INF/spring.factories 的配置信息。然后筛选出以 EnableAutoConfiguration 为 key 的数据,加载到 IOC 容器中,实现自动配置功能。
3.springboot核心配置文件有:
Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景。
使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
一些固定的不能被覆盖的属性;
一些加密/解密的场景;
三、springMVC
流程描述:
1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用处理器映射器HandlerMapping。
3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
4.DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
5.执行处理器Handler(Controller,也叫页面控制器)。
6.Handler执行完成返回ModelAndView
7.HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
11.DispatcherServlet响应用户。
常见注解:
1、@Controller
用于标识是当前类属于SpringMVC Controller中的对象,当分发处理器扫描该注解类,把这个类交给Spring来处理,首先要添加该注解里面的方法才能够被外部访问。
2、@RequestMapping
是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
3、@ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
4、@Service
声明Service组件, @Service(“myMovieLister”),当只使用@Service时,Spring会默认将类的首写小写。
5、@Component
相当于通用的注解,当不知道一些类归到哪个层时使用。
6、@Autowired
用于注入,(Srping提供的) 默认按类型装配。注入一个DAO,或者Service。
7、@Transactional
事务管理。属性分为:事物传播,事物超时设置(默认30S),事物隔离等。
Restful:
考题: 什么是restFul?
1.通过/将参数分隔,使url参数传递的字节信息减少
2.Restful规定:通过同一个url地址,不同的请求类型,控制业务逻辑,不能出现动词。
优点:
面向资源,就是上面第二点
无状态,不用考虑上下文。
四、Mybatis(25道MyBatis面试题,看了你就赢了|mybatis|面试|数据库 (qq.com))无敌
1.jdbc的连接步骤
注册驱动-建立连接-获取传输器-执行sql-获取、处理结果集-关闭连接
1.什么是Mybatis
一个半ORM持久层关系型数据库,支持定制sql、存储过程、高级映射
底层封装了jdbc、基本上不用写JDBC相关代码、手动设置参数和获取结果集
可以用简单的XML配置或者注解配置和映射原始类型、POJO类和接口。
2.优缺点和适用场景:
优点:
基于SQL语句编程,非常灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除SQL与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。
能够与Spring很好的集成;
提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
缺点:
- SQL语句的编写工作量较大,尤其当字段多、关联表多时。
- 不支持方言,数据库移植性差。
- SQL存在XML文件中,调试不方便。
- 对动态SQL的支持不是很好,提供的标签过于简单。
- 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
适用场景
MyBatis 解耦了 SQL 和 程序代码,适合业务逻辑相对复杂或者变动频繁的场景,可以使开发人员专注于 SQL 逻辑的修改。目前,在互联网、金融等项目中,MyBatis 是不错的选择。
3.具体语法细节:
mapper标签里的namespace=“mapper接口的包路径”
4.ORM是什么
ORM是对象关系映射、是为了解决关系型数据库和Java对象的映射关系的技术。将程序中的对象自动持久化到数据库内。
优点:因为它会自动根据entry对象和数据库中的字段进行映射,所以不用写数据访问层,提高开发效率,不用sql 编码
缺点:牺牲了执行效率,固定了开发的思维
5.Mybatis如何分页的及原理:
“(1条消息) MyBatis精通之路之分页功能的实现(数组分页、sql分页、拦截器,RowBounds分页)_白哥哥的博客-CSDN博客_数组分页”
两种:1.物理分页,先查出来,再做分页,
2.Rowbounds,是对ResultSet的结果集的内存分页,自动添加limit
springboot中使用的是插件,这个插件实际上就是一个外部接口
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql(SQL拼接limit),根据dialect方言,添加对应的物理分页语句和物理分页参数,用到了技术JDK动态代理,用到了责任链设计模式。
6.MyBatis底层工作原理
1.创建SqlSwssionFactory
2.通过SqlSessionFactory创建SqlSession
3.通过SqlSesson执行数据库操作
4.调用session.commit()提交事务
5.调用session.close()关闭会话
7.Mybatis动态sql有什么用?
Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值完成逻辑判断 并动态调整sql的功能。**以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能**
Mybatis提供了9种动态sql标签:trim | where | set | foreach | if | choose | when | otherwise | bind。
8.#{}和${}的区别是什么?
${}是字符串替换,#{}有个预处理,mybatis直接把{}里边的值换成变量,就会造成注入攻击,这个预处理就是会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值。
9.Mybatis执行批量插入,能返回数据库主键列表吗?
1)、对于支持生成自增主键的数据库:增加 useGenerateKeys和keyProperty ,标签属性。
2)、不支持生成自增主键的数据库:使用。
方式:keyProperty="id">
insert into Author (username, password, email, bio) values
(#, #, #, #)
10.模糊查询最好写在Java开发的时候,因为写在sql语句里会引起sql注入
. 什么是 MVVM?
MVVM 是Model-View-ModelView的缩写,是一种脱胎于 MVC 模式的设计模式。
Model 代表数据层,负责存放业务相关的数据;
View 代表视图层,负责在页面上展示数据;
ViewModel 是的作用是同步 View 和 Model 之间的关联,其实现同步关联的核心是DOM Listeners和 Data Bindings两个工具。DOMListeners 工具用于监听 View 中 DOM 的变化,并会选择性的传给 Model;Data Bindings 工具用于监听 Model 数据变化,并将其更新给 View。
vue的声明周期:
创建前-创建-挂载前-挂载-更新前-更新-销毁前-销毁
要完整实现一个AJAX异步调用和局部刷新,通常需要以下几个步骤:
创建XMLHttpRequest对象,即创建一个异步调用对象.
创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.
设置响应HTTP请求状态变化的函数.
发送HTTP请求.
获取异步调用返回的数据.
使用JavaScript和DOM实现局部刷新.