亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

原生組件注入SpringBoot,即注冊(cè) Servlet 、Filter、Listener 進(jìn)入 SpringBoot

一、使用 Servlet API

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

代碼示例:

1、實(shí)現(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");
    }
}

項(xiàng)目啟動(dòng)類:

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

2、實(shí)現(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、實(shí)現(xiàn)自定義 MyServletContextListener

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

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

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

注意點(diǎn):要記得使用 @Bean 注釋將 ServletRegistrationBean 注冊(cè)到容器中。

代碼示例:

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

myFilter 及myListener 的實(shí)現(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 請(qǐng)求?

分析 DispatcherServlet 如何注冊(cè)進(jìn)入容器中,從 DispatcherServletAutoConfiguration 類開始

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

		@Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) // 注冊(cè) 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 > 機(jī)制(DispatcherServletRegistrationBean.class)將 DispatcherServlet 原生的 Servlet 組件配置進(jìn)來

		@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()); // 拿到默認(rèn)映射路徑為 / 路徑
			registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
			registration.setLoadOnStartup(webMvcProperties.getServlet().getLoadOnStartup());
			multipartConfig.ifAvailable(registration::setMultipartConfig);
			return registration;
		}

拿到默認(rèn)映射路徑 /

WebMvcProperties.class 中配置

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

A:/my/

B: /my/1

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

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

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

相關(guān)文章

  • java9學(xué)習(xí)系列之在docker中如何運(yùn)行java9

    java9學(xué)習(xí)系列之在docker中如何運(yùn)行java9

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

    RabbitMQ實(shí)現(xiàn)消費(fèi)端限流的步驟

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

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

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

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

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

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

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

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

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

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

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

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

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

    SpringBoot將項(xiàng)目打成war包步驟解析

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

    java的split方法使用示例

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

最新評(píng)論