spring面试题

1、什么是Spring框架?Spring框架有哪些主要模块

Spring是一个开源的轻量级Java 框架,目的就是简化程序开发。

Spring框架模块大体可以分为:核心Bean容器、数据访问/集成、Web、AOP(面向切面编程)、工具、消息和测试模块。

Spring容器作为对象容器,负责创建、管理所有的JavaBean,Spring使用一种被称为"依赖注入"的方式来管理Bean之间的依赖关系。

 

2、什么是控制反转,什么是依赖注入

控制反转和依赖注入其实是同一个概念,从不同角度的描述而已。IOC就是把bean的生命周期管理和依赖关系交由IOC容器去控制,控制权发生了反转,所以叫控制反转。

依赖注入是IOC容器的特色功能,意思就是IOC容器帮我们完成组件(Bean)之间依赖关系的注入,常用的注入方式有三种,构造器注入,setter方法注入,工厂方法注入。

构造器注入就是调用构造器然后传参注入。

setter方法注入就结合一些注解来实现,@AutoWired 、@Resource、@Inject、@Qualifier。

工厂方法就是在配置文件中定义工厂实例,通过factory-method指定工厂方法去创建。

 

3、BeanFactory和ApplicationContext有什么区别

Spring 3.x以前是通过BeanFactory来实现Bean实例化,Bean生命周期的控制,分发Bean等等功能。而ApplicationContext是BeanFactory后续延伸出来的子类,具有BeanFactory的所有功能之外,还扩展了一些额外功能。

比如支持国际化,可以同时加载多个配置文件等等;

ApplicationContext常见的实现方式:

ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文。

FileSystemXmlApplicationContext :由文件系统中的XML配置文件读取上下文。

XmlWebApplicationContext:由Web应用的XML文件读取上下文。

 

4、Spring有几种配置方式

将Spring配置到应用开发中有以下三种方式:

1. 基于XML的配置  Spring的配置文件

2. 基于注解的配置  @Component、@Service。。。

3. 基于Java的配置  @Configuration,方法加上@Bean注解。

 

5、如何用Java配置的方式配置Spring

在要配置的类上面加@Configuration注解,在方法上加@Bean注解

 

6、如何用注解的方式配置Spring

一般在类上面用注解

@AutoWired是自动装配,优先根据bean名字来匹配,匹配不上就通过类型。

@Resource也是先根据名字,再通过类型,不过Resource可以直接指定bean名。

@Inject 和Resource也是一样的,不过Resource和Inject是JDK里自带的。

@Qualifier是和AutoWired搭配使用的,@AutoWired结合@Qualifier就能够实现指定名字。

 

7、解释SpringBean的生命周期

Bean的生命周期由两组回调方法组成:

1. 初始化之后调用的回调方法,init-method,bean被实例化之后调用。

2. 销毁之前调用的回调方法,destory-method,容器关闭或者重新加载之后调用。

 

8、SpringBean的作用域之间有什么区别

spring容器中的bean可以分为5个范围:

1、singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例

2、prototype:范围与singleton相反,为每一个bean请求提供一个实例。

3、request:自动把bean设置到request里

4、Session:自动把bean设置到session里

5、global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。

 

9、Spring框架中的单例Beans是线程安全的吗

单实例是线程不安全的,多实例是线程安全的;单线程是线程安全的,多线程是线程不安全的

最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。

多实例耗费资源,最好用单实例使用局部变量

 

10、请举例说明如何在Spring中注入一个Java Collection

Spring提供了四种集合类的配置元素:

<list> :   用来装配的list值。

<set> :    用来装配set的值。

<map>:   用来注入键和值可以为任何类型的键值对。<entry>

<props> : 用来注入键和值都是字符串类型的键值对。<prop>

 

11、解释SpringBean的自动装配

可以使用@Autowired注解来自动装配指定的bean,装配顺序是先byType再byName。还可以结合@Qualifier指定name。

 

12、解释自动装配模式的区别

1、no:Spring默认设置,关闭自动装配,需要使用注解或者标签明确指定依赖关系。

2、byName:根据bean名字来匹配,bean名默认是类名首字母小写。

3、byType:根据bean的类型装配,如果没有的话就抛异常。

4、constructor:构造器装配,如果没有和参数一致的构造器就会抛出异常。

5、autodetect:先根据构造器装配,没找到就根据类型装配

 

13、Spring框架中都用到了哪些设计模式

 

1、代理模式—在AOP和remoting中被用的比较多。

2、单例模式—在spring配置文件中定义的bean默认为单例模式。

3、模板模式—用来解决代码重复的问题。比如 RestTemplate、JdbcTemplate, JpaTemplate。

4、工厂模式—BeanFactory用来创建对象的实例。

5、依赖注入—贯穿于BeanFactory / ApplicationContext接口的核心理念。

6、前端控制器—Spring提供了DispatcherServlet来对请求进行分发。就是有一个中央处理器,对请求进行处理,处理完在跳回去

7、视图帮助(View Helper )—Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。

 

14、Spring事务介绍

Spring有两种事务,编程式和声明式。

编程式就是JDBC的事务管理,这种方式需要自己调commit、rollback控制事务,代码重复且量大。

声明式事务可以通过配置文件配置和注解声明。Spring提供了一个管理事务的基础接口:PlatformTransactionManager,所有持久层框架的事务管理器都是实现这个接口,Spring自身和MyBatis就是通过实现类DataSourceTransactionManager实现事务管理的。

配置过程:引入aop,tx schema,声明事务管理器,将DataSource注入到事务管理器。

定义通知(tx:advice),注入事务管理器,声明需要代理的方法,指定转播特性、是否只读。

最后定义切点(aop:config、aop:pointcut),将切点和通知关联到一起。

DataSource类型(选问):dbcp、c3p0、druid,其中druid提供SQL监控功能。

 

15、Spring传播特性

事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。

1、PROPAGATION_REQUIRED:有事务就用当前事务,没有就创建一个

2、PROPAGATION_SUPPORTS:有事务就用,没有就不用

3、PROPAGATION_MANDATORY:有事务就用,没有就抛出异常

4、PROPAGATION_REQUIRES_NEW:新建一个事务,如果有事务把它挂起来

5、PROPAGATION_NOT_SUPPORTED: 不用事务,有事务也不用

6、PROPAGATION_NEVER:不用事务,如果有事务,则抛出异常。

7、PROPAGATION_NESTED:两个事务一起执行,如果没有就创建一个

Jdbc的事务是自动提交

 

16、什么是AOP,AOP的作用是什么

AOP意思是面向切面编程,是对OOP的一种补充,在运行时,动态地将代码切入到类的指定方法、指定位置上,编程思想就是面向切面的编程。Spring的事务管理就是通过AOP实现的

 

17、AOP里面重要的几个名词概念解释

 

切点(PointCut):切点在Spring中的体现是个支持模糊匹配的表达式,用于匹配符合特定规则的方法,。

连接点(JoinPoint):当某个方法特定的方法被调用时,这个方法调用的位置就是连接点,就是一个触发时机。

通知(Advice):也称为增强处理,在连接点上执行的动作,通知又分为环绕通知,前置通知、后置通知、异常通知等等,不同的通知执行时机也不同,比如前置通知就是在连接点执行之前,后置通知就是连接点执行之后,异常通知就是连接点执行过程中发生异常时触发的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值