05-框架

五、框架

1、Spring boot是什么

Spring boot是为Spring服务的,主要是简省了繁重的配置,提供了各种启动器,简化了spring应用的初始化搭建以及开发过程。

2、spring的特点
  • 方便解耦,简化开发:通过spring提供的IOC容器,可以把对象之间的依赖关系交由spring进行管理,避免硬编码所造成的过度程序耦合
  • 面向切面编程:更方便地实现对程序进行权限拦截、运行监控等功能。
  • 声明式事务管理:其本质是对方法前后进行拦截,在方法开始之前创建或者加入一个事务,在执行完后根据执行情况提交或回滚事务。
  • 方便集成各种框架
3、Spring容器的了解

主要提供两种类型的容器:BeanFactor与ApplicationContext

  • BeanFactory:是基础类型的IOC容器,提供完整的IOC服务。若没有特殊指定,默认采用延迟初始化策略。当客户端对象需要访问容器中的某个对象时,才对此对象进行初始化以及依赖注入操作。所以容器启动初期速度较快。
  • ApplicationContext:在BeanFactory的基础上构建的,包括了BeanFactory容器的所有功能,且还提供了其他高级特性(事务发布等)。ApplicationContext所管理的对象在该容器启动后,默认全部初始化,所以相比于BeanFactory,ApplicationContext要求更多的系统资源,并且在容器启动时耗时也长于BeanFactory。
4、Spring的IOC
概念:

IOC是控制反转,是一种理论和思想。在传统开发中,类A依赖于类B,是要在A类中new一个B类对象,但在spring中,可以把整个对象的创建和对象之间的依赖关系,交给Spring管理,降低对象与对象之间的耦合,需要某个对象时直接从IOC中获取就可以了。

控制:对象创建的权力;

反转:控制权交给外部环境;

DI(依赖注入):是IOC实现的方式。就是IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。具体的实现中,主要包含三种方法:

  • 构造方法注入:在被注入对象的构造方法中声明依赖对象的参数列表,每一个参数就代表了对其他类的依赖
  • setter方法注入:先构造对象,再通过setter方法将相应的依赖对象设置到被注入对象中。
  • 接口注入:灵活性和易用性比较差,Spring4就已经废弃了。
原理:

spring-ioc是通过xml解析+工厂模式+反射机制进行实现

5、spring常用注解

1、声明扫描策略

@ComponentScan:通过此声明容器就可知要扫描哪些包下带有声明的类。

2、给容器注入组件:

@Component(泛指各种组件:类)、@Service(业务层)、@Controller(控制层)、@Repository(数据访问层)

2、@Bean:注解的方法会实例化一个新对象,并将对象交由IOC容器进行管理

@Bean(name = "info")
 public Info getInfo(){
     return new Info("gfagduis", 2343);
 }

3、注入bean注解

@Autowired:按类型对bean进行装配,当一个接口有多个实现类,这种方法就无法正确注入对象了

@Qualifier:与@Autowired搭配使用,按名称对bean进行装配

@Resource:(JDK提供)先按照名字找,如果没有就按照类型找

4、@Configuration: 声明当前类是一个配置类

6、Bean的作用域

默认情况下,Bean再Spring中是单例的,可以通过@Scope注解修改Bean的作用域。常见的Bean的作用域:

  • singleton:在Spring容器中仅存在一个实例,单例设计模式的应用
  • prototype:每次调用getBean都会执行new操作,返回一个新的实例
  • request:每次http请求都会创建一个新的Bean,该bean仅在Http request内有效
  • session:同一个Http Session共享一个Bean
  • globalSession:同一个全局的Session共享一个Bean
7、SpringBean的生命周期
  • 实例化bean:以反射的方式生成对象
  • 填充bean的属性:populateBean()循环依赖的问题
  • 调用bean所实现的各种Aware接口的相关方法,包括BeanNameAware接口的setBeanName方法,传入Bean的名字、BeanClassLoaderAware接口的setBeanClassLoader方法,传入ClassLoader对象的实例、BeanFactoryAware接口的setBeanFactory方法传入BeanFactory对象实例
  • 如果实现了BeanPostProcessor接口,就会执行该接口的前置处理方法
  • 如果Bean实现了InitializingBean接口,则会调用afterPropertiesSet方法
  • 调用BeanPostProcess的后置处理方法,spring的aop就是在此实现
  • 以getBean的方式获得bean对象
  • 销毁:判断是否实现了dispoableBean接口, destroy-method方法
8、Spring中默认提供的单例是线程安全的吗?

不是。

若一个Bean在线程操作中不会对bean的成员执行查询以外的操作,那么这个单例bean就是安全的,这种bean也是无状态bean(例如Controller、Service、DAO)。如果单例的bean是一个有状态的bean,即有数据储存功能,(例如view model对象)需要编写代码保证线程安全。

解决:

1、改变bean的作用域,把singleton换为prototype,这样请求bean相当于new Bean()

2、采用Thread Loal对状态数据做线程隔离

9、Spring的AOP
概念:

aop面向切面编程,是一种编程思想,是对面向对象编程OOP的一种补充。用于将与业务无关,但却对多个对象产生影响的公共行为逻辑,抽取并封装为一个可重用的模块,这个模块就是“切面”,减少系统的重复代码,降低模块间的耦合度,提高系统的可维护性。(可应用于:权限认证、日志、事务处理等场景)。

Spring AOP支持两种实现方式:

JDK动态代理:如果被代理对象的类实现了某个接口,就可以使用JDK Proxy去创建代理对象,利用的是反射的机制实现,生成一个实现同样接口的代理类,重写方法对被代理类方法增强。

CGLib动态代理:对于没有实现接口的对象无法使用proxy代理,就可以使用CGLib生成被代理对象的子类作为代理类,重写弗雷方法

10、Spring事务

Spring事务实现的方式有两种:

  • **编程式事务管理:**Spring提供了Transaction Template模板,可以利用模板以编程的方式管理事务,灵活性大但很难维护
  • **声明式事务管理:**将业务代码和事务管理分割,只需要通过注解和xml配置来管理事务。相比于编程式而言使用方便,只需要在事务管理的方法上,增加@Transaction注解就行。
    • 当它标记在类上:这个类所有公共非静态地方法都将启用事务功能
    • 当标记在方法上:仅表示此方法将开启事务功能
事务的ACID性质:

原子性:事务是一个原子操作,由一系列动作组成。原子性确保动作的完整性,要么全部成功,要么全部失败。

一致性:事务开始前和事务结束以后,数据的完整性约束没有被破坏

隔离性:可能有多个事务同时处理相同数据,因此每个事务应与其他事务隔离起来,防止数据的损坏

持久性:事务完成后,事务对数据库数据的改变便持久地保存在数据库中,并不会回滚

事务的传播机制:当一个事务被另一个事务调用时,指定事务应该如何传播
  • REQUIRED:required,必须;默认值:如果A有事务,B就会使用该事务;如果A没有事务,B将创建一个新事物
  • REQUIRES_NEW:新的;A有事务,将A事务挂起,B创建一个新事务;A没有,B创新
  • SUPPORTS:支持;A有事务,B使用该事务;A没有事务,B以非事务执行
  • NOT_SUPPORTED:不支持;A有事务,A挂起,B以非事务执行;A没有事务,B以非事务执行
  • MANDATORY:mandatory,强制;A有事务,B使用该事务;B抛异常
  • NEVER:A有事务,B异常;A没有事务,B以非事务执行
  • NESTED:嵌套;有事务,则嵌套事务执行;没有就用默认方式
隔离级别:定义一个事务可能受到其他事务的影响
  • Defalut:使用底层数据库设置隔离级别
  • READUNCOMMITTED:未提交读,事务未提交前,就可能被其他的事务读取(会出现幻读、脏读和不可重复读)
  • ReadCommitted:提交读,一个事务提交后才会被其他事务读取(会出现幻读和可重复读)
  • RepeatableRead:可重复读,对同一字段多次读取的结果都是一致的,可阻止脏读与不可重复读
  • Seralizable:完全服从ACID的隔离级别,确保阻止了脏读、幻读和不可重复读,最高的隔离级别,且是最慢的隔离级别
脏读、幻读、不可重复读:

脏读:表示一个事务读取到还未提交的事务;可能会读到回滚了的数据

幻读:同一事物多次查询返回的结果不一致;在第一个事务中的两次读数据之间,第二个事务进行了增加或删除,第一个事务第二次读数据时会增加或减少一些数据。

不可重复读:在一个事务内,多次读同一数据;第一个事务中的两次读数据之间,第二个事务进行了修改,那么第一个事务两次读到的的数据可能是不一样的。

11、什么是Spring MVC

MVC是一种软件设计规范,在这种模式下软件被分为三层:Model(模型)、View(视图)、Controller(控制器)。model表示数据、view表示用户界面、controller表示数据的处理逻辑,是model与view地桥梁。降低耦合度。

12、springMVC的运行流程
  1. 用户发送请求到前端控制器
  2. 前端控制器接收到请求后,调用处理器映射器,请求获取Handler
  3. 处理器映射器据请求url找到具体的处理器,生成处理器对象以和处理器拦截器,并封装成处理器链返还给前端控制器
  4. 然后前端处理器通过handler,找到一个适合的处理器适配器,来执行handler,并返回ModleandView
  5. 返回的这个modelandview对象中的View是视图名称,不是视图对象
  6. 前端控制器还需要借用视图解析器返回真正的视图对象
  7. 前端控制器依据view对象对modelandview中的模型数据进行视图渲染
  8. 给用户响应

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-egkl5zxx-1662796625377)(C:\Users\10591\AppData\Roaming\Typora\typora-user-images\1660363021940.png)]

13、SpringMVC常用注解

@RequestMapping:用来处理请求地址映射的注解;可以使用在方法上或类上。类上:表示此类所有的响应请求方法都以地址作为父路径

@RequestParam:将请求参数映射到控制器的方法参数上

@PathVariable:将请求URL中的占位符参数映射到控制器的方法的参数上

@Responsebody :将方法返回的结果写入到HTTP响应正文中

14、过滤器与拦截器的区别

二者概念

  • 过滤器:是在java web中将传入的request、response提前过滤一些信息,或者提前设置一些参数。然后再传入Servlet。可以通过@WebFilter注解实现对特定URL拦截
    • init:容器初始化过滤器时被调用,只会调用一次
    • doFilter:当请求地址与锁设置的URL匹配时就会调用该方法
    • destroy:容器销毁过滤器实例时调用
  • 拦截器:是面向切面编程,会对处理器进行拦截。实现时需要实现HandlerInterceptor接口
    • preHandle:在请求处理之前
    • posthandle:控制器方法调用后,返回渲染视图之前会被调用
    • afterCompletion:请求结束后,渲染了对应的视图之后会被执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCY8Tlw3-1662796625378)(C:\Users\10591\AppData\Roaming\Typora\typora-user-images\1662018226320.png)]

区别

  • 过滤器是基于函数回调实现(FliterChain回调的接口);拦截器是基于java的反射机制(动态代理,进行实现)
  • 过滤器是需要依赖Tomcat等容器,因此只能在web程序中使用;拦截器是spring的一个组件,有spring容器管理,所以不依赖于Tomcat,可以单独使用
  • 过滤器是在请求进入容器后,进入Servlet之前进行预处理,请求结束是在Servlet处理之后;拦截器是在请求进入Servlet之后,在进入Controller之前进行预处理,然后在Controller中渲染了对应的视图之后请求结束;

Spring MVC拦截器的开发步骤如下:

  1. 开发拦截器:

实现handlerInterceptor接口,从三个方法中选择合适的方法,实现拦截时要执行的具体业务逻辑。

  1. 注册拦截器:

定义配置类,并让它实现WebMvcConfigurer接口,在接口的addInterceptors方法中,注册拦截器,并定义该拦截器匹配哪些请求路径。

15、MyBaits中$和#的区别
  • 使用#设置参数时,MyBaits会创建预编译的SQL语句,然后执行sql时会为预编译sql中的占位符(?)赋值。预编译的SQL语句执行效率高,并且可以防止注入攻击

  • 使用$设置参数时,Mybaits只会创建普通的SQL语句,然后执行sql时将参数直接拼入到SQL里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值