Spring
1.Spring是什么?
Spring框架是一个企业级开发应用框架,它是一个容器框架,用来装javabaen(java对象),提供了功能强大的IOC、AOP及Web服务功能。
1.1 Spring 是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架
- 通过控制反转技术达到松耦合的目的。
- 提供面向切面的编程,允许通过分离应用的业务逻辑与系统服务进行内聚性开发。
- 包含并管理应用对象(Bean)的配置和生命周期,这个意义是一个容器。
- 将简单的组件,组合成复杂的应用,这个意义上是一个框架。
2. 谈谈你对AOP(面向切面编程)的理解
系统是由不同的组件组成的,每一个组件各负责一块特定的功能。但是,这些组件除了实现自身核心的功能之外,还经常承担着额外的职责,例如:日志,事务管理,和安全。当分散的引入对象公共行为的时候,面向对象就显得无能为力了,面向对象适用于上下逻辑,而不适合左右逻辑。可以考虑将程序中这样的服务封装成一个切面,然后注入到具体业务逻辑中去,AOP技术就是解决这个问题,AOP可以对某个对象或则某些对象功能进行增强。比如对象中的方法进行增强,可以在执行某个方法之前额外的做一些事情,在某个方法执行之后额外的做一些事情。
2.1 AOP中概念通知、切点、切面
- 通知、增强处理(Advice):就是想要添加的功能,比如安全、事务、日志等,先给定义好,然后在想用的地方用一下。
- 连接点(Advice):Spring允许通知的地方,和方法有关的前前后后都是连接点。
- 切入点(Pointcut):在连接点的基础上,来定义切入点,你的一个类里面,有15个方法,那就是十几个连接点,但是并不想每个方法都使用通知(使用通知叫织入),你只是想让其中几个,在调用这几个方法之前、之后或者抛出异常时干点什么,那么就用切入点来定义这几个方法,让切点来筛选连接点,选中你想要的方法。
- 切面:切面就是通知和切入点的集合。
- 织入:把切面应用到目标对象来创建新的代理对象的过程。
2.2 如何注入到具体业务逻辑中去
3.谈谈你对IOC(控制反转)的理解
IOC容器实际上就是一个map(ke y,value),里面存的是各种对象(在XML里配置的bean节点,@repository,@service,@controller@component),在项目启动的时候会读取配置文件里面的bean节点,根据全限定类名使用反射创建对象放到map里。以SpringBoot为例:@EnableAutoConfiguration:有两个注解,第一@AutoConfigurationPackage,使用@Import导入AutoConfigurationPackages.Registrar.class类,实际上是手工注册bean,注册扫描包路径到全局变量,提供查询。第二:使用@Import注解导入一个AutoConfigurationImportSelector.class类,这个类当中的一个selectImports方法返回一个字符串数组,里面放的是类的全路径。Spring在读到这些类的全路径时候,会通过反射的方式加载生成对象放到IOC容器中。
这个时候map里就有各种对象了,接下来我们在代码里可以通过(@autowired,@resource等注解)进行依赖注入,就可以使用里面的对象。例如:本来A依赖B的,现在有了IOC,我们把A,和B都注入到IOC容器中,当A需要用到B的时候,由IOC主动注入。
@Resource和@Autowired注解都是用来实现依赖注入的。只是@Autowried按by type(class)自动注入,而@Resource默认按byName(id)自动注入。
IOC(控制反转):
在没有引入IOC容器之前,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B,或者使用已经创建的对象B,控制权都在自己手中。
引入IOC容器之后,对象A与对象B之间失去了直接联系,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要用的地方。
通过前后对比,不难看出来:对象A获得依赖对象B的过程,由主动行为变成了被动行为,控制权颠倒过来,这就控制反转。
依赖注入:
依赖注入是实现IOC的方法,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象中。
4.拦截器与过滤器之间有哪些区别?
相同点:拦截器与过滤器都是基于Aop技术,对方法实现增强,都可以拦截请求方法。
不同点:
- 过滤器属于Servlet自己研发的,而拦截器技术属于SpringMVC自己研发的。
- 过滤器属于拦截Web请求的,而拦截器不仅可以拦截请求还可以拦截普通方法。
- 过滤器会比拦截器先执行,拦截器封装的方法比过滤器拦截使用起来更加简单。
实际开发中绝大多数情况下,都会使用拦截器。
拦截器:权限控制,日志打印,参数验证,会话。
过滤器应用场景:编码转换,跨域解决,xss攻击。
过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。
log4j日志隔离级别
log4j提供了4种日志级别和2个日志开关。
官方网址: http://logging.apache.org/log4j/1.2/
DEBUG:输出调试信息;指出细粒度信息事件对调试应用程序是非常有帮助的。
INFO: 输出提示信息;消息在粗粒度级别上突出强调应用程序的运行过程。
WARN: 输出警告信息;表明会出现潜在错误的情形。
ERROR:输出错误信息;指出虽然发生错误事件,但仍然不影响系统的继续运行。
FATAL: 输出致命错误;指出每个严重的错误事件将会导致应用程序的退出。
ALL level:打开所有日志记录开关;是最低等级的,用于打开所有日志记录。
OFF level:关闭所有日志记录开关;是最高等级的,用于关闭所有日志记录。
按照范围从小到大排序:OFF level > FATAL > ERROR > WARN > INFO > DEBUG > ALL level;范围大的会包含范围小的,例如日志设置为INFO级别的话则FATAL、ERROR、WARN、INFO的日志开关都是打开的,而DEBUG的日志开关将是关闭的。
Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。