Spring常见面试题
-
什么是spring?
Spring是一个开源的分层的javaSE/javaEE的一站式的轻量级的解决方案。[容器框架] -
使用Spring框架的好处是什么?
作用:解决业务逻辑层【Service】与web层和数据访问层之间的松耦合问题。 -
Spring由哪些模块组成?
-
什么是BeanFactory ? BeanFactory 实现举例。
BeanFactory接口表示一个Spring工厂对象【Spring容器对象】,包含了实例化好的java类对象。【管理】
BeanFactory接口有一个常用的子接口ApplicationContext接口,我们通常使用ApplicationContext接口充当Spring工厂对象【Spring容器对象】。
1.ClassPathXmlApplicationContext类 – new ClassPathXmlApplicationContext()可以创建出BeanFactory接口对象/ApplicationContext对象
表示:通过查找类路径加载一个Xml文件创建Spring工厂对象
2. FileSystemXmlApplicationContext类 —new FileSystemXmlApplicationContext可以创建出BeanFactory接口对象/ApplicationContext对象
表示:通过在系统文件类路径中加载一个Xml文件创建Spring工厂对象
BeanFactory接口—Spting容器—用来保存和维护Spring创建的对象【管理】
FactoryBean接口-------------------用来创建java对象【创建】
- 解释AOP模块
spring-aop:面向切面编程
spring-aspects:集成AspectJ
spring-instrument:提供一些类级的工具支持和ClassLoader级的实现,用于服务器spring-instrument-tomcat:针对tomcat的instrument实现
它们的依赖关系
6.Spring配置文件?
名称:推荐使用applicationcontext.xml
位置:一般都在resources目录中
<!-- 配置bean -->
<!-- 通知Sping容器创建类对象 -->
<!--class属性:指定创建对象的java类【包名+类名】-->
<!--id属性:指定对象名称-->
- 什么是Spring IOC 容器?
IoC(Inverse of Control 反转控制): 将java对象创建和维护权利交由Spring工厂进行管理和维护。 - IOC的优点是什么?
java对象创建和维护权利交由Spring工厂进行管理和维护。 - ApplicationContext通常的实现是什么?
1.ClassPathXmlApplicationContext类 – new ClassPathXmlApplicationContext()可以创建出BeanFactory接口对象/ApplicationContext对象
表示:通过查找类路径加载一个Xml文件创建Spring工厂对象 - FileSystemXmlApplicationContext类 —new FileSystemXmlApplicationContext可以创建出BeanFactory接口对象/ApplicationContext对象
表示:通过在系统文件类路径中加载一个Xml文件创建Spring工厂对象 - BeanFactory和 Application contexts 有什么区别?
ApplicationContext接口这是Spring工厂对象是BeanFactory接口的子接口。 - BeanFactory和 FactoryBean 有什么区别?
BeanFactory接口—Spting容器—用来保存和维护Spting创建的对象【管理】
FactoryBean接口-------------------用来创建java对象【创建】
12.什么是Spring的依赖注入?
依赖注入–在调用者类中将被调用者类的对象,添加到调用者类中这个过程就是依赖注入。
在这个过程中被调用者类的对象就是调用者类的依赖对象。
13.Sprting的自动装配策略?
14.有哪些不同类型的DI(依赖注入)方式?
1.基于XML的依赖注入
1.构造方法注入
2.Set方法注入
2.自动注入[自动装配策略]
3.基于注解注入
15.解释Spring支持的几种bean的作用域
singleton: 单例模式【在一个spring容器中,对象只有一个实例。(默认值)】
prototype:多例模式/原型模式【在一个spring容器中,存在多个实例,每次getBean 返回一个新的实例。】
request:该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。【一次请求一个对象】
session:该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。【同一次回话中的对象都是相同的】
global session:该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。【多个session共享一个对象】
15. 哪些是重要的bean生命周期方法? 你能重载它们吗?
Spring工厂对象【Spring容器对象】负责创建对象,初始化对象,销毁对象。
<!-- 无参数构造方法实例化bean的配置 -->
<!-- id:对象名称 -->
<!-- class:被创建对象的java类的包名+类名 -->
<!-- init-method:配置对象的初始化方法 -->
<bean id="student" class="com.click369.javabean.StudentBean" init-method="initStudentBean"></bean>
<!-- 无参数构造方法实例化bean的配置 -->
<!-- id:对象名称 -->
<!-- class:被创建对象的java类的包名+类名 -->
<!-- init-method:配置对象的初始化方法 -->
<!-- destroy-method:配置对象的销毁方法 -->
<bean id="student" class="com.click369.javabean.StudentBean" init-method="initStudentBean" destroy-method="destroyStudentBean"></bean>
16.在 Spring中如何注入一个java集合?
<!-- 创建StudentBean对象,并通过set方式为集合型成员变量赋初始值-->
<bean id="student" class="com.click369.javabean.StudentBean">
<!-- 数组 -->
<property name="stringArray">
<array>
<value>zhangsan</value>
<value>lisi</value>
<value>wangwu</value>
</array>
</property>
<!-- list -->
<property name="stringList">
<list>
<value>西安</value>
<value>北京</value>
<value>上海</value>
</list>
</property>
<!-- set -->
<property name="stringSet">
<set>
<value>javaSE</value>
<value>javaEE</value>
<value>javaME</value>
</set>
</property>
<!-- Map -->
<!-- key属性的值不能是key -->
<!-- value属性的值不能是value -->
<property name="stringMap">
<map>
<entry key="age">
<value>23</value>
</entry>
<entry key="height" value="167.5"></entry>
<entry key="sex" value="男"></entry>
</map>
</property>
<!-- properties -->
<property name="myProperties">
<props>
<prop key="mydirver">com.mysql.jdbc.Driver</prop>
<prop key="myusername">root</prop>
<prop key="mypassword">123456</prop>
</props>
</property>
</bean>
</beans>
17.怎样开启Spring注解装配?
<!-- 开启注解功能 -->
<context:annotation-config/>
<!-- 配置Spring自动扫描包 -->
<context:component-scan base-package="com.click369.javabean"></context:component-scan>
18.Spring注解@Resource和@Autowired区别对比
1、共同点
两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。
2、不同点
(1)@Autowired
@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入
(2)@Resource
@Resource()默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
19.Spring支持的事务管理类型
1.编程式事务管理—手动编写大量的java代码实现事务管理
2.声明式事务管理—就是在Spring的配置文件中通过配置实现事务管理
2.1基于xml配置文件
2.2基于注解
20.Spring面向切面编程(AOP)
AOP (Aspect Oriented Programing) 称为:面向切面编程,它是一种编程思想。
AOP 思想: 基于代理思想,对原来目标对象,创建代理对象,在不修改原对象代码情况下,通过代理对象,调用增强功能的代码【系统需求方法】,从而对原有业务方法进行增强。
AOP的底层是动态代理机制【CGLIB动态代理】。
基于两种动态代理机制: JDK动态代理和CGLIB动态代理。
JDK动态代理:基于接口的代理,会生成目标对象的接口的子对象【实现接口的类】
CGLIB动态代理:基于类的代理,会生成目标对象的子对象。【无论是继承父类还是实现接口所产生的类】
基于XML文件的AOP实现
<aop:config>
<aop:pointcut expression="execution(* com.click369.service.impl.UserServiceImpl.insertService(..))"
id="point1"/>
<aop:pointcut expression="execution(* com.click369.service.impl.UserServiceImpl.updateService(..))"
id="point2"/>
<aop:pointcut expression="execution(* com.click369.service.impl.UserServiceImpl.deleteService(..))"
id="point3"/>
<aop:aspect ref="myAvice">
<aop:before method="savaLog" pointcut-ref="point1"/>
<aop:after-returning method="savaLog" pointcut-ref="point2"/>
<aop:around method="around" pointcut-ref="point3"/>
</aop:aspect>
</aop:config>
基于注解的Aop实现
@Aspect
@Before("execution(* com.click369.service.impl.UserServiceImpl.insertService(..))")
@AfterReturning("execution(* com.click369.service.impl.UserServiceImpl.updateService(..))")
@Around("execution(* com.click369.service.impl.UserServiceImpl.deleteService(..))")
<!-- 开启aop注解 -->
<aop:aspectj-autoproxy />
21.在Spring AOP 中,关注点和横切关注的区别是什么?
poingcut(切入点):对哪些连接点进行拦截的定义。在Spring中指的真正需要被代理(增强)的方法。
22.IoC 和 DI的区别?
IoC(Inverse of Control 反转控制): 将java对象创建和维护权利交由Spring工厂进行管理和维护。
依赖注入–在调用者类中将被调用者类的对象,添加到调用者类中这个过程就是依赖注入。
在这个过程中被调用者类的对象就是调用者类的依赖对象。
依赖注入是基于IoC(Inverse of Control 反转控制)。
23.spring配置bean实例化有哪些方式?
1.1无参数构造方法(开发最常用)
1.2静态工厂方法实例化bean
1.3实例工厂方法实例化bean
1.4FactoryBean接口方式实例化bean
24.Spring的核心类有哪些,各有什么作用?
BeanFactory接口
ApplicationContext接口
ClassPathXmlApplicationContext类
FileSystemXmlApplicationContext类
FactoryBean接口
25.Spring里面applicationContext.xml文件能不能改成其他文件名?
可以,你在web.xml 配置
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/applicationContext*.xml <!-- spring bean文件所在路径 -->
</param-value>
</context-param>