SpringMVC
- MVC
模型-视图-控制器分离。C主要用来同步M和V;所以本意:Model为数据库记录,持久化。View:为前端,Controller:处理输入输出。 - SpringMVC 与Struts2
区别:
拦截机制不同:struts2为类级别拦截,每次请求都会创建一个Action,和Spring整合时,通过Setter,Getter把request数据注入属性,一个Action对应一个request.response上下文,在接受参数时,允许使用共享的属性接受。有自己的拦截机制,配置文件多
SpringMVC为方法级拦截,一个方法对应一个request上下文,方法独立,独享数据。参数传递传入方法,方法独有,处理结构通过MadeMap返回给框架,和Spring整合时,为单例模型,默认所有的请求只会创建一个控制器,线程安全。
底层实现不同:struts2使用Filter实现,在容器启动时开始初始化,晚于Servlet,服务停止后销毁。SpringMVC使用Servlet,在调用时初始化。 - 拦截起与过滤器
拦截器是基于java的反射机制的,而过滤器是基于函数回调。
拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
五:Spring Boot - 起步依赖,自动配置
起步依赖本质为一个Maven项目对象模型定义对其他库的传递依赖。
自动配置:启动时,自动检测Classpath里的BeanL来进行配置。通过配置类里使用@EnableAutoConfiguration或者@SpringBootAoolication注解,开启自动扫描和配置 - Spring boot的starter机制
引入依赖,自动引入开发相关包,配置数据源。通过注解自动创建所有的bean
@ConditionalOnBean,仅在当前上下文中存在某个bean时,才会实例化这个Bean。
@ConditionalOnClass,某个class位于类路径上,才会实例化这个Bean。
@ConditionalOnExpression,当表达式为true的时候,才会实例化这个Bean。
@ConditionalOnMissingBean,仅在当前上下文中不存在某个bean时,才会实例化这个Bean。
@ConditionalOnMissingClass,某个class在类路径上不存在的时候,才会实例化这个Bean。
@ConditionalOnNotWebApplication,不是web应用时才会实例化这个Bean。
@AutoConfigureAfter,在某个bean完成自动配置后实例化这个bean。
@AutoConfigureBefore,在某个bean完成自动配置前实例化这个bean。 - 编写自己的strater
第一步,SpringBoot 在启动时会去依赖的starter包中寻找 resources/META-INF/spring.factories 文件,然后根据文件中配置的Jar包去扫描项目所依赖的Jar包,这类似于 Java 的 SPI 机制。
第二步,根据 spring.factories配置加载AutoConfigure类。
最后,根据 @Conditional注解的条件,进行自动配置并将Bean注入Spring Context 上下文当中。
我们也可以使用@ImportAutoConfiguration({MyServiceAutoConfiguration.class}) 指定自动配置哪些类。
步骤:
编写Servies类
编写配置类,使用@ConfigurationProperties注解,扫描Servies类包。进行bean配置。
编写自动配置类AutoConfigure,使用@configuration,@conditionOnCalss()(当Classpath下发现该类自动配置)@EnableConfigurationProperties()(类似上面那个)。
在Spring factoriesw文件中注册,并发布。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.autocinfigure.StarterAutoConfigure
代码如下:
Servies类:
public class StarterService {
private String config;
public StarterService(String config) {
this.config = config;
}
public String[] split(String separatorChar) {
return StringUtils.split(this.config, separatorChar);
}
}
配置文件读取类
@ConfigurationProperties("example.service")
public class StarterServiceProperties {
private String config;
public void setConfig(String config) {
this.config = config;
}
public String getConfig() {
return config;
}
}
AytoConfigure:自动配置类:
@Configuration
@ConditionalOnClass(StarterService.class)
@EnableConfigurationProperties(StarterServiceProperties.class)
public class StarterAutoConfigure {
@Autowired
private StarterServiceProperties properties;
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "example.service", value = "enabled", havingValue = "true")
StarterService starterService (){
return new StarterService(properties.getConfig());
}
}