特别mess(极度混乱)的java知识
- restful面试题,
什么是restful?简单地说,在restful简化之前,将参数使用/的方式进行分割,减少了url参数传递的字节信息.
restful规定,可以通过一个url请求的地址,通过不同的请求类型,控制业务逻辑;要求路径种不能出现动词,一般都是无状态的. - springboot
SpringBoot实现了自动化配置,SpringBoot作用是框架的框架,在Spring SpringMVC Mybatis上的一个高级API简化了框架的调用.核心思想就是开箱即用,立足于Spring.SpringBoot内部与Spring无缝衔接, - 关于lombok的面试题
项目将来要部署在Linux中,是否需要安装lombok在Linux系统中?
不需要,因为lombok只在编译期有效,也就是只在xxxx.java文件中有效,在.class文件中无效.打包到Linux中的文件是以jar包形式打包上去,里面包含的都是xxx.class文件. - Mybatis
Mybatis通过@mapper注解管理接口对象,接口是不能直接new出来的,通过反射机制创建出一个实现类对象.核心的原理就是反射,动态代理,在不修改源码的情况下,扩充方法,动态代理的方法.
动态代理的两种方法
1.jdk代理方式
jdk代理要求被代理者必须实现接口,
代理对象根据接口的类型,
通过反射机制创建出来一个实现类对象.
(jdk源码底层实现的),spring容器一般面对接口注入时候,
默认条件下采用JDK动态代理的方式实例化对象
java.util.reflect.proxy包
2.CGLIB的动态代理方式
是JDK代理的一种补充,不管被代理者是否实现接口,
都可以为其创建代理对象,代理的对象是被代理者
的子类
org.springframework.cglib.proxy Enhancer
-
spring
spring容器就是一个Hashmap集合实例化后的数据就存到了Hashmap中<K,V>结构;
什么是Bean?只要被Spring容器管理的对象就叫做Bean.
1.spring内部数据结构:Map理解为容器
key-value结构 key:一般都是类名的首字母小写:hellocontroller
value:一般存储的是经过反射等机制实例化的对象.
Map<hellocontroller,controller对象>
单例:容器中只保存一个对象,由容器管理对象的生命周期,和容器一块消亡.(spring容器默认单例模式)
多例:如果用户需要使用,则 “创建” 一个对象交给用户使用,由用户管理对象的生命周期 -
拦截器和过滤器的区别
1.拦截器只能拦截action请求,过滤器能拦截所有请求;
2.拦截器是spring支持的,过滤器则是依赖于servlet;
3.拦截器基于java反射机制的,过滤器是基于函数的回调;
4.拦截器可以访问action上下文,堆,栈里的对象,但是过滤器不行;
5.在action的生命周期里面,拦截器可以被调用很多次,但是过滤器只能在容器初始化时被调用一次;
6.拦截器可以获取IOC中的Bean,但是过滤器不行,在拦截器注入一个service,可以调用业务逻辑; -
servlet生命周期
servlet生命周期主要分成四个阶段:实例化,初始化,服务,销毁;
当用户请求servlet时候,首先判断有没有servlet对象,若不存在则有web容器创建一个对象,然后调用init()方法对其进行初始化,这个初始化方法在servlet生命周期中只会调用一次,完成servlet对象的实例和初始化之后,web容器会调用servlet对象的service()方法来处理请求;当web容器关闭或者Servlet对象要从web容器中被删除的时候,则会调用destory()方法; -
创建对象有几种方式
<1>通过new创建新的对象
<2>通过反射机制创建对象
<3>采用clone()克隆对象
<4>通过反序列化机制进行创建对象;
public class MyIoc {
//因为提高查询效率,所以用 Arraylist
List<Bean> beans=new ArrayList<>();
Map<String,Object> a=new ConcurrentHashMap<>();
//对象初始化
public MyIoc() throws Exception {
Bean b1 = new Bean("user","cn.tedu.myIoc.User");
Collections.addAll(beans,b1);
init();
}
public void init() throws Exception {
for (Bean b:beans) {
String key=b.getId();
Object value =Class.forName(b.getName()).newInstance();
//比hashmap安全一些
a.put(key,value);
}
}
public Object getBean(String leiming){
return a.get(leiming);
}
}