Spring是什么
Spring是一个一站式轻量级的开源框架
Spring Bean的三种配置方式:xml、注解和Java
@Configuration
public class BeanConfig {
@Bean
public BeanFactory beanFactory(){
return new BeanFactoryImpl();
}
}
Spring的核心:
控制反转(IoC)和面向切面(AOP)
AOP代理主要分为静态代理和动态代理
AOP实现的关键在于 代理模式,AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ;
动态代理则以Spring AOP为代表。
(1)AspectJ是静态代理的增强,所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类
因此也称为编译时增强,他会在编译阶段将AspectJ(切面)织入到Java字节码中
运行的时候就是增强之后的AOP对象。
(2)Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码
而是每次运行时在内存中临时为方法生成一个AOP对象
这个AOP对象包含了目标对象的全部方法
并且在特定的切点做了增强处理,并回调原对象的方法。
Spring中AOP动态代理的两种实现方式:
JDK动态代理和CGLIB动态代理
Spring的优点:
Spring将对象之间的依赖关系交由框架处理,减低组件的耦合性;
Spring对于主流的应用框架提供了非常方便的集成支持;
Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付;
Spring框架设计精妙,Spring源码是经典的学习范例
Spring的七大组成模块:
Spring Core:核心类库,提供IOC服务;
Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);
Spring AOP:AOP服务;
Spring DAO:对JDBC的抽象,简化了数据访问异常的处理;
Spring ORM:对现有的ORM框架的支持;
Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;
Spring MVC:提供面向Web应用的Model-View-Controller实现
Spring事务的实现方式和实现原理:
Spring事务的本质其实就是数据库对事务的支持
没有数据库的事务支持,spring是无法提供事务功能的。
真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。
Spring的IOC有三种注入方式 :
构造器注入、setter方法注入、注解注入
Spring框架支持以下五种bean的作用域:
singleton : bean在每个Spring ioc 容器中只有一个实例。
prototype:一个bean的定义可以有多个实例。
request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
缺省的Spring bean 的作用域是Singleton.
Spring支持两种类型的事务管理:
编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。
大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。
SpringMVC 请求处理流程
1、 用户发送请求被前端控制器DispatcherServlet捕获
2、 DispatcherServlet收到请求调用处理器映射器HandlerMapping。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成映射信息
返回给DispatcherServlet。
4、 DispatcherServlet调用处理器适配器HandlerAdapter。
5、 处理器适配器根据映射信息适配调用具体的处理器(Controller,也叫后端控制器)
Controller执行完成返回ModelAndView给DispatcherServlet。
6、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
ViewReslover解析后返回具体视图view。
7、 DispatcherServlet根据视图View进行渲染视图并且响应给用户。
整个过程都是以DispatcherServlet为中心进行的。
你怎样定义类的作用域?
当定义一个<bean> 在Spring里,我们还能给这个bean声明一个作用域。它可以通过bean 定义中的scope属性来定义。如,当Spring要在需要的时候每次生产一个新的bean实例,bean的scope属性被指定为prototype。 另一方面,一个bean每次使用的时候必须返回同一个实例,这个bean的scope 属性 必须设为 singleton。
解释Spring支持的几种bean的作用域
Spring框架支持以下五种bean的作用域:
singleton : bean在每个Spring ioc 容器中只有一个实例。
prototype :一个bean的定义可以有多个实例。
request :每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。 session :在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
global-session :在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
缺省的Spring bean 的作用域是Singleton.
Spring框架中的单例bean是线程安全的吗?
不,Spring框架中的单例bean不是线程安全的。
解释Spring框架中bean的生命周期
PS:可以借鉴Servlet的生命周期,实例化、初始init、接收请求service、销毁destroy。
Spring的核心容器会首先从XML 文件中读取bean的定义,并实例化bean。
然后根据bean的定义填充所有的属性。
然后根据bean内部实现了哪些接口依次调用一堆方法,最后初始化,最后的最后destroy。
如果bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanName方法。
如果Bean 实现了 BeanFactoryAware 接口, Spring传递beanfactory 给setBeanFactory 方法。
如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。
如果bean实现IntializingBean了,调用它的afterPropertySet方法,
如果bean声明了初始化方法,调用此初始化方法。
如果有BeanPostProcessors 和bean 关联,这些bean的postProcessAfterInitialization() 方法将被调用。
如果bean实现了 DisposableBean,它将调用destroy()方法。
哪些是重要的bean生命周期方法? 你能重载它们吗?
有两个重要的bean 生命周期方法,第一个是setup ,
它是在容器加载bean的时候被调用。第二个方法是 teardown 它是在容器卸载类的时候被调用。
The bean 标签有两个重要的属性(init-method和destroy-method)。
用它们你可以自己定制初始化和注销方法。它们也有相应的注解(@PostConstruct和@PreDestroy)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。