目录
1.SpringBoot的注解
@RequestMapping:
这个注解可以用于类和方法上,用于类上,表示父路径,如类上是hello,方法上是/demo,那么访问路径就是hello/demo
@PathVariable:
对应路径上的变量,用在参数前,路径上的变量名需和参数名称一致。
@RequestParam:
和以下代码的作用相同。
String name =request.getParameter("name ")。
@RequestBody:(一般用于Restful风格)
是指方法参数被绑定到HTTP请求Body上,前端就不能用表单的方式提交了,需要用json的方式提交。
@ResponseBody:
表示输出的是json格式的数据。
@Autowired:
属于Spring 的org.springframework.beans.factory.annotation包下,可用于为类的属性、构造器、方法进行注值。
@Service:
标注一个业务逻辑组件类。
@Controller:
标注一个控制器组件类。
在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面。
若返回json等内容到页面,则需要加@ResponseBody注解。
@RestController:
标注一个控制器组件类。
相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面。
@SpringBootApplication:
包含@Configuration、@EnableAutoConfiguration、@ComponentScan,通常用在启动类上。
2.Redis相关:
1.为什么用redis:
- 高性能::当用户访问数据库中的某些数据,是直接从硬盘上读取的,这个过程是比较慢的.如果将用户访问的这些数据放入缓存中,用户访问数据时,就直接读取缓存中的数据,这样直接操作内存,速度会快很多.
- 高并发:当多用户访问时,直接操作缓存能够承受的请求是远远大于直接访问数据库的,我们讲热点词放到缓存中,会大大减少数据库的任务量。
2.为什么redis这么快?
(一)纯内存操作
(二)单线程操作,避免了频繁的上下文切换
(三)采用了非阻塞I/O多路复用机制
3.Redis支持五种数据类型:
string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
-
String(字符串):
string 是 redis 最基本的类型,一个 key 对应一个 value。
注意:一个键最大能存储 512MB。
-
Hash(哈希):
Redis hash 是一个键值对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
注意:每个 hash 可以存储 232 -1 键值对(40多亿)。
-
List(列表):
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
-
Set(集合):
Redis 的 Set 是 string 类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
-
zset(sorted set:有序集合) :
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
3.Mybatis如何加索引:
//TODO
4.Spring配置如何实现热更新:
1.引入spring-boot-starter-actuator依赖
2.在配置文件中增加刷新接口refresh
3.在需要修改配置文件的控制器中加入注解@RefreshScope
5.Eureka与Zookeeper的区别:
https://blog.csdn.net/java_xth/article/details/82621776
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
6.什么是注册中心:
在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用。
7.spring设计模式:
1.工厂设计模式:
Spring使用工厂模式可以通过BeanFactory或ApplicationContext创建bean对象。
ApplicationContext :容器启动的时候,不管你用没用到,一次性创建所有 bean 。BeanFactory 仅提供了最基本的依赖注入支持,ApplicationContext 扩展了 BeanFactory ,除了有BeanFactory的功能还有额外更多功能,所以一般开发人员使用ApplicationContext会更多。
2.单例设计模式:
Spring中bean的默认作用域就是singleton.
3.代理设计模式:
Spring AOP就是基于动态代理的,如果要代理的对象实现了某个接口,那么Spring AOP会使用JDK Proxy去创建代理对象,而没有实现接口的对象,无法使用JDK Proxy。
4.模板设计模式:
Spring中jdbcTemplate等对数据库操作的类,他们就是用到模板模式。
5.装饰者模式:
装饰者模式可以动态的给对象增加额外的属性或者行为。相比于使用继承,装饰者模式更加灵活。
6.控制反转(IOC)和依赖注入(DI):
IOC是Spring中一个非常重要的概念,它主要的目的是借助于Spring的IOC容器实现具有依赖关系的对象之间的解耦,从而降低代码之间的耦合度。他不是一个模式,而是一种设计原则。
DI(Dependecy Inject,依赖注入)是实现控制反转的一种设计模式,依赖注入就是将实例变量传入到一个对象中去。
8.MySQL优化:
1.Like查询走不走索引的问题:
https://blog.csdn.net/zxssoft/article/details/79651889
9.jquery相关:
- 获取dom节点有几种方式:
jQuery中包裹后的DOM对象实际上是一个数组,
要获得纯粹的DOM对象可以有两种方式:
1、使用数组索引方式访问,例如:
var dom = $(dom)[0];
如: $("#id")[0]
2、使用函数get()访问,例如:
var dom = $(dom).get(0);
get()函数中的参数为索引号。
- DOM中获取元素的不同的方式:
document.getElementById();
document.getElementsByTagName();
document.getElementsByClassName();
document.getElementsByName();
document.querySelector();选择器
document.querySelectorAll();选择器
10.ElasticSearch原理:
http://developer.51cto.com/art/201904/594615.htm
11.MySQL外连接查询:
1.左外连接:
left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。
左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
2.右外连接:
right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。
与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。
12.Ajax同步和异步请求的区别:
$.ajax({
type: "post",
url: "path",
cache:false,
async:false,
dataType: ($.browser.msie) ? "text" : "xml",
success: function(xmlobj){
function1(){};
}
});
1.如何设置同步异步:
修改ajax请求中的async参数即可,默认异步,async = false为设置同步请求。
2.区别:
同步请求提交请求后等待服务器处理,服务器处理完毕后才返回,这个期间客户端浏览器不能干任何事。
异步请求通过事件触发,提交请求后服务器处理,这时候浏览器仍然可以做其他事情,不必等待返回结果,一般需要监听异步的结果。
说简单点就是,同步是在一条直线上的队列;异步不在一个队列上,各走各的。
13.Java基础:
1.Collections和Collection的区别:
Collections是一个包装类,里面有各种关于集合操作的静态、多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
2.ArrayList和LinkedList区别:
1.一个是Array(动态数组)的数据结构,一个是Link(链表)的数据结构.但是他们都是List接口的实现类,前者是数组队列,后者为双向链表结构。
2.当访问List时,ArrayList比LinkedList效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找.
3.对数据进行增删时,LinkedList比ArrayList的效率更高,因为ArrayList是数组,对其进行增删操作的时候,会对操作点之后的所有数据下标索引造成影响,需要进行数据的移动。
4.ArrayList需要手动设置固定大小的容量,但是它使用方便,只需创建,添加数据,调用下标就能进行使用;
LinkedList能够动态的随数据量的变化而变化,但是它不便于使用。
3.反射:
//设置一个pojo对象
private int id;
private String name;
private int age;
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public Person() {
}
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//1.通过反射获取类:
//1.1 Class.forName("xxx") xxx对应自己的pojo路径
// 注意用此方法需要捕获异常
try {
Class<?> stu= Class.forName("pojo.Student");
System.out.println(stu);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//1.2 .class
// 此方法是我们经常用的获取类的方法
Class<Person> stu = Student.class;
System.out.println(stu);
//1.3 xxx.getClass
Student student= new Student();
Class<? extends Student> s = (Class<? extends Student>) student.getClass();
System.out.println(s);
//2. 同理可得类中所有的方法.
//注意: getMethods()是获取所有的公共方法
getDeclaredMethods()获取当前类的所有方法
Class<Student> stu= Student.class;
Method[] methods1 = stu.getMethods();
for (Method method : methods1) {
System.out.println(method);
}
System.out.println("-----------");
Method[] methods2 = stu.getDeclaredMethods();
System.out.println(methods2);
for (Method method : methods2) {
System.out.println(method);
}
14.SpringMVC:
1.项目可以访问controller但是页面返回空白,没有任何报错,为什么?
- 检查SpringMVC拦截器,拦截器代码可能有错,或干脆没写.
- @RequestMapping注解里可能没有写Get Post方法.
- 如果你写的是@RestController,方法会以返回字符串形式返回,如果写的是@Controller那么返回的是页面,将返回到jsp页面. 想返回字符串就用RestController,想返回页面就用Controller.
- 没有在web.xml中添加DispatcherServlet.
15.日志相关:
1.常见的日志级别:
-
DEBUG级别:记录调试程序相关的信息。
-
INFO级别:记录程序正常运行有意义的信息。
-
WARN级别:记录可能会出现潜在错误的信息。
-
ERROR级别:记录当前程序出错的信息,需要被关注处理。
-
Fatal级别:表示出现了严重错误,程序将会中断执行。
Log4j建议只使用四个级别,优先级 从高到低分别是 ERROR、WARN、INFO、DEBUG。
2.日志使用的优化:
1、提前判断日志级别
2、避免多余日志输出
3、保证日志记录信息完整
4、定义logger变量为static
5、正确使用日志级别
6、推荐使用slf4j+logback组合
7、日志的聚合分析
16.事务相关:
1.事务的四大特性:
原子性:
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
一致性:
事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。
隔离性:
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
持久性:
当事务正确完成后,它对于数据的改变是永久性的。
2.嵌套事务:
https://www.cnblogs.com/mcahkf/p/9228609.html
17.设计模式:
1.单例设计模式:
解决的问题:保证一个类在内存中对象的唯一性。
例如:多个程序读取一个配置文件时,建议将配置文件封装成对象,这样会方便操作其中数据。但是,又要保证多个程序读到的是同一个配置文件对象,这就需要该配置文件对象在内存中是唯一的了。
如何保证对象唯一性呢?
1.不让其它程序创建该类对象
2.在本类中创建一个本类对象
3.对外提供一个公有方法,让其它程序获取这个对象
单例设计模式分为两种表现形式:
懒汉式:
public Single1() {
}
private static Single1 s = null;
//懒汉式
public static Single1 getInstance(){
if (s==null) {
s = new Single1();
}
return s;
}
//懒汉式-改良1 缺点 同一时间只能有一个线程访问 同时返回一个对象
public static synchronized Single1 getInstance(){
if (s==null) {
new Single1();
}
return s;
}
//懒汉式-改良2 线程安全,效率高,可以有多个线程访问。
public static Single1 getInstance(){
if (s==null) {
synchronized (Single1.class){
if (s==null) {
s = new Single1();
}
}
}
return s;
}
饿汉式:
//饿汉式
public Single() {
}
private static Single s = new Single();
public static Single getInstance(){
return s;
}
实际开发中因懒汉式线程不安全,改良后代码复杂度变高,故一般选择饿汉式,但饿汉式虽然线程安全,但是因为一开始加载类就要new对象,所以效率比较低.
18.Tomcat修改端口号:
conf目录下找到server.xml,找到
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
修改port端口号即可
//TODO...未完待续