Spring
IoC、DI与AOP
IoC
- IoC是一种设计思想,将原本在程序中手动创建对象的控制权,交由Spring框架来管理,IoC容器是spring用来实现IoC的载体,IoC容器实际上是个Map,存放各种对象
- 将对象之间的相互依赖关系较给IoC容器管理,由IoC容器完成对象的注入,很大程度简化应用的开发,IoC容器就像一个工厂,当我们需要创建一个对象时,只需要配置好配置文件告诉容器需要什么类型的对象,完全不用考虑对象是如何被创建出来的
一般通过XML配置文件来配置Bean,选择大部分使用注解配置
DI
- 依赖注入,IoC的一种实现方式
AOP
- 面向切面编程,能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理,日志管理,权限控制等)封装起来,减少系统的重复代码,降低模块间的耦合度,并有利于未来的可扩展性和可维护性
- 基于动态代理实现,如果需要代理的对象实现了某个接口,则会使用JDK Proxy去创建代理对象
对于没有实现接口的对象,则使用Cglib生成一个被代理对象的子类来作为代理
Bean
bean的获取
-
通过BeanFactory
- 采用的是延迟加载的形式,即只有在使用某个Bean的时候(调用getBean()),才对该bean进行加载实例化,但这样不能及时发现配置文件中的错误
-
通过ApplicationContext
- 由beanfactory接口派生而来的
- 在启动容器上,applicationContext会容器启动时一次性创建所有的bean,这样在容器启动时就可以发现配置文件中的错误
bean的作用域
- singleton,唯一bean实例,spring中的bean默认都是单例的
- prototype,每次请求都i会创建一个新的benan实例
- request,每一次http请求都会产生一个新的bean,该bean尽在当前http request内有效
- session,每一次http请求都会产生一个新的bean,该bean尽在当前httpsession内有效
- glabal-session,全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5已经没了
单例bean的线程安全问题
-
存在安全问题,当多个线程操作同一个对象的时候,对这个对象的成员变量的写操作会存在线程安全问题
-
解决方法
- 在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中
- 改变bean的作用域prototype,每次请求都会创建一个新的bean实例,各bean之间不会相互影响,自然不会存在线程安全问题
@Component和@Bean的区别
- @Component注解作用与类,通常是通过路径扫描来自动侦测以及自动装配Spring容器中(@ComponentScan后跟路径名)
- @Bean注解作用于方法,告诉Spring这是某个类的实例,当有需要的时候返回这个实例对象,@Bean的自定义性更强,当我们引用第三方库中的类需要装配到spring容器时,只能通过@bean来实现
将一个类声明为bean的注解有哪些
- @Component,通过注解,可标注任意类为spring组件,如果不确定当前bean是属于哪个层,可以使用@Component注解标注
- @Repositoy,对应持久层即Dao层,主要用于数据库相关操作
- @Service,对应服务层,主要涉及一些复杂的逻辑,需要用到Dao层
- @Controller,对应SpringMVC控制层,主要用于接收用户请求并调用service层返回数据给前端页面
Spring MVC
SPringMVC是什么
- MVC是一种设计模式,SpringMVC是一款优秀的MVC框架,帮助我们进行更简洁的Web层开发,将后端项目分为service层(处理业务)Dao层(数据库操作)entity层(实体层)controller层(控制层返回数据给前端页面
SpringMVC的工作流程
- 客户端接受请求,直接发送到DispatcherServlet(前端控制器)
- 前端控制器根据请求信息调用HandlerMapping(处理映射器),解析请求对应的Handler
- 解析到了对应的Handler(也就是对应controller控制器)后,开始由HandlerAdapter(处理适配器)处理
- 处理适配器会根据Handler来调用真正的处理器来处理请求,并处理相应的业务逻辑
- 处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是个逻辑上的View
- 视图解析器ViewResolver会根据逻辑View查找实际的View
- 前端控制器把返回的Model传给View(视图渲染)
- 把View返回给请求者(浏览器)
Spring框架中用到了哪些设计模式
工厂设计模式
代理设计模式
单例设计模式
模板方法模式
包装器设计模式
观察者模式
适配器模式
Spring事务
Spring管理事务的方法
-
编程式事务,在代码中硬编码。不推荐
-
声明式事务,在配置文件中配置。推荐使用
- 基于XML的声明式事务
- 基于注解的声明式事务
XMind - Trial Version