没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
Spring
Spring 框架的七大模块
Spring Core :框架的最基础部分,提供 IoC 容器,对 bean 进行管理。
Spring Context:继承 BeanFactory,提供上下文信息,扩展出 JNDI、EJB、电子邮件、国
际化等功能。
Spring DAO:提供了 JDBC 的抽象层,还提供了声明性事务管理方法。
Spring ORM:提供了 JPA、JDO、Hibernate、MyBatis 等 ORM 映射层.
Spring AOP:集成了所有 AOP 功能
Spring Web :提供了基础的 Web 开发的上下文信息,现有的 Web 框架,如
JSF、Tapestry、Structs 等,提供了集成
Spring Web MVC :提供了 Web 应用的 Model-View-Controller 全功能实现。
Bean 定义 5 种作用域
singleton (单例) prototype (原型) request session global session
spring ioc 初始化流程?
resource 定位 即寻找用户定义的 bean 资源,由 ResourceLoader 通过统一的接口 Resource
接口来完成 beanDefinition 载入 BeanDefinitionReader 读取、解析 Resource 定位的资源 成
BeanDefinition 载入到 ioc 中(通过 HashMap 进行维护 BD ) BeanDefinition 注册 即向 IOC
容器注册这些 BeanDefinition , 通过 BeanDefinitionRegistery 实现
BeanDefinition 加载流程?
定义 BeanDefinitionReader 解析 xml 的 document BeanDefinitionDocumentReader 解析
document 成 beanDefinition
DI 依赖注入流程? (实例化,处理 Bean 之间的依赖关系)
过程在 Ioc 初始化后,依赖注入的过程是用户第一次向 IoC 容器索要 Bean 时触发
如果设置 lazy-init=true,会在第一次 getBean 的时候才初始化 bean , lazy-
init=false,会容器启动的时候直接初始化(singleton bean);
调用 BeanFactory.getBean()生成 bean 的;
生成 bean 过程运用装饰器模式产生的 bean 都是 beanWrapper(bean 的增强);
依赖注入怎么处理 bean 之间的依赖关系?
其实就是通过在 beanDefinition 载入时,如果 bean 有依赖关系,通过占位符来代替,在调
用 getbean 时候,如果遇到占位符,从 ioc 里获取 bean 注入到本实例来
Bean 的生命周期(bean 的创建过程)?
实例化 Bean:Ioc 容器通过获取 BeanDefinition 对象中的信息进行实例化,实例化
对象被包装在 BeanWrapper 对象中
设置对象属性(DI):通过 BeanWrapper 提供的设置属性的接口完成属性依赖注入;
注入 Aware 接口(BeanFactoryAware , 可以用这个方式来获取其它
Bean,ApplicationContextAware):Spring 会检测该对象是否实现了 xxxAware 接口,
并将相关的 xxxAware 实例注入给 bean
BeanPostProcessor:自定义的处理(分前置处理和后置处理)
执行 InitializingBean 接口的 afterPropertiesSet()方法
<bean init-method =xxx> 执行我们自己定义的初始化方法,调用它配置的 init-
method 方法,还有执行@PostConstruct 注解的方法在,在构造函数之后执行,
()方法之前执行。
使用 bean
执行 DisposableBean 接口的实现类的 destroy()方法
destroy:bean 的销毁
IOC:控制反转:将对象的创建权,由 Spring 管理. DI(依赖注入):在 Spring 创建对象
的过程中,把对象依赖的属性注入到类中。
Spring 的 IOC 注入方式
构造器注入 setter 方法注入 注解注入 接口注入
Spring 的 bean 怎么解决线程安全问题?
1.spring 容器本身没有提供 bean 的线程安全策略,因此,可以说 spring 容器的 bean 不是线
程安全的。
2.如何处理:
针对 spring 的 bean 的作用域,singleton,prototype,request,session,global-session 分别
不同处理:
☐ 对于 作用域,每次都生成新的对象,就不存在线程安全问题
☐ 是单例的,默认是线程不安全,但是对于开发中大部分的 是无状态的,不需要保证
线程安全
【无状态表示中国实力没有属性对象,是不变的类,比如 ,, 是不需要属性对象
的】
【有状态,表示有属性对象,可以保存数据,比如 】
要保证线程安全,可以把 作用域改成 ,比如想 ;另外还有使用
!"# 为每个线程保存一个副本变量,每个线程只操作自己的副本变量。
怎么检测是否存在循环依赖?
Bean 在创建的时候可以给该 Bean 打标,如果递归调用回来发现正在创建中的话,即说明
了循环依赖了。
Spring 如解决 Bean 循环依赖问题?
Spring 中循环依赖场景有:
构造器的循环依赖
属性的循环依赖
singletonObjects:第一级缓存,里面放置的是实例化好的单例对象;
earlySingletonObjects:第二级缓存,里面存放的是提前曝光的单例对象;
singletonFactories:第三级缓存,里面存放的是要被实例化的对象的对象工厂
创建 bean 的时候 Spring 首先从一级缓存 singletonObjects 中获取。如果获取不到,
并且对象正在创建中,就再从二级缓存 earlySingletonObjects 中获取,如果还是获
取不到就从三级缓存 singletonFactories 中取(Bean 调用构造函数进行实例化后,即
使属性还未填充,就可以通过三级缓存向外提前暴露依赖的引用值(提前曝光),
根据对象引用能定位到堆中的对象,其原理是基于 Java 的引用传递),取到后从
三级缓存移动到了二级缓存完全初始化之后将自己放入到一级缓存中供其他使用。
核心代码就在 DefaultSingletonBeanRegistry 的 getSingleton()方法。
Spring 三级缓存取值核心源代码:
因为加入 singletonFactories 三级缓存的前提是执行了构造器,所以构造器的循环依
赖没法解决。
构造器循环依赖解决办法:在构造函数中使用@Lazy 注解延迟加载。在注入依赖
时,先注入代理对象,当首次使用时再创建对象说明:一种互斥的关系而非层次递
进的关系,故称为三个 Map 而非三级缓存的缘由 完成注入;
Spring 中使用了哪些设计模式?
工厂模式:spring 中的 BeanFactory 就是简单工厂模式的体现,根据传入唯一的标
识来获得 bean 对象;
单例模式:提供了全局的访问点 BeanFactory;
代理模式:AOP 功能的原理就使用代理模式(1、JDK 动态代理。2、CGLib 字节
码生成技术代理。)
装饰器模式:依赖注入就需要使用 BeanWrapper;
观察者模式:spring 中 Observer 模式常用的地方是 listener 的实现。如
ApplicationListener。
策略模式:Bean 的实例化的时候决定采用何种方式初始化 bean 实例(反射或者
CGLIB 动态字节码生成)
AOP 核心概念
1、切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象
2、横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。
3、连接点(joinpoint ):被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在
Spring 中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。
4、切入点(pointcut):对连接点进行拦截的定义
5、通知(advice):所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前
置、后置、异常、最终、环绕通知五类。
6、目标对象:代理的目标对象
7、织入(weave):将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加方
法或字段。
解释一下 AOP
传统 oop 开发代码逻辑自上而下的,这个过程中会产生一些横切性问题,这些问题与我们
主业务逻辑关系不大,会散落在代码的各个地方,造成难以维护,aop 思想就是把业务逻
辑与横切的问题进行分离,达到解耦的目的,提高代码重用性和开发效率;
AOP 主要应用场景有:
记录日志
监控性能
权限控制
事务管理
AOP 源码分析
@EnableAspectJAutoProxy 给容器(beanFactory)中注册一个
AnnotationAwareAspectJAutoProxyCreator 对象;
AnnotationAwareAspectJAutoProxyCreator 对目标对象进行代理对象的创建,对象内
部,是封装 JDK 和 CGlib 两个技术,实现动态代理对象创建的(创建代理对象过
程中,会先创建一个代理工厂,获取到所有的增强器(通知方法),将这些增强器
和目标类注入代理工厂,再用代理工厂创建对象);
代理对象执行目标方法,得到目标方法的拦截器链,利用拦截器的链式机制,依次
进入每一个拦截器进行执行
AOP 应用场景
日志记录
事务管理,多数据源切换管理
线程池关闭等
AOP 使用哪种动态代理?
当 bean 的是实现中存在接口或者是 Proxy 的子类,---jdk 动态代理;不存在接口,
spring 会采用 CGLIB 来生成代理对象;
JDK 动态代理主要涉及到 java.lang.reflect 包中的两个类:Proxy 和
InvocationHandler。
Proxy 利用 InvocationHandler (定义横切逻辑) 接口动态创建 目标类的代理对象。
jdk 动态代理
通过 bind 方法建立代理与真实对象关系,通过 Proxy.newProxyInstance(target)生
成代理对象
代理对象通过反射 invoke 方法实现调用真实对象的方法
动态代理与静态代理区别
静态代理,程序运行前代理类的.class 文件就存在了;
动态代理:在程序运行时利用反射动态创建代理对象<复用性,易用性,更加集中
都调用 invoke>
CGLIB 与 JDK 动态代理区别
Jdk 必须提供接口才能使用;
Cglib 不需要,只要一个非抽象类就能实现动态代理
Spring 是如何处理事务的?
支持编程式和声明式 种事务管理方式
编程事务可以使用 !$! 对象
声明式事务可使用%!$ 注解,只能针对方法级别。
SpringMVC
springMVC 流程:
(1):用户请求发送给 DispatcherServlet,DispatcherServlet 调用 HandlerMapping 处理器
映射器;
(2):HandlerMapping 根据 xml 或注解找到对应的处理器,生成处理器对象返回给
DispatcherServlet;
(3):DispatcherServlet 会调用相应的 HandlerAdapter;
(4):HandlerAdapter 经过适配调用具体的处理器去处理请求,生成 ModelAndView 返回
给 DispatcherServlet
(5):DispatcherServlet 将 ModelAndView 传给 ViewReslover 解析生成 View 返回给
DispatcherServlet;
(6):DispatcherServlet 根据 View 进行渲染视图;
->DispatcherServlet->HandlerMapping->Handler ->DispatcherServlet->HandlerAdapter 处理
handler->ModelAndView ->DispatcherServlet->ModelAndView->ViewReslover->View -
>DispatcherServlet->返回给客户
安全验证篇
什么是认证和授权,如何设计一个权限验证框架?
认证:就是对系统访问者的身份进行确认。用户密码、二维码登录,收集短信、指纹、刷脸等
授权:就是对系统访问者的行为进行控制。通常是在认证后,对 系统内部用户的隐私数据进行保护,
后台接口访问权限、前台控件的访问权限。
&'( 模型:主体》角色》资源》访问系统的行为
Cookie 和 Session 有啥区别,没有 cookie,session 还能进行身份验证吗
、当服务器 第一次接收到客户端的请求时,会开辟一块独立的 空间,建立一个
对象,同时会生成一个 ),通过响应头的方式保存到客户端浏览器的 * 当中,以
后客户端的每次请求,都会在请求头部带上这个 ),这样就可以对应上服务端的一些会话的相
关信息,比如用户的登录状态。
、如果没有客户端的 *, 是无法进行身份验证的。
、当服务端从单体应用升级为分布式后,*+ 这种机制要怎么扩展?
黏贴:在负载均衡中,通过一个机制保障同一个客户端的所有请求都转发到一个
实例。缺点是当这个 实例出现问题,请求就会被转发到其他实例,这时候用户
的 就丢了。
复制:当一个 实例上保存了 后,主动将这个 复制到集群的其他
剩余63页未读,继续阅读
jcgaogs
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0