Spring面试题

1、为什么使用Spring?

  1. 提供依赖注入(通过依赖注入的方式组装对象),使得开发的系统中的组件之间的耦合性降低(松耦合)。
  2. 不使用 J2EE 中的技术,也可以通过声明的方式来获得一些服务。
  3. spring 是一个扩展性非常强的框架,很容易跟其他的框架进行集成,而且可以简化被集成的框架的使用。
  4. 采用 spring 开发的应用扩展性非常的好,而且开发出来的类都是可重用的。
2、Spring  IOC(控制反转)?
控制反转:将程序原来自己构造对象的权利,交给IOC容器来构造,需要一个对象从容器中获取一个对象(对象的构造被反转)。
3、DI(依赖注入)?
依赖注入:IOC容器为程序提供依赖对象,返回对象所依赖对象一同提供。
4、Spring创建bean的方法?

方式一: 使用类构造器实例化对象

<span style="white-space:pre">	</span><!-- 方式一  使用构造器(无参数)实例化对象  -->
<bean id="bean1" class="cn.itcast.spring.b_instance.Bean1" />
方式二: 使用静态工厂 静态方法,对对象实例化
<span style="white-space:pre">	</span><!-- 方式二 使用静态工厂实例化对象 -->
<!-- 调用 工厂的 factory-method 返回对象 -->
<bean id="bean2" class="cn.itcast.spring.b_instance.Bean2Factory" factory-method="getBean2" />

方式三: 使用实例工厂 实例方法 对对象实例化

<span style="white-space:pre">	</span><!-- 方式三 使用实例工厂实例化对象 -->
<!-- 先实例化工厂 -->
<bean id="bean3Factory" class="cn.itcast.spring.b_instance.Bean3Factory" />
<!-- 再通过工厂对象的实例方法,构造目标对象 -->
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3" />

应用场景: 大多数情况,可以通过构造器直接实例化, 只有在对象构造过程非常复杂的情况下,才会采用工厂实例化的方式 

5、依赖注入(DI)的三种方式?
1、 setter 方法注入: spring 支持
如果在配置一个 bean 时,采用的注入方式是 setter 方法注入,那么 spring 容器在创建 bean 时首先调用 bean 的无参构造器,然后调用 bean 的 setter 方法把它所依赖的对象注入进来。

2、 构造器注入: spring 支持
如果在配置一个 bean(bean 类是标准的 javabean)时,采用的注入方式是构造器注入,那么 spring 容器在创建 bean 时调用有参的构造器,并且把它所依赖的对象注入进去。

3、 接口注入: spring 不支持
6、Spring容器工厂?
BeanFactory 和 ApplicationContext 接口
ApplicationContext 是 BeanFactory 子接口,BeanFactory 才是Spring框架最核心工厂接口。
ApplicationContext 是对BeanFactory 接口扩展, 企业开发很少直接使用BeanFactory
ApplicationContext 会在容器初始化时,对其中管理Bean对象进行创建, BeanFactory 会在对象获取时才进行初始化 。
7、Bean的生命周期?

可以通过 init-method属性配置 Bean对象初始化执行方法,destory-method属性配置Bean对象销毁的方法
(初始化方法和构造方法 有区别? 构造方法作用申请空间,为对象基本属性初始化 , 初始化方法 对象复杂构造过程 , java语言建议将对象复杂构造过程单独抽取 初始化方法 )

在对象构造后,立即执行初始化init , 默认没有执行destroy 销毁方法

8、使用注解配置?

第一步: 新建项目, 导入jar包
第二步: 在需要spring创建对象类上面 添加@Component (注解 来自spring2.5 )

第三步: 配置注解Bean所在package 

引入context命名空间 

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

配置注解对象所在包

<!-- 通知spring容器 ,注解Bean所在位置  -->
<context:component-scan base-package="cn.itcast.spring" />

Spring为了细分组件的功能,在提供@Component注解,提供三个等价的注解 

@Controller 控制器,表示web层组件  ---- action

@Service 业务类,表示业务层组件 --- service

@Repository 表示持久层的组件 --- dao

9、Bean属性的依赖注入?

在spring2.5 版本,没有提供基本类型属性注入 ,但是spring3.0引入注解@Value

10、自动装配?

spring2.5 提供自动装配注解 @Autowired
@Autowired 默认按照类型进行注入 (缺点: 如果容器中存在两个对象,是相同类型, @Autowired 无法注入 )
@Autowired + @Qualifier 指定注入Bean的id 

Spring支持JSR-250规范,引入@Resource ,功能和@Autowired 相同 

总结:

// 方案一: spring3.0 @value 支持spEL
@Value("#{car}")

// 方案二: spring2.5 使用@Autowired 自动装配
@Autowired
@Qualifier("car")

// 方案三: JSR-250 @Resource注解等价于 @Autowired
@Resource(name = "car")
private Car car;

11、Web中使用Spring?

在项目导入 spring-web-3.2.0.RELEASE.jar

第一步:配置监听器

<!-- 监听器,初始化Spring容器对象 -->
<listener> 
<span style="white-space:pre">	</span><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

默认加载 /WEB-INF/applicationContext.xml
第二步: 配置spring文件位置

</pre><p><pre name="code" class="html"><!-- 修改spring配置文件位置 -->
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>classpath:applicationContext.xml</param-value>
  </context-param>

第三步:修改Servlet代码
// 1、 创建工厂
ApplicationContext applicationContext = (ApplicationContext) this.getServletContext()
<span style="white-space:pre">	</span>.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
上面代码也可以写为 
ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());

12、什么是AOP?

Aspect Oriented Programming 面向切面编程
业界 AOP 实际上 OOP (面向对象编程 ) 延伸 ---- OOP编程语言、 AOP设计思想

AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)


13、AOP相关术语?

Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.
Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.
Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
Target(目标对象):代理的目标对象
Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程.
spring采用动态代理织入,而AspectJ采用编译期织入和类装在期织入
Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
Aspect(切面): 是切入点和通知(引介)的结合

14、Spring事务管理一些类?

平台事务管理器 PlatformTransactionManager  
在使用Spring管理事务,需要为不同持久层技术实现,提供不同事务管理器(实现类)

对Jdbc、ApacheDbUtils、JdbcTemplate、MyBatis 进行事务管理
---- DataSourceTransactionManager
对Hibernate 进行事务管理
---- HibernateTransactionManager

15、事务的隔离机制?


DEFAULT 每种数据库提供默认隔离级别 mysql REPEATABLE_READ、oracle READ_COMMITTED
READ_UNCOMMITTED:引发所有隔离问题(脏读、不可重复读、虚读)
READ_COMMITTED:解决脏读, 引发(不可重复读、虚读)
REPEATABLE_READ : 解决脏读、不可重复读、 引发虚读
SERIALIZABLE :事务不存在并发性,阻止所有并发问题发生 (不推荐)

16、事务的传播行为?


17、Spring事务管理两种方式?

编程式事务管理 和 声明式事务管理
1、 编程式事务
,需要代码侵入 ,使用TransactionTemplate 模板类 (企业不用)

transactionTemplate.execute(new TransactionCallbackWithoutResult(){
T doInTransaction(){
// 数据库操作代码
}
});
doInTransaction方法只要发生异常,事务回滚,没有异常,事务提交
2、 声明式事务管理 ,无需要修改原来代码,只需要配置,为目标代码添加事务管理 , AOP底层实现 --- 企业推荐

18、Spring使用声明式事务?

说明:事务 依赖 AOP , AOP需要定义切面, 切面由Advice(通知) 和 PointCut(切点) 组成 !
---- Spring框架内部,提供事务管理Advice


第一步: Spring 为了简化事务配置,引入tx标签 ,在applicationContext.xml 引用tx 的命名空间

第二步: 使用tx标签,配置Advice 

事务管理器:

Advice:


第三步:配置切面


Spring事务管理Advice,是基于Spring 传统AOP, 所以使用aop :advisor配置

19、如何使用注解实现声明式事务管理?

第一步: 在配置文件中, 激活使用注解进行事务管理

第二步: 在需要管理事务的业务类(业务方法)上添加@Transactional 注解


可以在注解中配置事务属性 









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值