Spring
优点
- 降低了组件之间的耦合性 ,实现了软件各层之间的解耦
- 可以使用容易提供的众多服务,如事务管理,消息服务等
- 容器提供单例模式支持
- 容器提供了 AOP 技术,利用它很容易实现如权限拦截,运行期监控等功能
- 容器提供了众多的辅助类,能加快应用的开发
6.spring 对于主流的应用框架提供了集成支持,如 hibernate,JPA,Struts 等
7.spring 属于低侵入式设计,代码的污染极低 - 独立于各种应用服务器
9.spring 的 DI 机制降低了业务对象替换的复杂性
10.Spring 的高度开放性,并不强制应用完全依赖于 Spring,开发者可以自由选择 spring 的部分或全部
Spring IoC⭐
IoC
IoC 控制反转,把对象创建、依赖反转给容器实现,需要创建一个容器和一种描述让容器知道对象间的依赖关系,Spring 通过 IoC 容器管理对象及其依赖关系。IoC 的主要实现方式是 DI,对象不是从容器中查找依赖的类,而是容器实例化对象时主动为它注入依赖的类。
IoC 叫控制反转,DI 叫依赖注入。
- 控制反转就是对组件对象控制权的转移,从程序代码本身转移到了外部容器,由容器来创建对象并管理对象之间的依赖关系。
- 依赖注入的基本原则是应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由容器负责,查找资源的逻辑应该从应用组件的代码中抽取出来,交给容器来完成。DI 是对 IoC 更准确的描述,即组件之间的依赖关系由容器在运行期决定,即由容器动态的将某种依赖关系注入到组件之中。
DI
实现
- 构造方法注入
IoC 容器会检查对象的构造方法,取得它的依赖对象列表,当对象实例化完成时依赖的属性也会成功注入,可以直接使用。缺点是当依赖对象较多时,可能需要多个构造方法。 - setter 方法注入
只需要为依赖对象的属性添加 setter 方法,在描述性上要比构造方法注入强,缺点是无法在对象构造完成后就进入就绪状态。IoC 容器会先实例化 Bean 对象,然后通过反射调用 setter 方法注入属性。 - 注解注入
@Autowired:自动按类型注入,如果有多个匹配则按照指定 Bean 的 id 查找,需要搭配 @Qualifier。
@Resource :按照 Bean 的 id 注入,如果找不到则会按类型注入。
@Value :用于注入基本数据类型和 String。
动态代理
- 动态代理可以随时为任意的委托类进行代理,并可以在 InvocationHandler#invoke 拿到运行时的信息,并可以做一些切面处理。
- 在动态代理背后,其实是为一个委托类动态生成了一个 Proxy.class 的代理类,该代理类会实现委托类的接口,并把接口调用转发到 InvocationHandler#invoke 上,最终调用到真实委托类的对应方法。
- 动态代理机制把委托类和代理类进行了隔离,提高了扩展性。
Spring AOP ⭐
AOP
- 对于面向对象编程的语言来说,当需要为部分对象引入公共部分的时候,就会引入大量的重复代码【这些代码我们可以称之为横切代码】。
- AOP 面向切面编程就是解决这个问题的,可以将代码中重复的部分抽取出来,使用动态代理技术,在不修改源码的基础上对方法进行增强。
- 使用 AOP 便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
- 如果目标对象实现了接口,默认采用 JDK 动态代理,也可以强制使用 CGLib;如果目标对象没有实现接口,采用 CGLib 的方式。
- 常用场景包括权限认证、自动缓存、错误处理、日志、调试和事务等。
使用案例:JDBCTemplate 连接数据库以及声明事务,在具体的方法上使用 @Transactional 注解开启事务。SLF4J日志注释。
相关注解
@Aspect:声明被注解的类是一个切面 Bean。
@Before:前置通知,指在某个连接点之前执行的通知。
@After:后置通知,指某个连接点退出时执行的通知(不论正常返回还是异常退出)。
@AfterReturning:返回后通知,指某连接点正常完成之后执行的通知,返回值使用 returning 属性接收。
@AfterThrowing:异常通知,指方法异常退出时执行的通知,和 @AfterReturning 只会有一个执行,异常使用 throwing 属性接收。
JDBC 连接过程
- 加载驱动: 这通过 java.lang.Class 类的静态方法 forName(String className) 实现。
- 创建数据库的连接:使用 DriverManager 的 getConnection(String url , String username , String password ) 方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得一个 Connection 对象
- 创建一个 Statement 对象:静态 SQL 语句,Statement;动态 SQL 语句,PreparedStatement;数据库存储过程,CallableStatement。
- 执行 SQL 语句
- 遍历结果集
- 关闭 JDBC 对象资源
- 在这个过程中,需要处理异常
👆是单例,不是线程安全
上上图中的count变量在单例bean中就是不安全的。
@Transactional表示为事务,如果自己try catch 异常了那么系统默认你自己处理了异常,就不会进行全部执行和回滚。 解决后代码👇
aware接口有什么用,什么情况下要去自己实现.
JDK动态代理和CGLIB动态代理
上能解决普通的循环对象,a如果是代理对象就不能解决该问题(没搞懂哦)。
上能解决代理对象出现的问题。
上能解决不用@Autowired注解而产生的循环依赖的问题, 用@Lazy慢加载.
Spring MVC ⭐
- Spring MVC 是一个基于 MVC 架构的用来简化 web 应用程序开发的应用开发框架
处理流程
Web 容器启动时初始化 IoC 容器,加载 Bean 的定义信息并初始化所有单例 Bean,遍历容器中的 Bean,获取每个 Controller 中的所有方法访问的 URL,将 URL 和对应的 Controller 保存到一个 Map 集合中。
所有的请求会转发给 DispatcherServlet 处理,DispatcherServlet 会请求 HandlerMapping 找出容器中被 @Controler 修饰的 Bean 以及被 @RequestMapping 修饰的方法和类,生成 Handler 和 HandlerInterceptor 并以一个 HandlerExcutionChain 链的形式返回。
DispatcherServlet 使用 Handler 找到对应的 HandlerApapter,通过 HandlerApapter 调用 Handler 的方法,将请求参数绑定到方法的形参上,执行方法处理请求并得到逻辑视图 ModelAndView。
使用 ViewResolver 解析 ModelAndView 得到物理视图 View,进行视图渲染,将数据填充到视图中并返回给客户端。
组件
- DispatcherServlet:前端控制器,整个流程控制的核心,负责接收请求并转发给对应的处理组件。
- Handler:处理器,完成具体业务逻辑。
- HandlerMapping:处理器映射器,完成 URL 到 Controller 映射。
- HandlerInterceptor:处理器拦截器,如果需要完成拦截处理可以实现该接口。
- HandlerExecutionChain:处理器执行链,包括 Handler 和 HandlerInterceptor。
- HandlerAdapter:处理器适配器,DispatcherServlet 通过 HandlerAdapter 来执行不同的 Handler。
- ModelAndView:逻辑视图,装载模型数据信息。
- ViewResolver:视图解析器,将逻辑视图解析为物理视图。
相关注解
- @RequtestMapping:将 URL 请求和方法映射起来,在类和方法定义上都可以添加。value 属性指定 URL 请求的地址。method 属性限制请求类型,如果没有使用指定方法请求 URL,会报 405 错误。params 属性限制必须提供的参数。
- @RequestParam:如果 Controller 方法的形参和 URL 参数名不一致可以使用该注解绑定。value 属性表示 HTTP 请求中的参数名,required 属性设置参数是否必要,默认 false。defaultValue 属性指定没有给参数赋值时的默认值。
- @PathVariable:Spring MVC 支持 RESTful 风格 URL,通过 @PathVariable 完成参数绑定。
SpringBoot⭐
优点
- 简化开发:它的作用就是快速搭建 Spring 框架。
- 简化配置:比如要创建一个 web 项目,在使用 Spring 的时候,需要在 pom 文件中添加多个依赖,而在 SpringBoot 中只需要添加一个 starter-web 依赖即可。
- 简化部署:使用 Spring 时需要部署 tomcat,然后把项目打成 war 包。而 SpringBoot 内嵌了 tomcat,只需要将项目打成 jar 包即可。
注解 - @SpringBootApplication:自动给程序进行必要配置,这个配置等同于:@Configuration ,@EnableAutoConfiguration 和 @ComponentScan 三个配置。
- @EnableAutoConfiguration:允许 SpringBoot 自动配置注解,开启后 SpringBoot 就能根据当前类路径下的包或者类来配置 Bean。
- @SpringBootConfiguration:相当于 @Configuration,只是语义不同。
Spring, Spring MVC 和 Spring Boot 区别
- Spring MVC 和 Spring Boot 都属于 Spring,Spring MVC 是基于 Spring 的一个 MVC 框架,而 Spring Boot 是基于 Spring 的一套快速开发整合包
- Spring 就像一个大家族,有众多衍生产品例如 Boot,Security,JPA 等等。但他们的基础都是 Spring 的 IOC 和 AOP,IOC 提供了依赖注入的容器,而 AOP 解决了面向切面的编程,然后在此两者的基础上实现了其他衍生产品的高级功能;Spring MVC 是基于 Servlet 的一个 MVC 框架,主要解决 WEB 开发的问题,因为 Spring 的配置非常复杂,各种 xml,properties 处理起来比较繁琐。于是为了简化开发者的使用,Spring 社区创造性地推出了 Spring Boot,它遵循约定优于配置,极大降低了 Spring 使用门槛,但又不失 Spring 原本灵活强大的功能。
有fetchType="lazy"的情况就是懒加载,不调用就不加载。
没有="lazy"的情况就不是懒加载。
懒加载—对象属性不在java代码中查询的情况下,其对象不在数据库中查询。
在mybatis中设置 lazyLoadingEnabled 也能实现延迟加载
二级缓存能让👆两次sql查询变成一次sql查询。