1、Spring介绍
(1)、Spring是一个主流的Java Web 开发框架
(2)、Spring为简化企业级开发而生,使用Spring开发可以将Bean对象,Dao组件对象,Service组件对象等交给Spring容器来管理,这样使得很多复杂的代码在Spring中开发却变得非常的优雅和简洁,有效的降低代码的耦合度,极大的方便项目的后期维护、升级和扩展。
(3)、以 IOC(Inverse of Control,控制反转;依赖注入DI (Dependency Injection))和 AOP(Aspect Oriented Programming,面向切面编程)为内核,使用基本的 JavaBean 完成以前只可能由 EJB 完成的工作,取代了 EJB 臃肿和低效的开发模式。
IOC即“控制反转”,不是什么技术,而是一种设计思想,Ioc意味着将你设计好的对象交给容器控制,就是由spring来负责控制对象的生命周期和对象间的关系。IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(依赖注入)来实现的。
Spring可以说是一个管理bean的容器,也可以说是包括很多开源项目的总称,spring mvc、spring boot只是其中一个开源项目。
springboot项目是从远程服务器进行创建的。
2、Mapper.xml
id:是dao层接口的方法名字, parameterType:dao层方法的参数类型 resultType:是返回的结果集类型,取决于查询后的结果(dao层方法前面的返回值),
一般直接单表查询 可以直接使用mybatis-config.xml的简称 resultMap:自定义返回值结果集 一般多表联查使用
标签 结果集映射(配置实体类属性与数据库字段关联关系)-->
<resultMap id="menu" type="menu">
<!-- property 实体类的属性(pojo) column数据库表中的列 -->
<id property="id" column="menu_id"></id>
<result property="title" column="menu_name"></result>
<result property="menu_url" column="menu_url"></result>
<result property="menu_pid" column="menu_pid"></result>
</resultMap>
代码自动补全快捷键:Ctrl+Alt+V
3、注解作用与原理
@responseBody作用:
@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意,在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,它的效果等同于通过response对象输出指定格式的数据。
@ResponseBody会把该方法的返回值转成json格式,通过响应流的方式返回给浏览器
@Controller
@Controller把当前JavaBean交给Spring管理 控制反转
@RequestMapping
@RequestMapping("/User") 把类映射到指定路径上
@Autowire 怎么使用名称来注入
配合 @Qualifier 使用,如下所示:
@Component
public class Test {
@Autowired
@Qualifier("userService")
private UserService userService;
}
4、MyBatis--动态sql(where标签用法)
where标记的作用类似于动态sql中的set标记,他的作用主要是用来简化sql语句中where条件判断的书写的
where标签的作用:如果该标签包含的元素中有返回值,就插入一个where;如果where后面的字符串是以and 和or 开头的,就将他们剔除。
5、Spring中bean标签的属性和值:
id属性:用于指定Bean的名称,在Bean被依赖时使用,在获取Bean时使用等
name属性:用于指定Bean的别名
class属性:用于指定Bean的来源,即创建要创建的Bean的class类(需要全限定名)
init-method属性:用于指定当前Bean的初始化方法,在Bean实例创建好后,首先会调用其指定名称的方法
6、Spring 框架中用到了哪些设计模式?
说几种比较常见的:
-
工厂设计模式 : Spring使用工厂模式通过
BeanFactory
、ApplicationContext
创建 bean 对象。 -
代理设计模式 : Spring AOP 功能的实现。(AOP 面向切面编程)
-
单例设计模式 : Spring 中的 Bean 默认都是单例的。(面试手写)
-
适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配
Controller
。 -
模板方法模式 : Spring 中
jdbcTemplate
、hibernateTemplate
等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。 -
包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
-
观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
如何开启Spring AOP?
(1)添加依赖,在classpath中添加aspectjweaver.jar
(2)添加配置 //在配置类上添加@EnableAspectJAutoProxy
AOP的使用场景?
- 事务, 在标注
@Transactional
注解的方法上, 可以实现自动开启 / 提交 / 回滚事务 - 日志, 记录方法执行前的入参和执行后的结果
- 当需要实现分布式锁时, 可以利用 AOP 和自定义注解的方式, 在 Service 执行前上锁, 执行结束后解锁
单例模式的使用场景?
- 资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如日志文件,应用配置。
- 控制资源的情况下,方便资源之间的互相通信。如线程池等。
单例模式的几种实现:
(1)饿汉式—静态常量方式(线程安全)
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
(2)懒汉式(双重检查)
public class Singleton {
private static volatile Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
//双重检查
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
(3)双重校验锁(线程安全,效率高)
public class Singleton {
private volatile static Singleton singleton;
private Singleton() {}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
7、Spring 管理事务的方式有几种?
-
编程式事务,在代码中硬编码。(不推荐使用)
-
声明式事务,在配置文件中配置(推荐使用)
声明式事务又分为两种:
-
基于XML的声明式事务
-
基于注解的声明式事务
8、ajax data携带参数
serialize()序列化方法
//表单传值,如果都是input里包含的值 发送ajax时可以使用serialize()方法,
//写法为 data: $('#ed_form').serialize(), //#ed_form为表单form标签里的id值,
data: $("#book-form").serialize(),
9、ajax同步和异步
** ajax异步请求:**
异步请求就当发出请求的同时,浏览器可以继续做任何事,Ajax发送请求并不会影响页面的加载与用户的操作,相当于是在两条线上,各走各的,互不影响。 一般默认值为true,异步。
(可以同时执行多个事情)
** ajax同步请求:**
同步是一步一步来操作,等待请求返回的数据,再执行下一步,那么一定会有一些情况,只有这一步执行完,拿到数据,通过获取到这一步的数据来执行下一步的操作。这是异步没有办法实现的,因此同步的存在一定有他存在的道理。
(把当前的事情处理完才能处理下一个事情)
客户端向服务器提交的数据量很小。这时候用同步,反之,其他时候用异步。
async: false,//异步改同步
10、var和let的区别
1、作用域不同
var是函数作用域,let是块作用域。
在函数中声明了var,整个函数内都是有效的,比如说在for循环内定义的一个var变量,实际上其在for循环以外也是可以访问的
而let由于是块作用域,所以如果在块作用域内定义的变量,比如说在for循环内,在其外面是不可被访问的,所以for循环推荐用let
2、let不能在定义之前访问该变量,但是var可以。
let必须先声明,在使用。而var先使用后声明也行,只不过直接使用但没有定义的时候,其值是undefined。var有一个变量提升的过程,当整个函数作用域被创建的时候,实际上var定义的变量都会被创建,并且如果此时没有初始化的话,则默认为初始化一个undefined
3、let不能被重新定义,但是var是可以的
let = 1; let = 2;
11、mybatis动态sql foreach的用法
foreach标签主要用于构建in条件,他可以在sql中对集合进行迭代。
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
-
如果传入的是单参数且参数类型是一个List的时候,collection属性值为list .
-
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array .
-
如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名*,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key.
-
collection :collection属性的值有三个分别是list、array、map三种,分别对应的参数类型为:List、数组、map集合,我在上面传的参数为数组,所以值为array item : 表示在迭代过程中每一个元素的别名 index :表示在迭代过程中每次迭代到的位置(下标) open :前缀 close :后缀 separator :分隔符,表示迭代时每个元素之间以什么分隔 我们通常可以将之用到批量删除、添加等操作中。
12、label 的for属性
-
定义:for属性规定label与哪个表单元素绑定。
是专门为元素服务的,为其定义标记。
label 和表单控件绑定方式有两种:
方法一:将表单控件作为label的内容,这种就是隐士绑定。
此时不需要for属性,绑定的控件也不需要id属性。
隐式绑定:
<label>Date of Birth: <input type="text" name="DofB" /></label>
方法二:为label标签下的for属性命名一个目标表单的id,这种就是显示绑定。
显式绑定:
<label for="SSN">Social Security Number:</label>
<input type="text" name="SocSecNum" id="SSN" />
二、为什么要给label上面加上for属性
给 label 加了 for 属性绑定了input控件后,可以提高鼠标用户的用户体检。
如果在label 元素内点击文本,就会触发此控件,也就是说,当用户渲染该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上。
13、Vue中v-model的使用
Vue中的data:
Vue实例对应的数据对象,其在dom中访问可以只用数据名,但是在method中访问必须前面加this. 不然提示not defined
v-if使用一般有两个场景:
-
多个元素 通过条件判断展示或者隐藏某个元素。或者多个元素
-
进行两个视图之间的切换vue中v-if的常见使用_马优晨-CSDN博客
:value单向绑定 v-model双向绑定
Vue中使用v-model指令来实现表单元素和数据的双向绑定。监听用户的输入,然后更新数据。
因为input中的v-model绑定了msg,所以会实时将输入的内容传递给msg , msg发生改变。
v-model在默认情况下同步了输入框的数据,就是说输入框数据一有改变,对应的data中的数据就会自动发生改变。
jsp页面和html页面有什么不同
定义上HTML页面是静态页面可以直接运行,JSP页面是动态页面它运行时需要转换成servlet。
HTML能直接打开,jsp只能发布到Tomact等服务器上才能打开。
14、怎么读取yml配置文件内容
-
第一种读取方式@value 如果我们只需要配置文件中的一两个值,@Value 是最简单方便的方式.
server:
port: 8081
我们在代码中可以这样取值
@Value("${server.port}")
public String port;
-
第二种读取方式@ConfigurationProperties
//如果是实体类需要加上@Component
@Component //prefix (前缀) 参数, 即写上 key 就可以
@ConfigurationProperties(prefix = "student")
public class Student {
}
-
第三种读取方式@Environment
这种方式基本不用
15、MyBatis #{}与 ${}有什么不同
相同点:
都可以获取map中的值或者pojo对象属性的值;
区别:
#{}是预编译处理,${}是字符串替换。 Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的set 方法来赋值; Mybatis 在处理${}时,就是把${}替换成变量的值。 使用#{}可以有效的防止 SQL 注入,提高系统安全性。SQL 注入是一种非常常见的数据库攻击手段,SQL 注入漏洞也是网络世界中最普遍的漏洞 之一。
16、MySql数据库有哪些索引
索引是数据库优化最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的MySql的性能优化问题。
-
主键索引
-
唯一索引(它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。)
-
普通索引(这是最基本的索引,它没有任何限制。)
-
全文索引
-
联合索引
索引为什么能提高查询速度?
打个比方,索引就是书的目录,有了目录,查询起来当然更方便。一句话回答:索引可以将无序内容转换为有序的一个集合(相对)。mysql中其实索引底层实现的结构就是B+树,B+树作为树的一种实现能够让我们很快查找出对应内容。
17、SpringBoot如何加载传统的xml文件
//多文件用逗号隔开
@Configuration
@ImportResource(locations= {"classpath:application-bean.xml"})
public class Config {
}
18、Maven是干什么的?
Maven 是一个项目管理和构建自动化工具。Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具。
Maven的核心功能便是合理叙述项目间的依赖关系,通俗点讲,就是通过pom.xml文件的配置获取jar包,而不用手动去添加jar包,而这里pom.xml文件对于学了一点maven的人来说,就有些熟悉了,怎么通过pom.xml的配置就可以获取到jar包呢?pom.xml配置文件从何而来?等等类似问题我们需要搞清楚,如果需要使用pom.xml来获取jar包,那么首先该项目就必须为maven项目,maven项目可以这样去想,就是在java项目和web项目的上面包裹了一层maven,本质上java项目还是java项目,web项目还是web项目,但是包裹了maven之后,就可以使用maven提供的一些功能了(通过pom.xml添加jar包)。
19、Spring Boot哪里用到了控制反转
Controller层,Service层,Mapper层。
@bean注解可以把该类交给Spring去管理。
20、Mabtis框架可以根据Mapper接口自动实现 实现类
@Mapper标注在dao层接口上,表示为该接口创建实现类。
21、前端页面怎么向后台传递参数?
通过对象:data:from,
表单序列化:data: $("#book-form").serialize() 获取表单中的值
后台怎么获取前端页面参数?
通过对象 如:(Fruit fruit) { }
通过@RequestParam注解 如: (@RequestParam Map<String,Object> map) { } 表示接收页面参数并封装到map集合。
22、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>
select order_id id, order_no orderno ,order_price price from orders where order_id=#{id};
</select>
第2种: 通过<resultMap >来映射字段名和实体类属性名的一一对应的关系。
<!-- resultMap标签id为自定义名字,type为pojo类的简写名 -->
<resultMap id="Login" type="login">
<!-- id 表示关联表中的主键 result表示关联其他字段 property 实体类的属性 column 表中的字段-->
<id property="customerId" column="customer_id"></id>
<result property="loginName" column="login_name"></result>
<result property="password" column="password"></result>
<result property="userStats" column="user_stats"></result>
<result property="modified_time" column="modified_time"></result>
</resultMap>
一对一和 多对一用<association> 标签
一对多用<collection>标签
23、通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
Dao接口即Mapper接口。接口的全限名,就是映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id值;接口方法内的参数,就是传递给sql的参数。
Mapper接口里的方法,是不能重载的,因为是使用 全限名+方法名 的保存和寻找策略。Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,转而执行MapperStatement所代表的sql,然后将sql执行结果返回。
24、如何向mapper中如何传递多个参数?
第一种:括号参数中在加一条即可
第二种: 使用 @param 注解
第三种:多个参数封装成map
25、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;
26、springMVC执行流程
27、关于sql的优化
为什么要对SQL进行优化 ?
我们开发项目上线初期,由于业务数据量相对较少,一些SQL的执行效率对程序运行效率的影响不太明显,而开发和运维人员也无法判断SQL对程序的运行效率有多大,故很少针对SQL进行专门的优化,而随着时间的积累,业务数据量的增多,SQL的执行效率对程序的运行效率的影响逐渐增大,此时对SQL的优化就很有必要。
SQL优化的一些方法:
- 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。(全表扫描的意思就是要把表中所有数据过一遍才能显示数据结果)
- 应尽量避免在 where 子句中对字段进行 null 值判断。
- 应尽量避免在 where 子句中使用!=或<>操作符。
- 应尽量避免在 where 子句中使用 or 来连接条件。
- in 和 not in 也要慎用,否则会导致全表扫描。
- 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
28、@SpringBootApplication 注解中的属性相当于哪几个注解?
我们可以发现,在使用main()启动SpringBoot的时候,只有一个@SpringBootApplication,我们可以点击进去@SpringBootApplication注解中看看,可以发现有三个注解是比较重要的:
- @SpringBootConfiguration:标记当前类为配置类
- @EnableAutoConfiguration:开启自动配置
- @ComponentScan:扫描主类所在的同级包以及下级包里的Bean
深入了解@EnableAutoConfiguration:
进入到@EnableAutoConfiguration注解内部,主要依赖了两个@AutoConfigurationPackage和@Import。
- @AutoConfigurationPackage:该注解的主要作用是将主配置类(@SpringBootApplication标注的类)所在包及下面所有子包里面的所有组件扫描到Spring容器;
- @Import的功能是导入组件
29、SpringBoot自动配置原理
我们知道SpringBoot可以帮我们减少很多的配置,也肯定听过“约定大于配置”这么一句话,那SpringBoot是怎么做的呢?其实靠的就是@EnableAutoConfiguration注解。简单来说,这个注解可以帮助我们自动载入应用程序所需要的所有默认配置。
SpringBoot启动时会通过@EnableAutoConfiguration注解找到META-INF/spring.factories文件的信息,然后筛选出以EnableAutoConfiguration为key的数据,加载到IOC容器中,实现自动配置功能!
30、Spring 的 AOP 有哪几种创建代理的方式
Spring 中的 AOP 目前支持 JDK 动态代理和 Cglib 代理。
通常来说:如果被代理对象实现了接口,则使用 JDK 动态代理,否则使用 Cglib 代理。另外,也可以通过指定 proxyTargetClass=true 来实现强制走 Cglib 代理。
31、cookie和session的区别
cookie是客户端技术,不是十分安全,并且只能存储String类的对象,保存的数据不能超过4k,但能设置作用有效时间。
session是服务器技术(一次会话),能存储任意Java对象,但关闭网页会话就结束了。
32、转发与重定向
转发:把请求转发到其他页面,地址不会变,属于一次请求中
request.getRequestDispatcher("new.jsp").forward(request,responce);
重定向:浏览器的地址会改变,请求次数为多次
responce.sendRedirect("/new.jsp") [san de rui de rua ke t]
区别:
- 转发是服务器行为,重定向是客户端行为
- 转发浏览器地址不改变,重定向会
- 转发是一次请求,重定向是多次请求
- 转发会携带请求域参数,重定向不会
请求request方法:
get Parameter() //接收客户端参数
get ParameterValues() //接收多个客户端参数
get ParameterMap() //把客户端参数存到Map集合
响应response方法:
setStatus() //设置相应状态码
getWriter() //返回字符输出流对象,按字符形式输出响应
getOutputStream() //返回字节输出流对象,按字节形式输出响应
33、springBoot全局异常怎么处理?
全局异常处理,指的是对于程序中产生的Exception进行的处理。产生了异常之后,可以统一跳转到一个页面进行错误提示,也可以通过Restful形式返回错误信息。
可以使用ErrorController接口和 @ControllerAdvice【ai de bai s】注解,两者都是Spring项目中的全局异常处理方式。
不同点:
- ErrorController接口捕获全局所有的异常,包括控制器方法中抛出的异常,ErrorController接口是基于跳转页面的.如果有异常发生,就会跳转到 /error页面
- @ControllerAdvice注解只能捕获控制器方法中抛出的异常 .@Controller注解无法捕获Filter, 拦截器,请求路径等位置抛出的异常,@ControllerAdvice是基于AOP的