Spring简介
一、Spring是什么
1. Spring框架是一个Java平台,帮助开发人员封装了开发中的基础性的通用问题,让开发人员专注于应用程序的开发
2. Spring的主要模块有:核心容器、数据访问/集成、事务、Web(MVC)、AOP、消息和测试模块
二、控制反转(IOC)和依赖注入(DI)
1. 控制反转:一个对象的实例化B本来是由另一个类A控制的,现在把这个控制权交出去,由别人来控制
2. 依赖注入:对象A依赖另一个对象B,对象B可以在编译阶段就实例化好,并在使用的时候注入到调用方A,而不在调用方A里实例化
3. 依赖注入的方式:构造器注入(通过构造函数的参数传入)、setter方法注入(通过setter方法的参数传入)、接口注入(Spring中不使用这种方式)
三、Spring框架中的IoC容器
1. IoC容器通过读取配置来创建对象,并管理对象的生命周期
2. 两种IoC容器
a. BeanFactory:可以配置任何类型的对象,将bean实例化,是Spring IoC的具体实现
b. ApplicationContext:对BeanFactory进行了扩展,支持事件和监听器
ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”); //相对路径
ApplicationContext context = new FileSystemResource(“C:\a\b\c\bean.xml”); //绝对路径
3. 实现机制:工厂模式+反射
四、Spring Bean
1. 在配置文件中配置,由Spring IoC容器创建实例,而不是由应用程序创建实例,是程序的主要的对象
2. 三种配置方式
a. 基于XML的配置,<bean>标签配置,指定某个类是bean
<bean id="aClass" class="com.test.AClass"/>
b. 基于注解的配置,在类上使用注解,在配置文件里自动扫描,即开启自动装配bean
<context:annotation-config/> 也打开了注解的自动装配
<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>
或者
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
c. 基于Java API的配置:在Java类上使用@Bean & @Configuration注解
3. 内部bean:当一个类A里使用了另一个类B,将他们声明为bean时,将B用作A的属性,B声明的bean为内部bean
4. 作用域:最常用的是singleton和prototype
a. singleton:每个bean都是单例,是默认的作用域
b. prototype:每次请求都会产生一个新的实例
c. 单例bean某种程度上是线程安全的,但bean需要有状态时,不是线程安全的
五、Spring Bean的装配
1. bean的装配:Spring容器使用依赖注入把bean都绑定在一起
2. 自动装配:通过检查BeanFactory的内容,让Spring自动解析bean的协作者
3. 自动装配的模式
a. 默认为no,没有自动装配,使用显式bean引用,进行装配
b. byName,根据bean的名称注入对象依赖项
c. byType,根据类型注入对象依赖项
d. 构造函数
e. 自动检测
<context:annotation-config/>
六、Spring Bean的生命周期:创建->使用->销毁
七、注解
1. @Required:用于setter方法,必须要设置此属性
2. @Autowired:自动装配依赖的对象,是Spring级别的,可以作用于成员变量、setter方法、类的构造函数
3. @Qualifier:有多个相同类型的bean时,指定其中一个bean来消除歧义
4. @Resource = @Autowired + @Qualifier,按名称来自动装配依赖的对象,是JDK级别的
5. @RestController = @ResponseBody + @Controller,@RestController只返回body里的内容,不能返回页面(jsp/html)和跳转
6. list类型自动注入:通过@Autowired,Spring会自动从容器中取出N个相同类型的bean装配到List类型中,从而简化了依赖注入的过程
7. Map类型自动注入: 通过@Autowired,Spring会自动从容器中取出N个相同类型的bean以及bean的名称,注入到Map类型的converters中,此时该map得key对应为bean的名称,value则为对应bean对象
8. @RequestBody, 根据request header Content-Type的值来决定是否使用;@ResponseBody,非html的数据,例如json/xml
9. 执行顺序:@Constructor->@Autowired->@PostConstruct,并且@PostConstruct必须用于无参构造函数
八、事务
1. 声明式事务,使用注解@Transaction或者XML配置
2. 编程式事务,通过代码实现事务
九、用到的设计模式
1. 工厂模式:BeanFactory
2. 单例模式:Spring Bean默认实例化为单例对象
3. 代理模式:AOP
4. 模板方法:JDBC