1. Spring Framework的主要功能:
(1)反转控制和依赖注入;
(2)面向切面的编程;
(3)数据访问和事务管理;
(4)应用程序消息(订阅-发布模式/观察者模式);
(5)web应用程序MVC模式;
2. 使用Spring的原因:
(1)逻辑代码分组:避免了servlet中doGet/doPost中大量的分支和转发逻辑,或者定义大量的servlet,将页面访问映射到方法级别;
(2)使用同一代码库的多个用户界面:将通用的业务逻辑封装成service;
3. 应用上下文(ApplicationContext接口):
在Spring中,Context负责管理Bean,执行业务逻辑的Java对象,执行任务、持久化和获取持久化数据、
响应HTTP请求等。
Spring Bean可以,自动装配/检测,消息通知、定时执行、bean验证和执行其他关键Spring服务。
Context是可以分层设计的,同一层的Context之间不可以共享资源,但可以同时共享父级Context中的资源。
类体系:
接口:
ConfigurableApplicationContext:可配置,基本的ApplicationContext只是可读的;
WebApplicationContext和ConfigurableWebApplicationContext:提供对底层ServletContext和ServletConfig的访问;
具体类:
ClassPathApplicationContext;
FileSystemXmlApplicationContext;
XmlWebApplicationContext;
AnnotationConfigApplicationContext;
应用上下文是层次结构:
通过ConetxtLoaderListener可以创建根上下文,会自动设置为所有Dispatcher上下文的父级上下文;
一般我们可以将Controller放到具体的Dispatcher上下文中,而Service业务逻辑,数据仓库等放在根应用上下文中,将控制器放在Servlet应用上下文中。
注意:要将不同上下文的自动检测扫描Bean分开,否则会造成生成多个同样的Bean的问题;
4
. 启动Spring Framework:
XML部署描述符启动;
初始化器启动:
通过监听器不能保证在所有监听器之前调用contextInitialized方法;
Java EE6的ServletContainerInitializer可以在应用程序生命周期的最早的点调用onStartup方法;
但是必须要将定义的Initializer类放到JAR文件的/META-INF/services目录中,spring通过桥接接口的方式,springSevletContainerIntializer类实现了
ServletContainerInitializer接口,在onStartUp需找WebApplicationInitializer接口的实现,调用所有的onStartUp方法,因此我们只要实现后者就可以了;
注意:不要将DispatcherServlet映射到URL模式“/*”,而是“/”,防止将jsp映射到Servlet;
5. 配置Spring Framework:
三种方式可以配置Spring:
XML方式;
混合方式:注解(自动装配+自动检测)+XML;
@Configuration配置:
优势:XML难于调式,不能进行单元进行测试;
@Configuration用@Component元注解创建,因此自动检测时要注意使用Filter来排除;
@Import和@ImportResource可以导入配置;
@EnableWebMvc:启用web mvc;
spring的生命周期和回调接口:在Spring实战中有介绍,使用Aware接口;
6. bean definition profile:
profile文件一般可以进行一些基本配置的设置,一个常用的手段是在开发和生产环境使用不同的profile文件便于切换;
声明:
使用@Profile可以载入对应的profile文件,可以新建两个配置类,分别用于开发和生产模式,使用不同的profile;
激活:
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>development</param-value>
</context-param>
@Profile也是一个元注解,推荐使用自定义注解的方式;