Spring面试题(2020最新版)_ThinkWon的博客-CSDN博客
Spring常见面试题总结(超详细回答)_张维鹏的博客-CSDN博客_spring面试题
SSM+SSH框架_张维鹏的博客-CSDN博客
1 Spring Bean
2 Spring AOP
2.1 AOP 概念、好处、应用场景
有两种编程方式,OOP 和 AOP。
OOP 是面向对象编程,Object-Oriented Programming。这种编程方式容易造成大量代码的重复,不利于各个模块的重用。
AOP 是面向切面编程,Aspect-Oriented Programming。这种编程方式将业务无关但是对多个对象产生影响的公共行为和逻辑抽取出来,并封装为一个可重用的模块,这个模块被命名为“切面”。这种编程方式可以减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理等。
2.7 其他问题
解释基于 XML Schema 方式的切面实现
在这种情况下,切面由常规类以及基于 XML 的配置实现。
解释基于注解的切面实现
在这种情况下 (基于@AspectJ 的实现),涉及到的切面声明的风格与带有 java 5 标注的普通 java 类一致。
有几种不同类型的自动代理?
BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying
Spring 在运行时通知对象
通过在代理类中包裹切面,Spring 在运行期把切面织入到 Spring 管理的 bean 中。代理封装了目标类,并拦截被通知方法的调用,再把调用转发给真正的目标 bean。当代理拦截到方法调用时,在调用目标 bean 方法之前,会执行切面逻辑。
直到应用需要被代理的 bean 时,Spring 才创建代理对象。如果使用的是 ApplicationContext 的话,在 ApplicationContext 从 BeanFactory 中加载所有 bean 的时候,Spring 才会创建被代理的对象。因为 Spring 运行时才创建代理对象,所以我们不需要特殊的编译器来织入 SpringAOP 的切面。
Spring 只支持方法级别的连接点
因为 Spring 基于动态代理,所以 Spring 只支持方法连接点。Spring 缺少对字段连接点的支持,而且它不支持构造器连接点。方法之外的连接点拦截功能,我们可以利用 Aspect 来补充。
在 Spring AOP 中,关注点和横切关注的区别是什么?在 spring aop 中 concern 和 cross-cutting concern 的不同之处
关注点(concern)是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
横切关注点(cross-cutting concern)是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。
3 Spring 事务
3.3 Spring 事务的优点
- 它支持声明式事务管理。
- 提供了跨不同事务 api(如 JTA、JDBC、Hibernate、JPA 和 JDO)的一致编程模型。
- 它为编程事务管理提供了比 JTA 等许多复杂事务 API 更简单的 API。
- 它很好地集成了 Spring 的各种数据访问抽象。
3.5 Spring 事务的传播行为
事务的传播行为定义了事务嵌套时,事务该如何传播的行为。
PROPAGATION_REQUIRED
- 这是 Spring 默认的传播机制,能满足绝大部分业务需求。
- 如果外层有事务,则当前事务加入到外层事务,一块提交,一块回滚。
- 如果外层没有事务,则创建一个新的事务。
PROPAGATION_REQUIRES_NEW
- 每次开启新的事务。
- 外层有事务,把外层事务挂起,当前事务执行完毕,恢复上层事务的执行。
- 如果外层没有事务,执行当前新开启的事务即可。
PROPAGATION_SUPPORTS
- 如果外层有事务,则加入外层事务;
- 如果外层没有事务,则直接使用非事务方式执行。
PROPAGATION_NOT_SUPPORTED
- 该传播机制不支持事务。
- 如果外层存在事务则挂起,执行完当前代码,则恢复外层事务,无论是否异常都不会回滚当前的代码。
PROPAGATION_NEVER
- 不支持外层事务。该传播机制不支持外层事务,即如果外层有事务就抛出异常。
PROPAGATION_MANDATORY
- 与 NEVER 相反,如果外层没有事务,则抛出异常。MANDATORY 强制的。
PROPAGATION_NESTED
- Spring 所特有的。
- 该传播机制的特点是可以保存状态保存点,当前事务回滚到某一个点,从而避免所有的嵌套事务都回滚,即各自回滚各自的,如果子事务没有把异常吃掉,基本还是会引起全部回滚,等价于 TransactionDefinition. PROPAGATION_REQUIRED。
3.6 Spring 事务的实现方式和实现原理
Spring 事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring 是无法提供事务功能的。
真正的数据库层的事务提交和回滚是通过 binlog 或者 redo log 实现的。
5 Spring 数据访问
5.1 解释对象/关系映射集成模块
Spring 通过提供 ORM 模块,支持我们在直接 JDBC 之上使用一个对象/关系映射映射 (ORM)工具,Spring 支持集成主流的 ORM 框架,如 Hiberate,JDO 和 iBATIS,JPA,TopLink,JDO,OJB 。Spring 的事务管理同样支持以上所有 ORM 框架及 JDBC。
5.2 在 Spring 框架中如何更有效地使用 JDBC?
使用 Spring JDBC 框架,资源管理和错误处理的代价都会被减轻。所以开发者只需写 statements 和 queries 从数据存取数据,JDBC 也可以在 Spring 框架提供的模板类的帮助下更有效地被使用,这个模板叫 JdbcTemplate
5.3 解释 JDBC 抽象和 DAO 模块
通过使用 JDBC 抽象和 DAO 模块,保证数据库代码的简洁,并能避免数据库资源错误关闭导致的问题,它在各种不同的数据库的错误信息之上,提供了一个统一的异常访问层。它还利用 Spring 的 AOP 模块给 Spring 应用中的对象提供事务管理服务。
5.4 spring DAO 有什么用?
Spring DAO(数据访问对象) 使得 JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换。它还允许您在编写代码时,无需考虑捕获每种技术不同的异常。
5.5 spring JDBC API 中存在哪些类?
JdbcTemplate
SimpleJdbcTemplate
NamedParameterJdbcTemplate
SimpleJdbcInsert
SimpleJdbcCall
5.6 JdbcTemplate 是什么
JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的数据错误处理。
5.7 其他问题
使用 Spring 通过什么方式访问 Hibernate?使用 Spring 访问 Hibernate 的方法有哪些?
在 Spring 中有两种方式访问 Hibernate:
- 使用 Hibernate 模板和回调进行控制反转
- 扩展 HibernateDAOSupport 并应用 AOP 拦截器节点
如何通过 HibernateDaoSupport 将 Spring 和 Hibernate 结合起来?
用 Spring 的 SessionFactory 调用 LocalSessionFactory。集成过程分三步:
- 配置 the Hibernate SessionFactory
- 继承 HibernateDaoSupport 实现一个 DAO
- 在 AOP 支持的事务中装配
如何使用 JPA 在数据库中非持久化一个字段?
假如我们有下面一个类:
@Entity(name="USER")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID")
private Long id;
@Column(name="USER_NAME")
private String userName;
@Column(name="PASSWORD")
private String password;
private String secrect;
}如果我们想让 secrect 这个字段不被持久化,也就是不被数据库存储怎么办?我们可以采用下面几种方法:
Static String transient 1; // not persistent because of static
Final String transient 2 = “Satish”; // not persistent because of final
Transient String transient 3; // not persistent because of transient
@Transient
String transient 4; // not persistent because of @Transient
一般使用后面两种方式比较多,我个人使用注解的方式比较多。