Spring详解(三):Spring程序类型

107 阅读4分钟

起因是了解到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 程序。每种类型的程序都有独特的初始化流程和结构,满足不同的应用场景和需求。