一、什么是Spring?
目的:解决企业应用开发的复杂性,提升开发效率
功能:使用基本的JavaBean代替EJB,为企业提供更多的应用功能
范围:任何Java应用
Spring是一个轻量级的非侵入式的控制反转(IoC)和面向切面(AOP)的容器框架。
二、Spring的优点
- 轻量:从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。
- 高内聚低耦合:将所有对象创建和依赖关系维护,交给Spring管理。一个对象依赖其它对象会通过被动的方式传递进来,而不需要这个对象自己创建或者查找依赖对象。容器在对象初始化时不等对象请求就主动将依赖传递给它。
- 面向切面:Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发。应用对象只实现它们的业务逻辑。它们并不负责其它的系统级关注点,例如日志或事务支持
- 声明式事务:只需要通过配置就可以完成对事务的管理,而无需手动编程。
- 优雅的程序测试:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
- 更加方便的集成其他框架
三、Spring的IOC
IOC原理:
- Spring中的 org.springframework.beans 包和 org.springframework.context包构成了Spring框架IoC容器的基础。
- org.springframework.beans.factory.BeanFactory 是Spring IoC容器的具体实现,用来包装和管理前面提到的各种bean。BeanFactory接口是Spring IoC 容器的核心接口。
- IOC控制反转:就是将原本在程序中手动创建对象的控制权,交由Spring框架管理。主要是通过反射+dom4j实现
- DI依赖注入:指Spring创建对象的过程中,将对象依赖属性通过配置进行注入。
注入的方式:
- 构造器注入
- Setter方法注入
- 接口注入
总结一句话:IOC就是Spring容器在创建对象的过程中,将对象依赖属性通过配置进行注入,然后交由spring容器进行管理,spring容器通过BeanFactory来包装和管理创建的bean对象。
5.BeanFactory 接口和 ApplicationContext 接口有什么区别 ?
BeanFactory 可以理解为含有bean集合的工厂类。BeanFactory 包含了各种bean的定义,以便在接收到客户端请求时将对应的bean实例化。
BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。
①ApplicationContext 接口继承BeanFactory接口,Spring核心工厂是BeanFactory ,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean。
②ApplicationContext是对BeanFactory扩展
6.spring配置bean实例化有哪些方式?
使用类构造器实例化
使用静态工厂方法实例化(简单工厂模式)
使用实例工厂方法实例化(工厂方法模式)
7.将Spring配置到应用开发中有以下三种方式
1)基于XML的配置
Spring的XML配置方式是使用被Spring命名空间的所支持的一系列的XML标签来实现的。Spring有以下主要的命名空间:context、beans、jdbc、tx、aop、mvc和aso。
2)基于注解的配置
@Required:该注解应用于设值方法。
@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
@Qualifier:该注解和@Autowired注解搭配使用,用于消除特定bean自动装配的歧义。
3)基于Java的配置
Spring对Java配置的支持是由@Configuration注解和@Bean注解来实现的。由@Bean注解的方法将会实例化、配置和初始化一个新对象,这个对象将由Spring的IoC容器来管理。@Bean声明所起到的作用与 元素类似。被@Configuration所注解的类则表示这个类的主要目的是作为bean定义的资源。被@Configuration声明的类可以通过在同一个类的内部调用@bean方法来设置嵌入bean的依赖关系。
8.Spring Bean的生命周期?
Bean的生命周期由BeanFactory来控制,由两组回调(call back)方法组成。
初始化之后调用的回调方法。
销毁之前调用的回调方法。
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的Aop
1.AOP(Aspect-Oriented Programming,面向方面(切面)编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。
2.经典应用:主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等
3.aop底层采用 jdk 的动态代理Proxy实现。
AOP术语:
切面(Aspect) :官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”。
连接点(Joinpoint) :程序执行过程中的某一行为。
通知(Advice) :“切面”对于某个“连接点”所产生的动作。
切入点(Pointcut) :匹配连接点的断言,在AOP中通知和一个切入点表达式关联。
目标对象(Target Object) :被一个或者多个切面所通知的对象。
AOP代理(AOP Proxy) 在Spring AOP中有两种代理方式,JDK动态代理和CGLIB代理。
关注点,重复代码就叫做关注点;
切面,关注点形成的类,就叫切面(类)!抽取重复代码
切入点,执行目标对象方法,动态植入切面代码, 拦截哪些方法
注解方式实现AOP编程
使用注解
@Aspect 指定一个类为切面类
@Pointcut(“execution(* com.itmayiedu.service.UserService.add(…))”) 指定切入点表达式
@Before(“pointCut_()”) 前置通知: 目标方法之前执行
@After(“pointCut_()”) 后置通知:目标方法之后执行(始终执行)
@AfterReturning(“pointCut_()”) 返回后通知: 执行方法结束前执行(异常不执行)
@AfterThrowing(“pointCut_()”) 异常通知: 出现异常时候执行
@Around(“pointCut_()”) 环绕通知: 环绕目标方法执行
五、Spring容器中Bean的作用域
singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例
prototype:多例模式(原型模式),每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例(scope=“prototype”)
request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例,只有在Web应用中使用Spring时,该作用域才有效
session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例,同样只有在Web应用中使用Spring时,该作用域才有效
globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。
典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效
六、Spring MVC的核心组件
DispatcherServlet:中央控制器,把请求给转发到具体的控制类
Controller:具体处理请求的控制器
HandlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略
ModelAndView:服务层返回的数据和视图层的封装类
ViewResolver:视图解析器,解析具体的视图
Interceptors :拦截器,负责拦截我们定义的请求然后做处理工作
七、@Resource与@Autowired区别
@Autowired与@Resource都可以用来装配bean
@Autowired默认按类型装配,也可以按名称注@Autowired(required=false) @Qualifier(“baseDao”)
@Resource默认安照名称进行装配
@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
八、Spring 事务
1.基于 @Transactional 的声明式事务管理,xml,注解。
2.编程式事物,自己手动控制事务
Spring 事务传播行为(7大传播行为)
定义:指定是Spring中一个事务方法调用另一个事务方法时处理的行为
Require:支持当前事务,如果没有事务,就建一个新的,这是最常见的;
Supports:支持当前事务,如果当前没有事务,就以非事务方式执行;
Mandatory:支持当前事务,如果当前没有事务,就抛出异常;
RequiresNew:新建事务,如果当前存在事务,把当前事务挂起;
NotSupported:以非事务方式执行操作,如果当前存在事务,就把事务挂起;
Never:以非事务方式执行,如果当前存在事务,则抛出异常。
Nested:新建事务,如果当前存在事务,把当前事务挂起。与RequireNew的区别是与父事务相关,且有一个savepoint。
九、springMVC工作原理
SpringMvc是基于过滤器对servlet进行了封装的一个框架,我们使用的时候就是在web.xml文件中配置DispatcherServlet类;SpringMvc工作时主要是通过DispatcherServlet管理接收到的请求并进行处理。
具体执行流程如下:
SpringMVC工程流程描述
- 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
- DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象,最后以HandlerExecutionChain对象的形式返回;
- DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。
- 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。
- Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
- 根据返回的ModelAndView,选择一个适合的ViewResolver返回给DispatcherServlet
- ViewResolver 结合Model和View,来渲染视图
- 将渲染结果返回给客户端。