1.什么是spring?
spring是一个开放源码的J2EE容器框架,是针对bean的生命周期进行管理的轻量级容器。容器内放置的都是java对象(java bean),当容器启动时,容器为我们创建对象,容器销毁时,对象也销毁。
2.spring的优点
1.方便解耦,简化开发
通过Spring提供的IOC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
2.AOP编程的支持
通过Spring提供的AOP(面向切面编程)功能,方便进行面向切面的编程,许多不容器用传统OOP(面向对象编程)实现的功能可以通过AOP轻松应付。
3.声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量
4.方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
5.方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Structs、Hibernate、Hessian、Quartz )等的直接支持
6.降低Java EE API的使用难度
Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
3.Spring体系结构
核心容器由spring-core,spring-beans,spring-context,spring-context-support和spring-expression(SpEL,Spring表达式语言,Spring Expression Language)等模块组成,它们的细节如下:
-
spring-core模块提供了框架的基本组成部分,包括 IoC 和依赖注入功能。
-
spring-beans 模块提供 BeanFactory,工厂模式的微妙实现,它移除了编码式单例的需要,并且可以把配置和依赖从实际编码逻辑中解耦。
-
context模块建立在由core和 beans 模块的基础上建立起来的,它以一种类似于JNDI注册的方式访问对象。Context模块继承自Bean模块,并且添加了国际化(比如,使用资源束)、事件传播、资源加载和透明地创建上下文(比如,通过Servelet容器)等功能。Context模块也支持Java EE的功能,比如EJB、JMX和远程调用等。ApplicationContext接口是Context模块的焦点。spring-context-support提供了对第三方库集成到Spring上下文的支持,比如缓存(EhCache, Guava, JCache)、邮件(JavaMail)、调度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等。
-
spring-expression模块提供了强大的表达式语言,用于在运行时查询和操作对象图。它是JSP2.1规范中定义的统一表达式语言的扩展,支持set和get属性值、属性赋值、方法调用、访问数组集合及索引的内容、逻辑算术运算、命名变量、通过名字从Spring IoC容器检索对象,还支持列表的投影、选择以及聚合等。
4.Spring核心容器
spring容器会负责控制程序之间的关系,而不是由程序代码直接控制。Spring为我们提供了两种核心容器,分别为BeanFactory和ApplicationContext
4.1 BeanFactory
创建bean实例时,需要提供Spring所管理容器的配置信息applicationContext.xml,这些信息通畅用xml文件形式来管理,加载配置信息的语法如下:
BeanFactory beanFactory =
new XmlBeanFactory(new FileSystemResource("F: /applicationContext.xml"));
4.2ApplicationContext
首先需明确的是Application是beanFactory的子接口,是另一种常用的Spring核心容器,不仅实现了BeanFactory 的所有功能,还增加了国际化,资源访问,事件传播等。
常用实现类:
ClassPathXmlApplicationContext 主要获取用户resource路径下的配置
// 大多数使用用这一种
// 通过ApplicationContext 子类ClassPathXmlApplicationContext 去读取配置文件 classpath:可省略
// ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:bean1.xml");
FileSystemXmlApplicationContext 主要获取绝对路径的配置
// 通过FileSystemXmlApplicationContext 加载 bean 配置文件 容器按照配置文件 初始化对象
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("C:\\Users\\ausu\\Desktop\\spring01\\src\\main\\resources\\bean1.xml");
4.3易混淆面试题(FactoryBean与BeanFactory的区别)
FactoryBean 创建对象的工厂接口,在ProxyFactroyBean 继承 FactoryBean 完成创建代理对象
BeanFactory 容器的顶层接口, 主要用于获取容器中的bean ,常用的子接口 ApplicationContext