Spring
Spring作为我项目开发中接触到的第一个框架,发展至今已经可以说是java最主流的框架了,没有之一.其强大之处可见.
Spring是一个轻量级Java开发框架,
Ioc容器的依赖注入机制方便解耦,降低代码污染,
支持AOP切面编程,
对各种优秀框架提供了集成支持,简化开发,提高开发效率。
目录
BeanFactory 和 ApplicationContext 区别:
Spring Bean 的生命周期(@Scope注解/xml属性scope="prototype"):
Spring 的事件类型(ApplicationListener监听器 ):
Spring 3个核心组件:
Beans:Spring管理的对象
Context : 用于建立和维护bean对象之间的关系(即 Ioc 容器)
Core:Spring框架基本的核心工具类
Spring AOP:
1.和OOP 面向对象编程不同,aop面向切面编程通过封装可以作用于多个对象的公共行为和逻辑,弥补了oop的缺点,减少代码冗余,降低耦合度。
2.springaop是通过动态代理来实现的,不需要修改字节码文件,而是在程序运行时,创建aop对象,里面包含了对象的所有方法与增强处理。
3.oop+aop的编程模式更有利于提高效率。
Spring Aop结构/组成部分:
1.切面(Aspect):被抽取的公共模块,表示切入点与通知的结合关系@AspectJ注解
2.连接点(Join point):aop对象种的所有方法
3.切入点(Pointcut):需要增强的方法,可用切入点表达式(如:* *..*.*())进行类的拦截@Pointcut
4.通知(Advice):切入点中的增强操作(环绕通知@Around:是另外4种通知的综合/前置@Before
,后置@AfterReturning ,异常@AfterThrowing,最终通知@After)
5.目标对象(Target Object):得到aop增强的对象也称为被代理对象(proxied Object)
6.织入(weaving):连接点成为切入点的过程
Spring IoC :
IOC 就是控制反转,spring两大核心容器ioc容器和aop容器,ioc是将对象交由spring来集中管理成为bean对象,简单地说就是当我们需要用到一个bean对象时不再需要new关键字,而是通过依赖注入方式来,实现了对象之间的解耦,
BeanFactory 和 ApplicationContext 区别:
是 Spring 的两大核心接口和容器,
- BeanFactory用于管理bean对象,是bean集合工厂类,ApplicationContext 是 BeanFactory 的子接口, 扩展了功能:支持国际化,统一的资源文件访问方式,在监听器注册bean事件。
- BeanFactory采用懒加载方式注入Bean,对象使用时才会实例化,实例化后才知道有没有错误, ApplicationContext是容器启动后预加载所有bean对象,只要有错误则在容器一启动就能马上知道。
- ApplicationContext一次性加载所有bean对象,所以更占用空间,可能导致程序启动变慢。
- BeanFactory 需要手动注册,而 ApplicationContext 则是自动注册,通过xml或注解方式可以让spring自动配置,但BeanFactory 需要自己编写源代码去配置。
Spring Bean 的生命周期(@Scope注解/xml属性scope="prototype"):
- 实例化
- 依赖注入
- 初始化(处理 Aware 接口--预初始化--自定义初始化--后置初始化)
- 对象使用
- 销毁(容器关闭--调用默认destroy方法,再调用自定义destory方法)
Spring 的5种 bean 的作用域:
singleton单例,prototype多例,request请求,sessiong会话域,lobal-session全局会话域
单例 Beans 是线程安全的么:
1.一般单例bean都是用于service和dao层,基本不会有共享变量,也就是无状态,随着容器销毁而销毁, 所以 Spring 的单例 bean 是线程安全的。
2.当bean是有状态的也就是有数据存储功能的,当用户不再调用就会销毁,
此时是线程不安全的,将作用域设置成prototype多例即可,
因为spring对多例bean采用ThreadLocal 的“空间换时间”方式解决线程安全问题。
Spring 基于 xml 注入 bean 的几种方式:
1.Setter(property标签)
2.构造器constructor(constructor-arg标签)
3.静态工厂(直接用class属性指定工厂全限定类,factory-method调用静态方法创建bean)
4.实例工厂(先创建实例工厂bean,再用factory-bean引用工厂id,factory-method调用实例方法创建bean)
Spring 的自动装配:
Xml装配:
- no默认不自动装配,可用ref属性手动装配
- byName名称自动装配:property的那么属性和bean的name相同自动装配
- constructor构造器自动装配
- byType参数类型自动装配
- autodetect自动探测装配(构造器自动装配>参数类型自动装配)
注解装配(也是基于注解的依赖注入方法):
1. @Autowired 注解装配(类型>名称)(在@Autowired找到了同类型多个类时,用@Qualifier可以指定具体的bean对象名称)
2. @Resource注解装配(名称>类型)=@Autowired+@Qualifier
3. @Value注解(获取properties文件数据/直接标量类型(即基本数据类型+包装类+String)赋值)
Spring 框架的设计模式:
(1)工厂模式:BeanFactory工厂 ,ApplicationContext工厂;
(2)单例模式:Bean作用域 默认为singleton单例模式。
(3)代理模式:Spring AOP ,用到了 JDK 的动态代理和 CGLIB 字节码生成技术;
(4)模板模式:Template模板:TransactionTemplate,JpaTemplate RestTemplate。
(5)观察者模式: Spring 的 ApplicationListener。
(6)适配器模式:Spring 的Interceptor拦截器
(7)装饰者模式:Component下的子类Wrapper和Decorator
Spring 事务:
Spring 事务的本质其实就是数据库对事务的支持,数据库层的事务提交和回滚是通过server层的 binlog(二进制日志,用于主从复制) 或者 InnoDB层的redolog(提交)和undolog(回滚) 实现的。
Spring事务2种:
- 编程式事务管理:创建TransactionTemplate对象手动编写代码来管理事务
- 声明式事务管理:用@Transactional注解,让spring管理事务
Spring 的事务传播行为:
7种行为,这里只提项目种常用的2种:
1.PROPAGATION_REQUIRED:默认/常用:没有事务就创建一个,有则加入
2.PROPAGATION_REQUIRES_NEW:有没有事务,都创建一个新事务。
Spring 事务的隔离级别:
1.Default:默认/常用:使用数据库的事务隔离级别
2.READ_Commited:读已提交
3.READ_UNCOMMITTED :读未提交
4.REPEATABLE_READ:可重复读(Mysql数据库默认)
5.serializable:串行化
Spring 的事件类型(ApplicationListener监听器 ):
- 上下文开始事件(ContextStartedEvent)
- 请求处理事件(RequestHandledEvent)
- 上下文更新事件(ContextRefreshedEvent)
- 上下文停止事件(ContextStoppedEvent)
- 上下文关闭事件(ContextClosedEvent)
Spring MVC:
MVC模式(Model-View-Controller)
控制器(Controller):Servlet,控制器:处理用户的请求
视图(View):HTML, JSP, 前端页面框架
模型/持久层(Model):逻辑业务程序(后台的功能程序), Service, Dao, JavaBean
Springmvc的三大组件:
1.处理器映射器:RequestMappingHandlerMapping
2.处理器适配器:RequestMappingHandlerAdapter
3.处理器解析器:ExceptionHandlerExceptionResolver
Springmvc的工作流程:
- 客户端--(发起请求)-->前端控制器(DispatcherServlet)
- DispatcherServlet--(url请求)-->处理器映射器(HandlerMapping)
- HandlerMapping--(生成处理器对象handler)-->DispatcherServlet
- dispatchServlet--(handler)-->处理器适配器(HandlerAdapter)
- HandlerAdapter--(执行handler生成ModelAndView)-->DispatcherServlet
- DispatcherServlet--(ModelAndView)-->视图解析器(ViewResolver)
- ViewResolver--(解析ModelAndView返回view)-->DispatcherServlet
- DispatcherServlet--(页面资源)-->客户端
SpringMVC常用注解:
- @RequestParam绑定表单数据
- @CookieValue
- @RequestHeader
- @PathVariable
- @SessionAttributes