136.请解释Spring Bean的生命周期?
首先说一下Servlet的生命周期: 实例化, 初始init, 接收请求service, 销毁destroy; Spring上下文中的Bean生命周期也类似, 如下: 1.实例化一个Bean 也就是我们常说的new; 2.按照Spring上下文 对实例化的Bean进行配置 也就是IOC注入; 3.如果这个Bean已经实现了BeanNameAware接口, 会调用它实现的 setBeanName(String)方法, 此处传递的就是Spring配置文件中Bean的id值; 4.如果这个Bean已经实现了BeanFactoryAware接口, 会调用它实现的 setBeanFactory(setBeanFactory(BeanFactory) 传递的是Spring工厂自身 可以用这个方式来获取其它Bean, 只需在Spring配置文件中 配置一个普通的Bean就可以; 5.如果这个Bean已经实现了 ApplicationContextAware接口, 会调用setApplicationContext(ApplicationContext)方法, 传入Spring上下文 同样这个方式也可以实现步骤4的内容, 但比4更好, 因为ApplicationContext是BeanFactory的子接口, 有更多的实现方法 6.如果这个Bean关联了 BeanPostProcessor接口, 将会调用 postProcessBeforeInitialization(Object obj, String s)方法, BeanPostProcessor 经常被用作是Bean内容的更改, 并且由于这个是在Bean初始化结束时 调用那个的方法, 也可以被应用于内存或缓存技术; 7.如果Bean在Spring配置文件中 配置了init-method属性 会自动调用其配置的初始化方法。 8.如果这个Bean关联了BeanPostProcessor接口, 将会调用 postProcessAfterInitialization(Object obj, String s)方法、; 注:以上工作完成以后就可以应用这个Bean了, 那这个Bean是一个Singleton的, 所以一般情况下 们调用同一个id的Bean会是 在内容地址相同的实例, 当然在Spring配置文件中 也可以配置非Singleton。 9.当Bean不再需要时, 会经过清理阶段, 如果Bean实现了DisposableBean这个接口, 会调用那个其实现的destroy()方法; 10.最后, 如果这个Bean的Spring配置中 配置了destroy-method属性, 会自动调用其配置的销毁方法。 另外我们这里描述的是应用Spring 上下文Bean的生命周期, 如果应用Spring的工厂 也就是BeanFactory的话去掉第5步就Ok了。
137.介绍下Spring的主要模块?
Spring AOP:
Spring的关键组件之一是AOP框架。
AOP在Spring中使用:
提供声明性的企业服务,
特别是作为EJB声明式服务的替代品。
最重要的服务是声明式事务管理,
它建立在Spring的事务抽象之上。
允许用户实现自定义的切面,
补充他们使用AOP的OOP的使用。
Spring ORM:
ORM包与数据库访问有关。
它为流行的对象关系映射api提供集成层,
包括JDO、Hibernate和iBatis。
Spring Web:
web应用程序开发堆栈,
其中包括Spring MVC。
Spring DAO:
Spring的DAO(Data Access Object)
支持主要用于使用JDBC、
Hibernate或JDO等
技术标准化数据访问工作。
Spring Context:
此包构建在bean包之上,
以增加对消息源的支持和观察者的设计模式支持,
以及应用程序对象使用一致的
API获得资源的能力。
Spring Web MVC:
这是为web应用程序
提供MVC实现的模块。
Spring Core:
核心包是Spring框架中最重要的组件。
该组件提供依赖性注入特性。
BeanFactory提供了一种工厂模式,
它将诸如初始化、
创造和访问对象
与实际程序逻辑的访问分离开来。
138.Spring事务的种类和各自的区别?
spring支持 编程式事务管理 声明式事务管理 两种方式: 1.编程式事务管理使用TransactionTemplate 或者直接使用底层的PlatformTransactionManager。 对于编程式事务管理, spring推荐使用TransactionTemplate。 2.声明式事务管理建立在AOP之上的。 其本质是对方法前后进行拦截, 然后在目标方法开始之前创建或者加入一个事务, 在执行完目标方法之后 根据执行情况提交或者回滚事务。 声明式事务最大的优点 就是不需要通过编程的方式管理事务, 这样就不需要在业务逻辑代码中 掺杂事务管理的代码, 只需在配置文件中 做相关的事务规则声明 或通过基于@Transactional注解的方式 便可以将事务规则应用到业务逻辑中。 3.显然声明式事务管理要优于编程式事务管理, 这正是spring倡导的非侵入式的开发方式。 声明式事务管理使业务代码不受污染, 一个普通的POJO对象, 只要加上注解就可以获得完全的事务支持。 和编程式事务相比, 声明式事务唯一不足地方是, 后者的最细粒度只能作用到方法级别, 无法做到像编程式事务 那样可以作用到代码块级别。
139.说说spring的事务传播行为?
spring事务的传播行为 说的是当一个方法调用另一个方法时, 事务该如何操作。 1.PROPAGATION_REQUIRED: 如果当前没有事务, 就创建一个新事务, 如果当前存在事务, 就加入该事务, 该设置是最常用的设置。 2.PROPAGATION_SUPPORTS: 支持当前事务, 如果当前存在事务, 就加入该事务, 如果当前不存在事务, 就以非事务执行。‘ 3.PROPAGATION_MANDATORY: 支持当前事务, 如果当前存在事务, 就加入该事务, 如果当前不存在事务, 就抛出异常。 4.PROPAGATION_REQUIRES_NEW: 创建新事务, 无论当前存不存在事务, 都创建新事务。 5.PROPAGATION_NOT_SUPPORTED: 以非事务方式执行操作, 如果当前存在事务, 就把当前事务挂起。 6.PROPAGATION_NEVER: 以非事务方式执行, 如果当前存在事务, 则抛出异常。 7.PROPAGATION_NESTED: 如果当前存在事务, 则在嵌套事务内执行。 如果当前没有事务, 则执行与PROPAGATION_REQUIRED类似的操作。
140.Spring事务的实现方式和实现原理
1.划分处理单元——IOC: 由于spring解决的问题是 对单个数据库进行局部事务处理的, 具体的实现首相用spring中的IOC 划分了事务处理单元。 并且将对事务的各种配置 放到了ioc容器中 设置事务管理器, 设置事务的传播特性及隔离机制。 2.AOP拦截需要进行事务处理的类: Spring事务处理模块 是通过AOP功能来实现声明式事务处理的, 具体操作 比如事务实行的配置和读取, 事务对象的抽象, 用TransactionProxyFactoryBean接口 来使用AOP功能, 生成proxy代理对象, 通过TransactionInterceptor完成 对代理方法的拦截, 将事务处理的功能 编织到拦截的方法中。 读取ioc容器事务配置属性, 转化为spring事务处理 需要的内部数据结构 TransactionAttributeSourceAdvisor 转化为TransactionAttribute表示的数据对象。 3.对事物处理实现 事务的生成、提交、回滚、挂起: spring委托给具体的事务处理器实现。 实现了一个抽象和适配。 适配的具体事务处理器: DataSource数据源支持、 hibernate数据源事务处理支持、 JDO数据源事务处理支持, JPA、JTA数据源事务处理支持。 这些支持都是通过设计PlatformTransactionManager、 AbstractPlatforTransaction 一系列事务处理的支持。 为常用数据源支持提供了 一系列的TransactionManager。 结合: PlatformTransactionManager实现了 TransactionInterception接口, 让其与TransactionProxyFactoryBean结合起来, 形成一个Spring声明式事务处理的设计体系。