面试-Spring

1、事务的七种传播行为

1.PROPAGATION_REQUIRED:如果存在一个事务,就支持这个事务,如果不存在就开启一个新的事务执行

2.PROPAGATION_REQUIRES_NEW:总是开启一个新的事务执行

3.PROPAGATION_NEVER:以非事务执行,如果存在事务就抛出异常

4.PROPAGATION_NOT_SUPPORTED:以非事务执行并且挂起存在的事务

5.PROPAGATION_SUPPORTS:如果存在一个事务,就支持这个事务,如果没有就按非事务执行

6.PROPAGATION_MANDATORY:如果存在一个事务,就支持这个事务,如果不存在就抛出异常

7.PROPAGATION_NESTED:如果存在一个事务,就开启一个嵌套事务执行,如果不存在就开启一个新的事务执行

2、事务的实现方式

        编程式事务:通过编程的方式来管理事务,也就是需要手动调用commit、rollback等函数来实现提交回滚这些操作。

        声明式事务:用@Transation注解来实现,主要的参数有value、propagation、isolation、readonly等,其中value用来执行事务管理器,propagation用来设置传播行为,isolation用来设置事务的隔离级别,readonly用来设置读写还是只读。

3、事务的隔离级别

        有五种,默认的隔离级别(使用数据库默认的隔离级别)、串行化、可重复读、读已提交、读未提交

4、Spring Bean的生命周期

        分为五个阶段:

        1.创建前准备阶段:在这个阶段会解析并查找Bean有关的扩展实现,这些扩展类用来实现Bean加载过程中的扩展机制

        2.创建实例阶段:在这个阶段会通过反射来创建Bean的实例化对象,扫描并解析Bean对象声明的属性

        3.依赖注入阶段:在这个阶段,如果Bean对象需要依赖其他的对象,就会对这些Bean对象进行依赖注入

        4.容器缓存阶段:在这个阶段,会将实例化好的Bean存在容器里面供开发者调用

        5.销毁实例阶段:在这个阶段,会将Bean进行销毁

4、IOC

        IOC即控制反转,就是由Spring容器来管理Bean的整个生命周期,这样可以降低代码之间的耦合。

        IOC的实现方式有两种,一种是依赖查找,一种是依赖注入。依赖注入可以通过构造器注入,set注入或者基于注解进行注入。

        IOC的初始化流程:首先会读取xml文件,然后对xml文件进行解析,得到BeanDefinition,然后将BeanDefinition注册到容器BeanDefinitionMap中,之后使用BeanFactory根据BeanDefinition来进行实例化和初始化Bean。

5、AOP

        AOP即面向切面编程,可以理解成在不修改源代码的情况下进行一个功能的增强。AOP可以有效地减少代码的复用,降低模块之间的耦合度。

        AOP的实现有两种方式,一种是静态代理一种是动态代理,在Spring中采用的是动态代理来实现的,AspectJ则是使用静态代理。静态代理指的是在代码编译的时候进行一个织入,也叫编译时增强。动态代理则是在程序运行时进行功能的增强。动态代理又分为JDK动态代理和CGLIB动态代理,JDK动态代理需要代理的类实现接口,如果目标类没有实现接口,那就需要使用CGLIB来实现动态代理,CGLIB是通过继承来实现的动态代理,因此如果目标类被final修饰了的话就无法使用这种方式来进行动态代理。此外,如果目标类实现了接口,可以强制CGLIB来动态代理。

        AOP的相关术语:

        切面:将通知应用到切入点的过程

        连接点:类中可以进行增强的方法

        切入点:实际增强的方法

        通知:增强的部分,分为前置通知Before、后置通知After、环绕通知Around、异常通知AfterThrowing和返回通知AfterReturning

6、Spring用到了哪些设计模式

        1.单例模式:一个类只有一个实例,spring中创建的Bean默认都是单例。

        2.适配器模式:在SpringMVC的执行流程中用到了适配器模式

        SpringMVC的执行流程是:

                首先DispatcherServlet接收到用户发送的请求

                然后将这个请求通过处理器映射器(HandlerMapping)得到一个执行链(包含拦截器这些)

                然后DispatcherServlet通过这个执行链找到对应的HandlerAdapter

                HandlerAdapter再调用handle方法进行处理并返回一个ModelAndView给DispatcherServlet

                DispatcherServlet将这个ModelAndView通过ViewResolver视图解析器进行解析,得到View视图

                DispatcherServlet将View视图进行渲染,也就是填充数据,之后返回给客户端浏览器显示

        3.代理模式:Spring的AOP使用了动态代理

        4.观察者模式:spring中常用的地方是listener的实现,比如kafkaListener

        5.模板模式:比如jdbcTemplate、redisTemplate、kafkaTemplate、elasticsearchRestTemplate等

        6.工厂方法模式

        7.简单工厂模式

7、Bean注入容器的方式

        1.@Configuration和@Bean

        2.@Component、@Controller、@Service、@Repository,然后使用@ComponentScan来扫描

        3.@Import

8、Bean的作用域

        1.singleton,单例,对于一个bean只创建一个实例对象

        2.prototype,每次从IOC容器中获取对象的时候,都会创建一个新的bean实例对象返回

        3.request,每次http请求的时候就会创建一个新的Bean实例对象

        4.session,同一个session共享同一个bean实例,不同的session产生不同的实例

        5.global-session,针对全局session共享同一个Bean实例

9、spring怎么解决循环依赖问题

        采用了三级缓存来解决这个问题。假设BeanA和BeanB循环依赖,首先假设要初始化BeanA,那么就会将BeanA放到三级缓存中,然后进行依赖注入,发现BeanA依赖BeanB,所以需要对BeanB进行初始化,BeanB也需要依赖注入,然后要注入BeanA,BeanB就可以从三级缓存中获取BeanA并完成初始化,同时将BeanA从三级缓存中删除移动到二级缓存中,BeanB也会放入到以及缓存中,这个时候BeanA就可以从一级缓存中获取BeanB实现依赖注入,之后完成初始化,将BeanA放入到一级缓存中。

10、@Atuowired和@Resource的区别

        @Autowired是根据类型进行注入,如果要根据名称的话可以结合@Qualifier来实现

        @Resource默认是按照名称来进行注入,它有两个重要的属性,一个是name,一个是type,使用了哪种属性就按照哪种方式来进行注入,如果都不指定默认就是按照名称注入。如果都设置了,会先通过name来注入,如果找不到再用type。

11、@Bean和@Component的区别

        @Component可以作用于任何类上,通过@Component注解Spring会自动创建该类的实例并注入到SpringIOC容器中。

        @Bean用于配置类中声明一个bean,通常是用于配置类的方法上面,表示把这个方法的返回对象注册到IOC容器中,通过Bean注解,我们可以自定义Bean的创建和初始化过程,包括指定Bean的名称、作用域、依赖关系等

12、Spring的单例Bean是否有线程安全问题

        对于无状态的Bean没有,对于有状态的Bean存在线程安全问题,有状态就是这个Bean对象中有实例变量,可以保存数据,比如entity中的用户类,假设要获取用户实例并进行操作,可以用ThreadLocal来进行线程隔离或者考虑使用prototype?

13、SpringMVC的注解

        1.@Controller:用于标识此类的实例是一个控制器

        2.@RequestMapping:映射Web请求,即访问路径和参数

        3.@ResponseBody:注解返回数据而不是页面

        4.@RequestBody:注解实现接收http请求请求体的JSON数据,并将JSON数据转换为java对象

        5.@PathVariable:获得URL中变量的值

        6.@RestController:相当于@Controller和@ResponseBody

14、@RequestBody和@RequestParam的区别

        @RequestBody主要用于接收post请求中请求体中的参数,@RequestParam主要用于接收get请求中url的参数

15、@Pathvariable和@RequestParam的区别

        @Pathvariable主要是从url的模板中获取值,即

@RequestMapping(value = "/whisperingNew/workOrder/{id}", method = RequestMethod.DELETE)

xxxx:xxxx/xxxx/xxxx/whisperingNew/workOrder/23

        @RequestParam则是从request中获取值

@RequestMapping(value = "/whisperingNew/workOrder", method = RequestMethod.DELETE)

xxxx:xxxx/xxxx/xxxx/whisperingNew/workOrder?id=23

16、SpringBootApplication包含哪些注解

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值