关于Spring的笔试题(四)

1. 谈谈你对Spring事务管理机制的理解

Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交,那在没有Spring帮我们管理事务之前,我们要怎么做

1. 获取连接:Connection con = DriverManager.getConnection()

2. 开启事务:开启事务:con.setAutoCommit

3. 执行CRUD

4. 提交事务或者回滚

5. 关闭连接

使用了事务管理之后可以不用写第24两步,它由Spring自动完成

Spring事务管理的四个优点:

1. 提供一致的对于不同的事务管理的API

2. 支持声明式事务管理(重点)

3. 编程事务管理(在开发中应用比较少)

4. 优秀的整合与Spring的数据访问

Spring事务管理主要提供了三个接口来完成

1. org.springframework.transaction.PlatformTransactionManager

这是一个事务管理器,可以来选择相关的平台(jdbc hibernate jpa…)

2. TransactionDefinition

它定义事务的一些相关信息 例如 隔离 传播 超时 只读

3. TransactionStatus

它主要描述事务具体的运行状态


2. 解释一下事物的传播

spring事务的传播属性,就是定义在存在多个事务同时存在的时候,spring应该如何处理这些事务的行为。这些属性在TransactionDefinition中定义

 

REQUIRED ,这个是默认的属性

Support a current transaction, create a new one if none exists.

如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。

被设置成这个级别时,会为每一个被调用的方法创建一个逻辑事务域。如果前面的方法已经创建了事务,那么后面的方法支持当前的事务,如果当前没有事务会重新建立事务。  

 

3. 说一下事物的四种隔离级别的作用

事务的隔离级别也分为四种,由低到高依次分别为:read uncommited(读未提交)、read commited(读提交)、read repeatable(读重复)、serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

 


4. 怎样开启注解装配?

注解装配默认情况下在Spring容器中是不开启的。Spring可以使用xml配置文件来装配bean,也可以使用注解来装配Bean开启注解扫描的方式有两种,一种是<context:annotation-config/>,另一种是<context:component-scan>;

<context:annotation-config>:注解扫描是针对已经在Spring容器里注册过的Bean

<context:component-scan>:不仅具备<context:annotation-config>的所有功能,还可以在指定的package下面扫描对应的bean


5. 讲一下你知道的事务管理方式

1. 编码方案,不建议使用,它具有侵入性。在原有的业务代码基础上去添加事务管理代码

2. 声明式事务控制,基于AOP对目标进行代理,添加around环绕通知。

这种方案,它不具有侵入性,不需要修改原来的业务代码

基于xml配置声明式事务管理方案

基于annotation声明式事务管理方案

 

Spring常用注解总结:

1@Autowired

@Autowired,自动装配,其作用是为了消除代码Java代码里面的getter/setterbean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。

@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。

@Autowired注解的意思就是,Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去。

有一个细节性的问题是,假如bean里面有两个propertyjava里面又去掉了属性的getter/setter并使用@Autowired注解标注这两个属性那会怎么样?答案是Spring会按照xml优先的原则去java中寻找这两个属性的getter/setter,导致的结果就是初始化bean报错。 

2Qualifier(指定注入Bean的名称)

如果容器中有一个以上匹配的Bean,则可以通过@Qualifier注解限定Bean的名称

举个例子:

定义一个Car接口两个实现类BMWCarBenzCar再写一个CarFactory,引用car(这里先不用@Qualifier注解),写一个测试类,运行一下,一定是报错的,Car接口有两个实现类,Spring并不知道应当引用哪个实现类。

出现这种情况通常有两种解决办法:
(1)、在配置文件中删除其中一个实现类,Spring会自动去base-package下寻找Car接口的实现类,发现Car接口只有一个实现类,便会直接引用这个实现类。
(2)、实现类就是有多个该怎么办?此时可以使用@Qualifier注解来指定Bean的名称:

 

3、Resource

@Resource的装配顺序:
(1)@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
(2)指定了name或者type则根据指定的类型去匹配bean
(3)指定了nametype则根据指定的nametype去匹配bean,任何一个不匹配都将报错

@Autowired@Resource两个注解的区别:
(1)@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
(2)@AutowiredSpring的注解,@ResourceJ2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了

Spring属于第三方的,J2EEJava自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。

常用注解:

@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean
@Scope注解 作用域
@Lazy(true) 表示延迟初始化
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定scope作用域的(用在类上)
@PostConstruct用于指定初始化方法(用在方法上)
@PreDestory用于指定销毁方法(用在方法上)
@DependsOn:定义Bean初始化及销毁时的顺序
@Primary:自动装配时当出现多个Bean候选者时,被注解为@PrimaryBean将作为首选者,否则将抛出异常
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:
@Autowired @Qualifier("personDaoBean") 存在多个实例配合使用
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
@PostConstruct 初始化注解
@PreDestroy 摧毁注解 默认 单例  启动就加载
@Async异步方法调用

阅读更多
文章标签: spring 笔试面试
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭