【精选】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)。在
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;
public class TestServiceImpl { // 下面两种@Autowired只要使用一种即可 @Autowired private UserDao userDao; // 用于字段上 @Autowired public void setUserDao(UserDao userDao) { // 用于属性的方法上 t his.userDao = userDao; } }
@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如 果允
许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可 以结合
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属性,这时将通 过反射机制使用
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应用程序。
下一篇
#春招##秋招##面试##面试复盘##面经#宝剑锋从磨砺出,梅花香自苦寒来,我是小码哥为你圆梦大厂少走弯路,值得关注。