Spring小知识

一、spring

1.什么是spring
  • spring是一个轻量级,非侵入式,IOCAOP一站式开发框架
    • 轻量级:
      • jar小,运行资源少,运行效率高
    • 非侵入式:
      • 业务类不能继承spring特性的类
    • IOC:
      • 由spring IOC容器管理对象,面向接口式编程,耦合度降低
    • AOP:
      • 方便切面编程
    • 一站式框架
  • 目的:
    • 简化企业级应用程序开发,降低模块间的耦合度
2.spring有哪些模块

spring模块图

  • 1 test测试模块
  • 2 核心模块Core Container
  • 3 AOP(切面编程)
  • 4 DAO
  • 5 WEB
3.核心模块Core Container:
  • 管理Beans,Spring核心,配置文件,SPEL表达
  • IOC
    • 控制反转:将程序中生成对象控制权反转给了spring框架(容器)
    • 单例Bean:在spring启动时创建,只有**一个,**程序关闭时销毁
    • 原型的:每次使用时创建,不在使用时,垃圾回收
  • DI
    • 依赖注入 创建对象时,向对象属性注入值
      • 构造方法注入
      • set方法注入
      • xml函数注入< bean >
      • 注解方式实现 : byName,byType
        • @Resource(name = “userDao”) jdk自带的 根据bean的名称查找
        • @Autowired(required = true) spring的 根据属性类型查找
        • UserDao userdao 只需要声明,运行时spring会帮我们的
4.AOP(切面编程)
  • AOP框架Aspects
  • AOP使用代理的思路就是让别人代理我们去做某些事情,
    • 添加新的功能时,不需要修改源代码
    • 新功能,都是一个公共的,与业务关系不大,让代理对象去调用
    • 连接点(joiinpoint): 类中可以被增强的方法,此方法被称为连接点
      • 可以添加额外的功能
    • 切入点: 实际被增强的方法
    • 通知: 连接点要做的事情
      • 五种类型: 前置通知,后置通知,环绕通知,异常通知,最终通知
    • 切面: 把通知加入的过程
    • 目标: 原增强的类(实际的执行者)
    • 代理: 配置装有通知的类
  • 面向切面的好处就是减少重复,专注业务
5.DAO
  • jdbc管理,事务管理,ORM
  • JDBC
    • 数据库连接管理事务
      • 编程式事务(手动进行事务的提交)
      • 声明式事务(使用)只需要添加事务标签声明(出现异常自动回滚,没有异常提交事务 )
    • 事务的特征,事务的隔离级别
      • 原子性 要么都成功,要么都失败
      • 隔离性
      • 持久性
      • 一致性
    • 事务的传播行为(spring自动代理功能) 7种传播行为(A调用B)
      • required必须
        • A有事务,B加入事务 A没有事务,B自己创建事务
      • supports支持
        • A有事务,B加入事务,A没有事务,B也就没有事务
      • requirenew独立
        • 无论A是否有事务,B都会创建一个新的独立的事务
    • 传播行为失效
      • 调用本类中的方法
      • 方法必须是public
      • 传播行为的使用不当
      • try catch后也会失效
      • 数据库引擎不支持事务
6.WEB
  • mvc运行流程
  • 1 浏览器发起请求
    • 被前端请求分发器(DispacherServlet)拦截
  • 2 DispacherServlet调用HandlerMapping(映射处理器)找到处理器(控制台)
    • 将解析的结果返回给DispacherServlet
    • 若配置了拦截器,还会调用拦截器
  • 3 DispacherServlet调用对应的控制器
    • 在到达控制器之前,会先进入HandlerAdopter(处理适配器)进行参数的封装和数据类型的转换
  • 4 最终到我们自己写的控制器中,接受,处理数据
    • 返回ModelAndView(包含视图名,数据)
    • 返回DispacherServlet
  • 5 DispacherServlet将结果交给视图解析器找到对应的jsp文件
  • 6 把Model(数据)交给你view(jsp)
  • 7 在由jsp做出最后的响应
7. BeanFactory和ApplicationContext
  • 都是Spring的接口
  • BeanFactory是框架中最基础的接口,
    • 定义了获取bean判断等功能
    • spring要生成并管理对象,底层使用的是工厂模式
    • ApplicationContext也继承了BeanFactory接口
  • 区别:
    • BeanFactory是最顶层的接口,里面只是基础的功能定义
    • ApplicationContext继承了BeanFactory,并扩展了功能
    • 使用ApplicationContext实现在spring启动时,创建了单例Bean
    • 使用BeanFactory实现在spring启动时,不会创建单例Bean
8.spring Bean的生命周期
  • spring框架创建出来的对象与我们自己new的对象是不同的
  • 在触发创建Bean的整个过程
    • 1 实例化Insnstantiation就是new,创建一个原始对象
    • 2 属性赋值populate,给属性注入值
    • 3 初始化Initalization,初始化Bean,根据我们的配置为Bean添加额外的功能
      • 如果 Bean 实现 BeanNameAware 执行 setBeanName
      • 如果 Bean 实现 BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext 对象.
      • 初始化
      • 如果存在类实现 BeanPostProcessor(AOP) ,执行postProcessBeforeInitialization
      • 如果 Bean 实现 InitializingBean 执行 afterPropertiesSet如果配置了自己的初始化方法
      • 如果存在类实现 BeanPostProcessor(AOP) ,执行
        postProcessAfterInitialization
    • 4 将Bean对象放入容器中使用
    • 5 销毁Destruction

img

img

9.spring Bean是线程安全嘛
  • 单例的 不是安全的
  • 原型的 是线程安全 创建多个对象,每个对象中都包含一份成员变量
LoginController{//使用ThreadLocal存储count, 每个线程中都会复制一份成员变量, 线程独自使用int count=1;//单例的  count还有一份   count存储了一个数据,是有状态的 是不安全的LoginService  loginService; // 无状态的   安全的.//多个线程访问test()public  void test(){int num = 0;//局部变量不存在线程安全问题
​           count++;
​           num++;System.out.print(count)
   }
}
  • 如上述java所示
    • 当多个线程访问test()方法时,
    • A线程访问test()方法时,count++, count变成了2,num++,num变成了1
    • B线程访问,count++, count变成了3,num++,num变成了1
    • 可得count是不安全的,但每次进入test()时num都固定为0,即num是安全的
  • 综上得
    • 单例bean是线程不安全的,
    • 又分为有状态的 存储数据如: count=1;
    • 无状态的 如: num=0; LoginService loginService ; 只是调用方法,不存在数据共享.是安全的
  • 总结:
    • 单例bean有状态的线程不安全
    • 单例bean无状态的线程安全
    • 原型的是线程安全
10.Spring Bean 循环依赖
class A{B  b=null;
}
class B{A a = null;
}
A a = new A();
B b = new B();
a.b=b;
b.a =a;
  • 如上述代码
    • 在java中,访问A类创建A对象,此时A中的b为空,
    • 在访问B类创建B对象,此时B中的a为空,
    • 在将b赋给a类的b,
    • 在将a赋给b类的a.形成依赖关系
  • eg:
    • 人使用手机,人类,手机类,每个人对应一个手机,每个手机对应一个人
    • 手机与人形成依赖
    • 简单说,就是A对象依赖了B对象,B对象依赖了A对象.
  • 如果不考虑Spring,循环依赖并不是问题,因为对象之间相互依赖是很正常的事情
  • 但是在Spring中自动注入时会发生循环依赖的问题,
    • 在Spring Bean的生命周期的过程中,创建原始对象,属性注入值(注入时默认值不能为空)
  • 解决:
    • 提供了3个级别缓存,来存储不同阶段对象
    • 一级缓存:实例化,注入,初始化完成的Bean
    • 二级缓存:实例化的半成品Bean
    • 三级缓存:添加有代理(AOP)功能的Bean
      • A创建原始对象—缓存起来
      • 依赖B—创建B原始对象缓存起来
      • 注入A,从缓存中查找半成品A
      • B初始化,
      • 把B从缓存中拿到赋给A和B.
        缓存

二、Spring Boot

  • 在SSM基础上
    • IOC控制反转
    • AOP面向切面
  • Spring缺点:
    • 大量模板配置文件
    • 项目依赖 一旦选错依赖的版本,随之而来的不兼容问题,就会严重阻碍项目的开发进度
  • SpringBoot
    • 基于约定优于配置的思想
    • 目的:简化应用的初始搭配以及开发过程
    • 核心:起步依赖,自动配置

三、前后端分离

1.核心思想
  • 前端html页面通过ajax调用后端的restful(controller)api接口并使用json数据进行交互
2.前后端分离的优势
  • 前后端的解耦,前端进行页面跳转
  • 发现bug可快速查到准确位置,页面问题一定是前端的
  • 减轻后端服务器的压力
  • 即使后端服务暂时超时或者宕机,前端页面也会正常访问,只不过获得不到数据
  • 若也有app相关服务,只需通过代码重构,共用接口,提升效率(多端应用)
  • 异步加载,边走边加载
  • 不重启服务器
  • 增强代码的维护性,易读性
  • 提升开发效率,前后端并行开发,不像以前的强依赖,分工更明确
  • 更安全,加密了,更部署数字证书
  • 组件代码可以复用
3.MVC后端架构

mvc和mvvm

  • MVC
    • MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。
      • 这种模式用于应用程序的分层开发。
    • Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
    • View(视图) - 视图代表模型包含的数据的可视化。
    • Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开
  • MVVM
    • MVVM 模式代表 Model-View-View-Model(模型-视图-视图-模型) 模式
      • 我们以前都是将数据渲染到dom,
      • 而现在我们可以实现数据到dom,dom到数据的双向绑定
      • 前后端数据全部通过AJAX和JSON访问
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值