【精选】64道题拿下Spring(第三篇)

31、spring JDBC API 中存在哪些类?

JdbcTemplate

SimpleJdbcTemplate

NamedParameterJdbcTemplate

SimpleJdbcInsert

SimpleJdbcCall

32、使用 Spring 访问 Hibernate 的方法有哪些?

我们可以通过两种方式使用 Spring 访问 Hibernate:

1、 使用 Hibernate 模板和回调进行控制反转

2、 扩展 HibernateDAOSupport 并应用 AOP 拦截器节点

33、什么是 Aspect?

aspect 由 pointcount 和 advice 组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP

就是负责实施切面的框架, 它将切面所定义的横切逻辑编织到切面所指定的连接点中. AOP 的工作 重心在于如

何将增强编织目标对象的连接点上, 这里包含两个工作:

1、如何通过 pointcut 和 advice 定位到特定的 joinpoint 上

2、如何在advice 中编写切面代码

以简单地认为, 使用 @Aspect 注解的类就是切面.

34、什么是切点(JoinPoint)

程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理.在 Spring AOP 中, join

point 总是方法的执行点。

35、什么是通知(Advice)?

特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice。

Spring AOP 使用一个 Advice 作为拦截 器,

在 JoinPoint “周围”维护一系列的拦截器。

36、有哪些类型的通知(Advice)

  • Before - 这些类型的 Advice 在 joinpoint 方法之前执行,并使用@Before 注解标记进行配置。

  • AfterReturning - 这些类型的 Advice 在连接点方法正常执行后执行,并使用@AfterReturning 注解

标记进行配置。

  • After Throwing - 这些类型的 Advice 仅在 joinpoint 方法通过抛出异常退出并使用 @AfterThrowing 注解

标记配置时执行。

  • After (fifinally) - 这些类型的 Advice 在连接点方法之后执行,无论方法退出是正常还是异常返回,并 使用

@After 注解标记进行配置。

  • Around - 这些类型的 Advice 在连接点之前和之后执行,并使用@Around 注解标记进行配置。

37、指出在 spring aop 中 concern 和 crosscutting concern 的不同之处。

concern 是我们想要在应用程序的特定模块中定义的行为。它可以定义为我们想要实现的功能。

crosscutting concern 是一个适用于整个应用的行为,这会影响整个应用程序。

例如,日志记录,安全性和数据传输是应用程序几乎每个模块都需要关注的问题,

因此它们是跨领域的问题。

38、AOP 有哪些实现方式?

实 现 AOP 的 技 术 , 主 要 分 为 两 大 类 :

静态代理

指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增 强;

编译时编织(特殊编译器实现)

类加载时编织(特殊的类加载器实现)。

动态代理

在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。

JDK动态代理

CGLIB

39、Spring AOP and AspectJ AOP 有什么区别?

Spring AOP 基于动态代理方式实现;

AspectJ 基于静态代理方式实现。

SpringAOP 仅支持方法级 别的PointCut;

提供了完全的 AOP 支持,它还支持属性级别的 PointCut。

40、什么是编织(Weaving)?

为了创建一个 advice 对象而链接一个 aspect 和其它应用类型或对象,称为编织(Weaving)。在

Spring AOP 中,编织在运行时执行。请参考下图:

41、介绍一下 WebApplicationContext

WebApplicationContext 是 ApplicationContext 的扩展。它具有 Web 应用程序所需的一些额外功 能。

它与普通的 ApplicationContext 在解析主题和决定与哪个 servlet 关联的能力方面有所不同。

42、Spring的IOC和AOP机制

  • 我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程, 这两个是Spring的灵魂。

  • 主要用到的设计模式有工厂模式和代理模式。

  • IOC就是典型的工厂模式,通过sessionfactory去注入实例。

  • AOP就是典型的代理模式的体现。

理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托 类预

处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存 在关联关

系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是 通过调用委托

类的对象的相关方法,来提供特定的服务。

spring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分。

在传统的程序设计中,当调用者需要被调用者的协助时,通常由调用者来创建被调用者的实例。

但在spring里创建被调用者的工作不再由调用者来完成,因此控制反转(IoC);创建被调用者实例的工 作通常由

spring容器来完成,然后注入调用者,因此也被称为依赖注入(DI),依赖注入和控制反转是 同一个概念。

面向方面编程(AOP)是以另一个角度来考虑程序结构,通过分析程序结构的关注点来完善面向对 象编程

(OOP)。OOP将应用程序分解成各个层次的对象,而AOP将程序分解成多个切面。spring AOP 只实现了方

法级别的连接点,在J2EE应用中,AOP拦截到方法级别的操作就已经足够。在spring 中,未来使IoC方便地使

用健壮、灵活的企业服务,需要利用spring AOP实现为IoC和企业服务之间建立 联系。

IOC:控制反转也叫依赖注入。利用了工厂模式

将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让 spring

容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中 配置的bean

都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调 用这些bean的类

(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里 面new这些bean了。

AOP:面向切面编程。(Aspect-Oriented Programming)

AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结 构,用

以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为 力。也就是

说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日 志代码往往水平

地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在OOP设计 中,它导致了大量代码

的重复,而不利于各个模块的重用。将程序中的交叉业务逻辑(比如安全,日 志,事务等),封装成一个切

面,然后注入到目标对象(具体业务逻辑)中去。

实现AOP的技术,主要分为两大类:

  • 一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行; 二是

  • 采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码.

简单点解释,比方说你想在你的biz层所有类中都加上一个打印‘你好’的功能,这时就可以用aop思想来做. 你先

写个类写个类方法,方法经实现打印‘你好’,然后Ioc这个类 ref=“biz.”让每个类都注入即可实现

43、Spring中Autowired和Resource关键字的区别

@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它 的包

是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

1、共同点

两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。 2、

2、不同点

(1)@Autowired

@Autowired为Spring提供的注解,需要导入包

org.springframework.beans.factory.annotation.Autowired;

只按照byType注入
public class TestServiceImpl {

// 下面两种@Autowired只要使用一种即可

	@Autowired
	private UserDao userDao; // 用于字段上

	@Autowired
	public void setUserDao(UserDao userDao) { // 用于属性的方法上 		t
        his.userDao = userDao; 
    } 
}

@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如 果允

许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可 以结合

@Qualififier注解一起使用。如下:
public class TestServiceImpl {
	@Autowired
	@Qualifier("userDao")
	private UserDao userDao; 
} 

(2)@Resource

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。

@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的 名字

,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策 略,而使用

type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通 过反射机制使用

byName自动注入策略
public class TestServiceImpl {	
	// 下面两种@Resource只要使用一种即可
	@Resource(name="userDao")private UserDao userDao; // 用于字段上
	@Resource(name="userDao")
	public void setUserDao(UserDao userDao) { // 用于属性的setter方法上
		this.userDao = userDao; 
	} 
} 
//最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去 操作
//属性,而不是直接去操作属性。

@Resource装配顺序:

①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛 出异

常。

②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。

③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常

④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配, 则回

退为一个原始类型进行匹配,如果匹配则自动装配。@Resource的作用相当于@Autowired,只不 过

@Autowired按照byType自动注入

44、Spring九大设计模式

45、Spring MVC 框架有什么用?

Spring Web MVC 框架提供 模型-视图-控制器 架构和随时可用的组件,用于开发灵活且松散耦合的 Web应用程序。

MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在 所有这些元素之间提供松散耦合。

下一篇

#春招##秋招##面试##面试复盘##面经#
小码哥高频面经及八股文 文章被收录于专栏

宝剑锋从磨砺出,梅花香自苦寒来,我是小码哥为你圆梦大厂少走弯路,值得关注。

全部评论
点赞
送花
回复
分享
发布于 2022-06-06 16:58
点赞
送花
回复
分享
发布于 2022-06-09 14:21
滴滴
校招火热招聘中
官网直投
点赞
送花
回复
分享
发布于 2022-06-09 15:05

相关推荐

8 22 评论
分享
牛客网
牛客企业服务