欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot原生組件注入實現(xiàn)兩種方式介紹

 更新時間:2022年10月20日 16:15:53   作者:劉婉晴  
SpringBoot是Spring全家桶的成員之一,基于約定優(yōu)于配置的思想(即有約定默認值,在不配置的情況下會使用默認值,在配置文件下配置的話會使用配置的值)。SpringBoot是一種整合Spring技術(shù)棧的方式(或者說是框架),同時也是簡化Spring的一種快速開發(fā)的腳手架

原生組件注入SpringBoot,即注冊 Servlet 、Filter、Listener 進入 SpringBoot

一、使用 Servlet API

使用 Servlet API 可以實現(xiàn)原生組件注入,通過在自定義 Servlet 前加入 @WebServlet 注釋,并且在 SpringBoot 啟動類前加入 @ServletComponentScan 注釋,可實現(xiàn)注冊 Servlet

代碼示例:

1、實現(xiàn)自定義 MyServlet

自定義 Servlet 類:

@WebServlet(urlPatterns = "/my") // 加入 @WebServlet 注釋
public class MyServlet extends HttpServlet { // 注意要繼承 HttpServlet 類
    @Override // 重寫 DoGet 方法
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().println("haha");
    }
}

項目啟動類:

@ServletComponentScan(basePackages = "com.wanqing.admin") //掃描那個包中有servlet
@SpringBootApplication
public class DemoAdminApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoAdminApplication.class, args);
    }
}

2、實現(xiàn)自定義 MyFilter

@Slf4j
@WebFilter(urlPatterns = {"/css/*", "/images/*"}) // 攔截靜態(tài)資源
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
        log.info("MyFilter初始化完成");
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("MyFilter工作");
        filterChain.doFilter(servletRequest, servletResponse);
    }
    @Override
    public void destroy() {
        Filter.super.destroy();
        log.info("MyFilter銷毀");
    }
}

3、實現(xiàn)自定義 MyServletContextListener

@WebListener
@Slf4j
public class MyServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        log.info("MyServletContextListener 監(jiān)聽到項目初始化完成");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        log.info("MyServletContextListener 監(jiān)聽到項目銷毀");
    }
}

二、使用 RegistrationBean 的方式注入原生組件

通過編寫 MyRegistConfig 配置類,返回 RegistrationBean 的方式實現(xiàn)組件的注入,與上一種方式的區(qū)別在于,這種方式不需要給 自定義 Servlet 類寫 @WebServlet 注釋。

注意點:要記得使用 @Bean 注釋將 ServletRegistrationBean 注冊到容器中。

代碼示例:

自定義 MyRegistConfig 配置類,注冊 myServlet 組件,返回 ServletRegistrationBean 對象 (對象參數(shù)為自定義的 myServlet 對象實例)

myFilter 及myListener 的實現(xiàn)方式同理

@Configuration
public class MyRegistConfig {
    @Bean
    public ServletRegistrationBean myServlet(){
        MyServlet myServlet = new MyServlet();
        return new ServletRegistrationBean(myServlet, "/my","/my02");
    }
    @Bean
    public FilterRegistrationBean myFilter(){
        MyFilter filter = new MyFilter();
        //return new FilterRegistrationBean(filter, myServlet()); // 攔截myServlet()的路徑
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(filter);
        filterRegistrationBean.addUrlPatterns("/my","/css/*");
        return filterRegistrationBean;
    }
    @Bean
    public ServletListenerRegistrationBean myListener(){
        MyServletContextListener myServletContextListener = new MyServletContextListener();
        return new ServletListenerRegistrationBean(myServletContextListener);

    }
}

拓展:為什么攔截器不攔截 我們自定義的 MyServlet 請求?

分析 DispatcherServlet 如何注冊進入容器中,從 DispatcherServletAutoConfiguration 類開始

容器中自動配置了 DispatcherServlet 組件,其屬性綁定到 WebMvcProperties 中,對應(yīng)的配置文件是 spring.mvc

		@Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) // 注冊 DispatcherServlet  組件
		public DispatcherServlet dispatcherServlet(WebMvcProperties webMvcProperties) {
			DispatcherServlet dispatcherServlet = new DispatcherServlet();
			dispatcherServlet.setDispatchOptionsRequest(webMvcProperties.isDispatchOptionsRequest());
			dispatcherServlet.setDispatchTraceRequest(webMvcProperties.isDispatchTraceRequest());
			dispatcherServlet.setThrowExceptionIfNoHandlerFound(webMvcProperties.isThrowExceptionIfNoHandlerFound());
			dispatcherServlet.setPublishEvents(webMvcProperties.isPublishRequestHandledEvents());
			dispatcherServlet.setEnableLoggingRequestDetails(webMvcProperties.isLogRequestDetails());
			return dispatcherServlet;
		}

通過 ServletRegistrationBean < DispatcherServlet > 機制(DispatcherServletRegistrationBean.class)將 DispatcherServlet 原生的 Servlet 組件配置進來

		@Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
		@ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
		public DispatcherServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet,
				WebMvcProperties webMvcProperties, ObjectProvider<MultipartConfigElement> multipartConfig) {
			DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(dispatcherServlet,
					webMvcProperties.getServlet().getPath()); // 拿到默認映射路徑為 / 路徑
			registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
			registration.setLoadOnStartup(webMvcProperties.getServlet().getLoadOnStartup());
			multipartConfig.ifAvailable(registration::setMultipartConfig);
			return registration;
		}

拿到默認映射路徑 /

WebMvcProperties.class 中配置

使用 Tomcat 做原生 Servlet 開發(fā),如果多個 Servlet 都能處理到同一層路徑,是精確優(yōu)先原則,例如:

A:/my/

B: /my/1

發(fā)送 /my/1 請求 B處理,而發(fā)送 /my/2 請求 A 處理

結(jié)論 : 來到 /my 不經(jīng)過 / —— 精確匹配 /my 直接經(jīng) Tomcat 寫出響應(yīng),不經(jīng)過 SpringMVC 的一系列流程,因此不被攔截器攔截,如下圖所示:

到此這篇關(guān)于SpringBoot原生組件注入實現(xiàn)兩種方式介紹的文章就介紹到這了,更多相關(guān)SpringBoot原生組件注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java9學習系列之在docker中如何運行java9

    java9學習系列之在docker中如何運行java9

    最近在學習java9,所以將學習中遇到的一些知識點分享給大家,下面這篇文章主要給大家介紹了java9學習系列之在docker中如何運行java9的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-09-09
  • RabbitMQ實現(xiàn)消費端限流的步驟

    RabbitMQ實現(xiàn)消費端限流的步驟

    消費者端限流的主要目的是控制消費者每次從 RabbitMQ 中獲取的消息數(shù)量,從而實現(xiàn)消息處理的流量控制,這篇文章主要介紹了RabbitMQ如何實現(xiàn)消費端限流,需要的朋友可以參考下
    2024-03-03
  • springboot3整合遠程調(diào)用的過程解析

    springboot3整合遠程調(diào)用的過程解析

    遠程過程調(diào)用主要分為:服務(wù)提供者,服務(wù)消費者,通過連接對方服務(wù)器進行請求交互,來實現(xiàn)調(diào)用效果,這篇文章主要介紹了springboot3整合遠程調(diào)用,需要的朋友可以參考下
    2023-06-06
  • Java中map內(nèi)部存儲方式解析

    Java中map內(nèi)部存儲方式解析

    這篇文章主要介紹了Java中map內(nèi)部存儲方式解析的相關(guān)內(nèi)容,涉及其實現(xiàn)方式,以及對存儲方式作了簡單的比較,具有一定參考價值,需要的朋友可了解下。
    2017-10-10
  • Java代碼實現(xiàn)簡單酒店管理系統(tǒng)

    Java代碼實現(xiàn)簡單酒店管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java代碼實現(xiàn)簡單酒店管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 使用Spring Cache和Redis實現(xiàn)查詢數(shù)據(jù)緩存

    使用Spring Cache和Redis實現(xiàn)查詢數(shù)據(jù)緩存

    在現(xiàn)代應(yīng)用程序中,查詢緩存的使用已經(jīng)變得越來越普遍,它不僅能夠顯著提高系統(tǒng)的性能,還能提升用戶體驗,在這篇文章中,我們將探討緩存的基本概念、重要性以及如何使用Spring Cache和Redis實現(xiàn)查詢數(shù)據(jù)緩存,需要的朋友可以參考下
    2024-07-07
  • 詳解Java編寫算法時如何加快讀寫數(shù)據(jù)速度

    詳解Java編寫算法時如何加快讀寫數(shù)據(jù)速度

    這篇文章主要為大家詳細介紹了Java在編寫算法時如何加快讀寫數(shù)據(jù)速度,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-03-03
  • RocketMQ?源碼分析Broker消息刷盤服務(wù)

    RocketMQ?源碼分析Broker消息刷盤服務(wù)

    這篇文章主要為大家介紹了RocketMQ?源碼分析Broker消息刷盤服務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • SpringBoot將項目打成war包步驟解析

    SpringBoot將項目打成war包步驟解析

    這篇文章主要介紹了SpringBoot將項目打成war包步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • java的split方法使用示例

    java的split方法使用示例

    這篇文章主要介紹了java的split方法使用示例,需要的朋友可以參考下
    2014-04-04

最新評論