1. Spring是什么
Spring是分层的Java SE/EE应用的full-stack
级开发框架
以IoC(Inversion of Control)
和AOP(Aspect Oriented Programming)
为内核,提供了展现层Spring MVC和持久层Spring JDBC以及义务层事务管理等众多的企业级应用技术.
还能整合开源世界众多注明的第三方框架和类库. 逐渐成为使用最多的Java EE企业应用开源框架
2. Spring的优势
- 方便解耦,简化开发
通过Spring提供的IoC容器, 可以将对象间的依赖关系交由Spring进行控制,避免硬编码缩成的国过度程序耦合
用户也不必再为单例模式型, 属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用
-
AOP编程的支持
通过Spring的AOP功能, 方便进行面向切面的编程, 许多不容易使用的传统OOP实现的功能可以通过AOP轻松应付 -
声明事务式的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理 -
方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作, 测试不再是昂贵的操作,而是随手可做的事情’ -
方便集成各种优秀的框架
Spring可以降低各种框架的使用难度, 提供对各种优秀框架(Struts, Hibernate, Hessian, Quartz等)的直接支持 -
降低Java EE API的使用难度
Spring对Java EE(如JDBC, Java Mail, 远程调用等)进行了薄薄的封装, 是这些API使用难度大为降低 -
Java源码是经典的学习范例
Spring的源代码设计精妙, 结构清晰, 匠心使用, 处处体现着大师对Java设计模式灵活运用及对Java技术的高深造诣. 它的源代码无意是Java技术的最佳实践的翻译
3.Spring的体系结构
3.1 耦合和解耦
-
耦合—程序间的依赖关系
包括:- 类之间的依赖
- 方法间的依赖
-
解耦—降低程序间的依赖关系
实际开发中应该做到编译器不依赖, 运行时才依赖
解耦思路(JDBC解耦
):
- 使用反射来创建对象, 避免使用
new
关键字 - 通过读取配置文件来获取要创建的对象全限定类名
3.2 控制反转(IoC)
把创建对象的权利交给框架,是框架的重要特征, 并非面向对象编程
的专用技术.它包括依赖注入(Dependency Injection--DI
)和依赖查找(Dependency Lookup
)
IoC的作用:
削减计算机程序的耦合(解除我们代码中的依赖关系)
4. ApplicationContext的三个常用实现类
- ClassPathXMLApplication
它可以加载类路径下的配置文件, 要求配置文件必须在类路径下,不在的话,加载不了 - FileSystemApplicationContext
它可以加载磁盘任意路径下的配置文件(必须有访问权限) - AnnotationConfigApplicationContext
它是用于读取注解常见容器的
核心容器的两个接口引发出的问题
ApplicationContext
—Spring在构建核心容器时, 创建对象采取的策略是采用立即加载的方式.也就是说, 只要一读取完配置文件马上就创建配置文件中配置的对象(单例对象使用
)BeanFactory
—它在构建容器时, 常见对象采取的策略是延迟加载的方式, 也就是说, 什么时候根据id获取对象了, 什么时候才真正的创建对象(多例对象使用
)
5. Spring对bean的管理方式
5.1 创建Bean的三种方式
- 使用默认构造函数创建
在Spring配置文件中使用bean标签, 配以id和class属性之后, 且没有其他属性和标签时,采取的就是默认构造函数创建Bean对象, 此时如果类中没有默认构造函数, 则对象无法创
<bean id="service" class="com.test.ServiceImpl" />
- 使用普通工厂中的方法创建对象(使用某个类中方法创建, 并存入Spring容器)
<bean id="factory" class="com.test.Factory" />
<bean id="service" factory-bean="factory" factory-method="getService"/>
- 使用静态工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入Spring容器)
<bean id="service" factory-bean="com.test.Factory" factory-method="getService"/>
5.2 bean对象的作用范围
bean标签的scope范围
- singleton—单例(默认值)
- prototype—多例
- request—作用与web应用的请求范围
- session—作用于web应用的回话范围
- global-session—作用于集群环境的会话范围(全局会话范围), 当不是集群时, 它就是session
5.3 bean对象的的生命周期
- 单例对象
- 初始化—当容器创建时
- 存活—只要容器还在, 对象一置存活
- 死亡—容器被销毁
总结: 单例对象的生命周期和容器相同
- 多例对象
- 初始化–当我们使用对象时
- 存活—在调用过程中就一直存活
- 死亡—当对象长时间不用且没有别的对象引用时,由GC负责回收
另外, 我们可以自定义Bean的初始化和销毁方法—容器在bean进行到当前声明周期的时候来调用我们自定义的初始化和销毁方法
- 指定初始化和销毁方法
通过@Bean
指定init-method
和destory-method
- 通过让bean实现
InitializingBean(定义初始化逻辑)
和DisposableBean(定义销毁逻辑)
- 可以使用
PostConstruct
—在bean创建完成并且属性赋值完成, 来执行初始化方法
使用PreDestroy
—在容器销毁bean之前通知我们进行清理工作
5.4 对象的依赖注入
在当前类需要用到其他类的对象, 由Spring为我们提供, 我们只需要在配置文件中说明依赖关系的维护—依赖注入
能注入的数据有三种
- 基础类型和String
- 其他bean类型(在配置文件中获取注解配置过的bean)
- 复杂类型/集合模式
注入的方式
- 使用构造函数提供
- 使用set方法提供
- 使用注解提供
6 Spring常用注解—bean操作相关
-
@Configuration
— 告诉Spring这是一个配置类 -
@ComponentScan
—包扫描value
—指定要扫描的包excludeFilters={@Filter(type=FilterType, class={......})}
—指点扫描的时候按照什么规则排查哪些组件includeFilters={@Filter(type=FilterType, class={......})}, useDefaultFilters=false
—指定扫描的时候只需要包含哪些组件FilterType.ANNOTATION
—按注解FilterType.ASSIGNBLE_TYPE
—按照指定的类型FilterType.ASPECTJ
—使用ASPECTJ表达式FilterType.REGEX
—使用正则表达式FilterType.CUSTOM
—使用自定义
-
@ComponentScans
—多个包扫描 -
@Scope
—指定bean的作用范围 -
@Lazy
—懒加载,第一次使用(获取)Bean时创建对象,并初始化 -
@Condition{Condition}
–按照一定的条件进行判断,满足条件给容器注册Bean- 该注解可作用于类和方法
-
包扫描+组件标注注解(
@Controller/@Service@Repository/@Component
) -
Bean
—导入第三方包里面的组件 -
@Import
—快速给容器中导入一个组件@Import(要导入到容器中的组件)
—容器中就会自动注册这个组件, id默认是全类名ImportSelect
—返回需要导入组件的全类名数组ImportBeanDefinitionRegistry
—把所有需要添加到容器中的bean,调用–BeanDefinitionRegistry.registerBeanDefinition
手工注册进来,
可以自定义bean名,Scope等信息
-
使用Spring提供的
FactoryBean(工厂Bean)
- 默认获取到的是工厂Bean调用getObject创建的对象
- 要获取工厂Bean本身,我们需要给id前面加一个"
&
"
8 BeanPostProcessor接口
接口BeanPostProcessor为Interface, 是bean的后置处理器
- 在bean初始化前后进行一些处理工作
postProcessorBeforeInitialization
—在初始化方法调用之前postProcessorAfternitialization
—在初始化方法调用之后
执行顺序:
- 构造函数
postProcessBeforeInitialization
postConstruct
init-method
postProcessAfterInitialization
preDestroy
destroy-method
Spring对BeanPostProcessor的使用
- bean赋值
- 注入其他组件
@Autowried
- 生命周期注解功能
@Async
等