DispatcherServlet 是一个 Servlet 也是一个bean

发布时间 2023-04-13 16:42:14作者: vx_guanchaoguo0

Servlet

  • DispatcherServlet实现了javax.servlet.Servlet接口,负责处理来自客户端浏览器的HTTP请求,并将请求分发给相应的Controller进行处理。
  • DispatcherServlet通常是Web应用程序中唯一一个Servlet,并且是Spring MVC框架中最核心的组件之一。
  • Spring Boot启动时会初始化Tomcat容器,并创建WebApplicationContext对象也就是DispatcherServlet容器

Bean

  • DispatcherServlet同样是Spring IoC容器中的一个对象,通常情况下需要在Spring配置文件中进行相应的声明和配置。
  • DispatcherServlet作为一个Bean,可以享受Spring IoC容器提供的各种功能和服务,包括依赖注入、Bean生命周期管理等。
  • DispatcherServlet会在应用启动时被自动装配(即初始化),并负责管理整个Web请求和响应流程
  • Spring Boot启动时,Spring容器也会随之初始化,并创建ApplicationContext对象也就是spring容器

初始化流程 。Tomcat容器和Spring容器可以共同持有Spring MVC容器,彼此独立且依赖注入

  1. Spring Boot启动时会初始化Tomcat容器,并创建WebApplicationContext对象。
  2. Tomcat容器会注册一个DispatcherServlet,这个Servlet会使用WebApplicationContext对象来管理Spring MVC容器中的Bean实例。
  3. 在Spring Boot启动时,Spring容器也会随之初始化,并创建ApplicationContext对象。这个容器负责管理所有非Web相关的Bean实例。
  4. 通过在@Configuration类中添加@EnableWebMvc注解,我们可以扩展Spring MVC容器的功能,如添加拦截器、自定义消息转换器等。
  5. 在@Configuration类中定义各种业务逻辑组件、服务、数据访问对象等,并通过在类上添加@Service、@Repository、@Component等注解,将它们注册到Spring容器中。
  6. 在需要使用Spring MVC、Tomcat以及Spring容器中的Bean实例的地方,我们可以使用@Autowired注解进行依赖注入,从而实现模块化开发和松耦合。

springmvc 管理的bean 默认单例

  • @Controller、
  • @ViewResolver、
  • @HandlerMapping

spring管理的bean 默认单例

  • @Service、
  • @Repository、
  • @Componenting
默认单例并发模式引发冲突
  • 其实在多线程模式下如果多个线程同时访问同一个实例确实会引发冲突

springboot 处理方式

  • Spring IoC容器默认会对所有Bean进行线程安全处理。
  • 使用全局变量时候使用 synchronized、Lock、Atomic类、ConcurrentHashMap等进行保护。
  • 针对不同的注解组件 springboot采用了AOP代理技术来对Bean进行封装,每次调用@Service、@Controller、@Component等注解的Bean都会通过代理产生一个新的实例,从而避免不同线程之间的互相干扰