起因是了解到Spring Web是和SpringBoot在初始化流程和各模块之间的关系这些核心点都不同的,这让我很惊讶。
问了下GPT:
Spring程序、Spring Web程序、SpringBoot程序,这三者的初始化流程,各模块之间的结构是不同的,是吗?处了这三者,还有其他类型的Spring程序吗,常见的?
下面是GPT的回答:
是的,Spring、Spring Web 和 Spring Boot 程序在初始化流程及各模块之间的结构上是有所不同的。以下是这三种程序之间的区别,以及其他类型的常见 Spring 程序:
1. Spring 核心程序
初始化流程:
配置方式:通常通过 XML 文件或 Java 注解进行配置。
启动:在主方法(main 方法)中,手动创建 ApplicationContext 来启动 Spring 应用。
示例代码—Spring 核心程序:
public class Main {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext(
"applicationContext.xml");
MyService myService = context.getBean(MyService.class);
myService.doSomething();
}
}
核心组件:
BeanFactory/ApplicationContext:管理 Bean 的容器。
Bean:Spring 管理的 POJO。
AOP:面向切面编程。
Transactions:声明式事务管理。
2. Spring Web 程序
初始化流程:
配置方式:通常通过 web.xml 或 Java 注解进行配置。
启动:部署到 Web 容器(如 Tomcat、Jetty),Web 容器初始化和启动 Spring 容器。
核心组件:
DispatcherServlet:前端控制器。
WebApplicationContext:扩展自 ApplicationContext,专用于 Web 应用的上下文。
示例代码—Spring Web 应用(web.xml 配置):
<web-app>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
示例代码—Spring Web 应用(Java 配置):
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
// 创建 Spring 应用上下文
AnnotationConfigWebApplicationContext ctx =
new AnnotationConfigWebApplicationContext();
ctx.register(AppConfig.class);
// 管理生命周期的上下文装入 Servlet 容器
container.addListener(new ContextLoaderListener(ctx));
// 创建和注册 DispatcherServlet
ServletRegistration.Dynamic dispatcher =
container.addServlet("dispatcher",
new DispatcherServlet(ctx));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
3. Spring Boot 程序
初始化流程:
配置方式:基于 Java 注解和自动配置的方式。
启动:通过 SpringApplication.run 方法启动 Spring Boot 应用,内嵌 Web 容器(若存在)以及 Spring 容器均在该方法中初始化。
核心组件:
SpringApplication:Spring Boot 应用的启动入口。
EmbeddedServletContainer:内嵌的 Web 容器(如 Tomcat、Jetty 等)。
@SpringBootApplication:组合注解,包含 @Configuration、@EnableAutoConfiguration 和 @ComponentScan。
示例代码—Spring Boot 程序:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
核心自动配置类示例:
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, ServletRegistration.class })
@ConditionalOnMissingBean({ DispatcherServlet.class, ServletRegistrationBean.class })
public class DispatcherServletAutoConfiguration {
@Bean
@ConditionalOnMissingBean(DispatcherServlet.class)
public DispatcherServlet dispatcherServlet() {
DispatcherServlet dispatcherServlet = new DispatcherServlet();
dispatcherServlet.setDispatchOptionsRequest(true);
dispatcherServlet.setDispatchTraceRequest(true);
return dispatcherServlet;
}
@Bean
@ConditionalOnBean(DispatcherServlet.class)
public DispatcherServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet) {
ServletRegistrationBean<DispatcherServlet> registrationBean = new ServletRegistrationBean<>(dispatcherServlet, "/");
registrationBean.setName("dispatcherServlet");
registrationBean.setLoadOnStartup(1);
return registrationBean;
}
}
其他常见类型的 Spring 程序
4. Spring Boot Reactive 程序
初始化流程:
配置方式:基于 Spring Boot 的自动配置。
启动:通过 SpringApplication.run 方法启动。
核心技术:使用 Spring WebFlux 处理反应式(Reactive)编程模型和异步非阻塞 I/O。
示例代码—Spring WebFlux 应用:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@RestController
public class HelloController {
@GetMapping("/hello")
public Mono<String> hello() {
return Mono.just("Hello, World!");
}
}
5. Spring Cloud 程序
初始化流程:
配置方式:基于 Spring Boot 的自动配置,结合 Spring Cloud 组件。
启动:通过 SpringApplication.run 方法启动。
核心技术:使用 Spring Cloud 组件来实现微服务架构,如 Config Server、Eureka、Zuul、Ribbon、Feign 等。
示例代码—Spring Cloud 服务发现(Eureka Server):
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(
EurekaServerApplication.class, args);
}
}
6. Spring Integration 程序
初始化流程:
配置方式:基于 XML 或 Java 配置。
启动:通常通过 main 方法启动(类似 Spring 核心程序)。
核心技术:用于企业集成模式(EIP)的实现,支持消息中间件、调度任务、传输协议等。
示例代码—Spring Integration:
@Configuration
@EnableIntegration
public class IntegrationConfig {
@Bean
public MessageChannel inputChannel() {
return new DirectChannel();
}
@Bean
public MessageChannel outputChannel() {
return new DirectChannel();
}
@Bean
public IntegrationFlow integrationFlow() {
return IntegrationFlows.from("inputChannel")
.handle("myService", "process")
.channel("outputChannel")
.get();
}
}
7. Spring Batch 程序
初始化流程:
配置方式:基于 Java 配置。
启动:通常通过 main 方法启动,或结合 Spring Boot 自动启动。
核心技术:用于批处理框架,支持任务计划与调度、处理大量数据等。
示例代码—Spring Batch 应用:
@SpringBootApplication
@EnableBatchProcessing
public class BatchApplication {
public static void main(String[] args) {
SpringApplication.run(BatchApplication.class, args);
}
@Bean
public Job importUserJob(JobBuilderFactory jobs, Step step) {
return jobs.get("importUserJob")
.flow(step)
.end()
.build();
}
@Bean
public Step step(StepBuilderFactory steps) {
return steps.get("step")
.<String, String> chunk(10)
.reader(reader())
.writer(writer())
.build();
}
@Bean
public ItemReader<String> reader() {
// Define ItemReader
return null;
}
@Bean
public ItemWriter<String> writer() {
// Define ItemWriter
return null;
}
}
总结
除了 Spring 核心程序、Spring Web 程序、Spring Boot 程序外,常见的 Spring 程序还包括 Spring Boot Reactive 程序、Spring Cloud 程序、Spring Integration 程序和 Spring Batch 程序。每种类型的程序都有独特的初始化流程和结构,满足不同的应用场景和需求。