1.简单介绍一下Spring
Spring是一个开源框架,主要目的是简化企业开发!它的核心部分为IOC(控制反转)和Aop(面向切面编程);使用Spring可以降低各个组件间的耦合度,他对主流的应用框架如:SpringMvc、MyBatis、Strtus2等提供了很好的集成,简化了开发步骤。
2.理解IOC和AOP
1.IOC:控制反转,将原本手动new 对象的权力交给Spring工厂,由Spring工厂来负责实例化对象以及维护对象与对象之间的依赖关系。
2.AOP:在原本的OOP编程中,不可避免会有很多重复代码,或者代码与代码之间的强耦合性,SpringAOP很好的解决了这样的问题,他使用动态代理,动态获取目标类对象,反射执行方法,为目标方法提供了一个可拔插的选项,避免了代码冗余和代码与代码之间的强耦合。
3.你了解动态代理吗
再Spring中实施了两种代理模式,即Cglib和jdk代理模式。
1.JDK代理:JDK的动态代理必须指定接口,这些接口都是已经被代理对象实现了的
2.CGLIB代理:CGLIB代理不需要指定接口
4.JDK动态代理的实现方式
基于JDK的动态代理需要实现InvocationHandler接口,通过类加载器
Class.ClassLocald()
,获取类对象,反射invoke()执行目标方法,缺点是只能基于接口进行代理
5.CGLIB动态代理的实现思路
基于CGLIB动态代理的方式,方法需要实现MethodInterceptor接口,覆盖intercept方法,通过参数methodProxy的methodProxy.invokeSuper(Object methodName,Object[] args)方法执行方法;他可以不用依赖于接口执行:
缺点:他不能代理find方法
6.SpringBean工厂的实例化步骤
1.加载配置文件或者配置类
(重点)
2.通过BeanID找到类的全限定名,反射加载对象
(重点)
3.判断对象是否设置为了单例模式,如果是单例模式直接返回
(重点)
4.执行依赖检查,防止循环依赖
5.如果存在依赖对象(注入对象),则进行递归创建,反射赋值到对应的属性上。
6.返回Bean实例
7.什么是单例模式
他是一种设计模式,一个类只有一个实例,能够自行初始化,并且向系统提供全局的访问接口
8.单例模式实现原理
单例模式比较流行的分为懒汉式和饿汉式
8.1 :单例模式懒汉式速记
首先先私有化无参构造防止外部手动实例化!
突出一个懒字,每一次用的时候才会去判断是不是为null,为null就创建对象,不为null就直接返回,不用就不判断!懒
package com.singlecase; import org.apache.poi.ss.formula.functions.T; /** * 传说中的懒汉式单例 * 每一次等到用的时候才会判断它是否已经实例化了 所以说它懒啊 * @author 皇甫 */ public class LazySingleCase { private static LazySingleCase lazySingleCase; /** * 私有化构造函数 不让用户手动创建只能被动获取 */ private LazySingleCase(){} /** * 提供返回对象的方法 * @return */ public static LazySingleCase getInstance() throws InterruptedException { //用的时候才会去判断是不是为null if(lazySingleCase == null){ lazySingleCase = new LazySingleCase(); } return lazySingleCase; } }
8.2:单例模式饿汉式速记
设置私有的静态的成员对象,JVM保证,静态属性只被加载一次
首先先私有化无参构造防止外部手动实例化!
重点突出一个饿字,不管你能不能使用,我都会创建对象,static特点;因为饿,所以看见就吃,不管好 不好吃,因为饿,所以看见就创建不管用不用的上!
package com.singlecase; /** * 饿汉式单例模式 * @author 皇甫 */ public class HungryChineseSingleCase { /** * 静态成员变量 */ private static HungryChineseSingleCase hungryChineseSingleCase = new HungryChineseSingleCase(); private HungryChineseSingleCase(){} /** * 直接返回实例 * @return */ public static HungryChineseSingleCase getInstance(){ return hungryChineseSingleCase; } }
9.单例模式的懒汉式和饿汉式的优缺点
懒汉式 :节省空间,但是线程不安全
饿汉式:线程安全,但是不节省空间
10.简单描述一下SpringMVC的执行流程
首先需要了解一点,再SpringMVC容器进行初始化的时候,会遍历所有的带有
@Controller的类
,将类里面的方法与@RequestMapping("xxxxx")
的值做Map映射Map<String,Method>
,比如@Controller public class userController{ @RequestMapping("/user/findAll") public List<User> findAllUser(){ return new ArrayList<User>(); } }
模拟以上方法,它在容器初始化时Map映射为**("/user/findAll"---------->findAllUser)**
执行步骤如下:
1.客户端发送请求被DispathcherServlet拦截,发送给处理映射器(Handler Mapping),会根据url查询Map集合,返回Method对象,返回给DispathcherServlet
2.DispathcherServlet将方法对象给处理器映射器(Handler Adapter),执行Method.invoke()方法,返回ModeAndView给处理器映射器(Handler Adapter),再次将ModeAndView返回给DispathcherServlet
3.DispathcherServlet将试图对象(ModeAndView)传递给视图解析器(view Resolver),返回视图信息给DispathcherServlet
4…DispathcherServlet将视图信息返回给客户端
喜欢这篇文章的小伙伴,请识别下方二维码关注本公众号,小编不定期赠送免费的学习资源哦
关注公众号,我会不定期赠送各种java学习资源
下面是我的个人微信号,欢迎叨扰!