Day18

1. 说说Bean的生命周期

  1. 创建、初始化、调用、销毁;
  2. Bean的创建方式有四种,构造器,静态工厂,实例工厂,settter注入方式。spring在调用bean的时候因为作用域不同,不同的bean初始化和创建的时间也不相同。
  3. 在作用域为singleton的时候,bean是随着容器一起被创建好并且实例化的,在作用域为prototype时,bean是随着它被调用的时候才创建和实例化完成。然后程序就可以使用bean了,当程序完成销毁的时候,bean也被销毁

2. 说说@Autowired和@Resource注解的区别

  1. @Autowired是spring提供的注解,而@Resource是JDK提供的注解
  2. @Autowired默认按照类型装配,默认情况下必须要求依赖对象存在,如果要允许为null值,可以设置它的required属性为false。如果想使用名称装配可以结合@Qualifier注解进行使用
  3. @Resource注解,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,默认取字段名进行名称查找,当然@Resource也支持按照类型装配

3. 说说Spring事务管理

  1. spring支持编程式事务管理和声明式事务管理两种方式
  2. 编程式事务管理使用TransactionTemplate,声明式事务管理建立在AOP之上,其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前启动一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务
  3. 声明式事务最大的优点就是不需要再业务逻辑代码中掺杂事务管理的代码,只需通过@Transactional注解,便可以将事务规则应用到业务逻辑中,减少业务代码的污染。唯一不足是最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别

4. 说说Bean的作用域,以及默认的作用域

  1. 默认情况下,Bean在Spring容器中是单例的,但我们可以通过@Scope来修改Bean的作用域。这个注解有五种不同的取值,代表了Bean的五种不同的类型作用域
  2. singleton:在Spring容器中仅仅存在一个实例,即Bean以单例的形式存在。
  3. prototype:每次调用getBean()时,都会执行new操作,返回一个新的实例
  4. request:每次HTTP请求都会返回一个新的Bean
  5. session:同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean
  6. globalSession:同一个全局Session共享一个Bean,一般用于Portlet环境

5. 说说BeanFactory和FactoryBean的区别

  1. BeanFactory:是所有SpringBean容器的顶级接口,是最基础的IOC容器,它为spring容器定义了一套方法,并提供像getBean这样的方法从容器中获取指定的bean实例。它解决了bean之间的依赖注入能力,DI
  2. FactoryBean:工厂bean,只是SpringIOC容器创建Bean的一种形式,他是一个接口,它的主要功能是动态去生成某一类型的Bean的一个实例,也就是我们可以自定义一个bean并且加载到IOC容器里面,getObject方法就是用来实现动态构建Bean的一个过程

6. 说说你对MVC的理解

  1. mvc就是model,view,controller,将软件分为三层可以降低对象之间的耦合度,便于维护
  2. mvc的执行流程如下:客户端发出的所有请求都被DispatcherServlet接受和拦截,它将请求发给处理器映射器,处理器映射器找到能处理该请求的处理器,打包成执行链,返回给DispatcherServlet,他能找到能执行该处理器的处理器适配器,处理器适配器执行对应的Controller,controller返回逻辑执行结果和视图打包成modelandview对象,返回给处理器适配器,处理器适配器再返回给DispatcherServlet,就此,业务结束。然后DispatcherServlet调用视图解析器,将视图封装成一个视图对象,返回。DispatcherServlet调用视图对象,让其自己渲染,完成之后,形成响应对象,返回给浏览器

7. 在MyBatis中$和#有什么区别

  1. 使用$设置参数时,mybatis会创建普通的sql语句,然后在执行sql语句时将参数拼入sql,而使用#设置参数时,mybatis会创建预编译的sql语句,然后在执行时mybatis会为预编译sql中的占位符赋值
  2. 预编译的sql语句执行效率高,并且可以防止注入攻击,效率和安全性都大大优于前者,但是在解决一些特殊问题,比如根据不同的条件产生不同的动态列中,我们要传递sql的列名,根据某些列进行排序,或者传递列名给sql就只能使用$了

8. 介绍一下MyBatis的缓存机制

  1. mybatis一级缓存默认开启,在session里面;二级缓存需要手动开启,在namespace里面;开启二级缓存后,一级缓存拿到数据库的数据二级缓存也会拥有,但是当执行了增删改操作后,会删除session里的一级缓存数据。先找二级缓存数据,二级没有找一级,一级没有找数据库
  2. mybatis在多表查询时,极大可能会出现脏数据,这导致安全使用二级缓存的条件比较苛刻。由于默认的mybatis的cache实现都是基于本地的,这导致在分布式环境下,还一定会出现读取到脏数据的情况,且开发成本高,所以在开发环境下一般都会直接使用redis,memcached等分布式缓存
最后修改:2024 年 06 月 08 日
如果觉得我的文章对你有用,请随意赞赏