java每日5问(第43天)

Mybatis 中#{}和${}的区别是什么?

#{}是预编译处理,KaTeX parse error: Expected 'EOF', got '#' at position 22: …替换。 Mybatis 在处理#̲{}时,会将 sql 中的#{…{}时,就是把${}替换成变量的值。使用#{}可以有效的防止 SQL 注入,提高系统安全性。

Spring 中@Autowire 与@Resource 的区别?

@Autowire 默认按照类型装配,默认情况下它要求依赖对象必须存在如果允许为 null,可以设置它 required 属性为 false,如果我们想使用按照名称装配,可以结合@Qualifier 注解一起使用;
@Resource 默认按照名称装配,当找不到与名称匹配的 bean 才会按照类型装配,可以通过name 属性指定,如果没有指定 name 属性,当注解标注在字段上,即默认取字段的名称作为 bean 名称寻找依赖对象,当注解标注在属性的 setter 方法上,即默认取属性名作为 bean 名称寻找依赖对象

什么是控制反转(IOC),什么是依赖注入(DI)?

IOC:就是对象之间的依赖关系由容器来创建,对象之间的关系本来是由我们开发者自己创建和维护的,在我们使用 Spring 框架后,对象之间的关系由容器来创建和维护,将开发者做的事让容器做,这就是控制反转。BeanFactory 接口是 Spring Ioc 容器的核心接口。
DI:我们在使用 Spring 容器的时候,容器通过调用 set 方法或者是构造器来建立对象之间的依赖关系。
控制反转是目标,依赖注入是我们实现控制反转的一种手段。

Spring 运行原理?

1、内部最核心的就是 IOC 了,之前是 new 对象,现在可以直接从容器中获取, 动态注入, 这其实就是利用 java 里的反射。反射其实就是在运行时动态的去创建、调用对象,Spring 就是在运行时,根据 xml Spring 的配置文件来动态的创建对象,和调用对象里的方法的。
2、Spring 另一个核心就是 AOP 面向切面编程,可以为某一类对象 进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过配置类达到的。(日志、事务等)
3、Spring 目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring 根据这些配置 内部通过反射去动态的组装对象)要记住: Spring 是一个容器,凡是在容器里的对象才会有 Spring 所提供的这些服务和功能。
4、Spring 里用的最经典设计模式:模板方法模式。(有兴趣同学可以了解一下) 、核心容器组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

Spring 的事务传播行为?

PROPAGATION(蔓延、传播、传输)

事务传播行为类型 说明
如果当前没有事务,就新建一个事务,如果已经存在一个事务
PROPAGATION_REQUIRED中,加入到这个事务中。这是默认的事务传播行为PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
新建事务,如果当前存在事务,把当前事务挂起。(一个新的
事务将启动,而且如果有一个现有的事务在运行的话,则这个

PROPAGATION_REQUIRES_NEW

PROPAGATION_NOT_SUPPORTED

方法将在运行期被挂起,直到新的事务提交或者回滚才恢复执 行。)
以非事务方式执行操作,如果当前存在事务,就把当前事务挂 起。

PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务, 则执行与 PROPAGATION_REQUIRED 类似的操作。(外层事务抛

PROPAGATION_NESTED

出异常回滚,那么内层事务必须回滚,反之内层事务并不影响 外层事务)

猜你喜欢

转载自blog.csdn.net/qq_39899164/article/details/107686586