Rumah  >  Artikel  >  Java  >  Bagaimana untuk melaksanakan pemasangan automatik Springboot dengan menyuntik DispatcherServlet

Bagaimana untuk melaksanakan pemasangan automatik Springboot dengan menyuntik DispatcherServlet

WBOY
WBOYke hadapan
2023-06-01 10:22:06815semak imbas

Gambaran Keseluruhan Prinsip

Springboot menyediakan perkhidmatan web kepada dunia luar Lapisan bawah bergantung pada modul web dalam springframework (termasuk tetapi tidak terhad kepada kelas teras mvc spring DispatcherServlet) untuk melaksanakan

. Bagaimana untuk melaksanakan pemasangan automatik Springboot dengan menyuntik DispatcherServlet

Jadi bila springboot menyuntik kelas teras DispatcherServlet ke dalam bekas?
Proses suntikan masih mengikuti proses pemasangan automatik dan rangka kerja springboot menyediakan sokongan untuk pemasangan automatik secara lalai

Dalam Terdapat konfigurasi org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration dalam fail spring.factories dalam pakej jar

Bagaimana untuk melaksanakan pemasangan automatik Springboot dengan menyuntik DispatcherServlet

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass(DispatcherServlet.class)
@AutoConfigureAfter(ServletWebServerFactoryAutoConfiguration.class)
public class DispatcherServletAutoConfiguration {
	/*
	 * The bean name for a DispatcherServlet that will be mapped to the root URL "/"
	 */
	public static final String DEFAULT_DISPATCHER_SERVLET_BEAN_NAME = "dispatcherServlet";
	/*
	 * The bean name for a ServletRegistrationBean for the DispatcherServlet "/"
	 *
	public static final String DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME = "dispatcherServletRegistration";
	// ... 省略代码
	}

Terdapat dua dalaman kelas dalam DispatcherServletAutoConfiguration ( kelas Configuration) DispatcherServletConfiguration, DispatcherServletRegistrationConfiguration dan dua kelas Condition yang sepadan DefaultDispatcherServletCondition, DispatcherServletRegistrationCondition

DispatcherServletServletConfiguration>

DispatcherServletServlet kelas dalaman DispatcherServletAutoConfiguration dan ditandakan dengan @Configuration , akan diimbas secara automatik oleh bekas; Ia mempunyai dua kaedah: 1. dispatcherServlet; 2. multipartResolver

	@Configuration(proxyBeanMethods = false)
	@Conditional(DefaultDispatcherServletCondition.class)
	@ConditionalOnClass(ServletRegistration.class)
	@EnableConfigurationProperties({ HttpProperties.class, WebMvcProperties.class })
	protected static class DispatcherServletConfiguration {

// @A
		@Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
		public DispatcherServlet dispatcherServlet(HttpProperties httpProperties, WebMvcProperties webMvcProperties) {
			DispatcherServlet dispatcherServlet = new DispatcherServlet();
			dispatcherServlet.setDispatchOptionsRequest(webMvcProperties.isDispatchOptionsRequest());
			dispatcherServlet.setDispatchTraceRequest(webMvcProperties.isDispatchTraceRequest());
			dispatcherServlet.setThrowExceptionIfNoHandlerFound(webMvcProperties.isThrowExceptionIfNoHandlerFound());
			dispatcherServlet.setPublishEvents(webMvcProperties.isPublishRequestHandledEvents());
			dispatcherServlet.setEnableLoggingRequestDetails(httpProperties.isLogRequestDetails());
			return dispatcherServlet;
		}

// @B
		@Bean
		@ConditionalOnBean(MultipartResolver.class)
		@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
		public MultipartResolver multipartResolver(MultipartResolver resolver) {
			// Detect if the user has created a MultipartResolver but named it incorrectly
			return resolver;
		}
	}

@A:

  • @Configuration(proxyBeanMethods = false): Kelas konfigurasi menggunakan Lite mod

  • @Conditional(DefaultDispatcherServletCondition.class): Kira sama ada untuk menyuntik berdasarkan nilai pulangan kelas DefaultDispatcherServletCondition Logik utama adalah untuk menyemak sama ada sudah ada DispatcherServlet bernama "dispatcher " dalam bekas Spring

  • @ConditionalOnClass(ServletRegistration.class): Mesti ada kelas ServletRegistration dalam bekas

  • @EnableConfigurationProperties({ HttpProperties.class, WebMvcProperties.class }): Memuatkan HttpProperties dan WebMvcProperties

@B: Inject MultipartResolver parsing class

DispatcherServletLog Masuk🎜 kelas ini adalah sama seperti DispatcherServletConfiguration, tetapi ia diberi anotasi pada kelas @Import(DispatcherServletConfiguration.class), maka kedua-dua takrifan kelas adalah mengikut urutan

@Configuration(proxyBeanMethods = false)
	@Conditional(DispatcherServletRegistrationCondition.class)
	@ConditionalOnClass(ServletRegistration.class)
	@EnableConfigurationProperties(WebMvcProperties.class)
	@Import(DispatcherServletConfiguration.class) //@A
	protected static class DispatcherServletRegistrationConfiguration {

		@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;
		}
	}

Antaranya, DispatcherServletRegistrationBean mewarisi perkhidmatan dari ServletRegistrationBean dan terutamanya menyediakan perkhidmatan for DispatcherServlet. Kedua-dua DispatcherServletRegistrationBean dan DispatcherServlet menyediakan fungsi mendaftarkan Servlet dan mendedahkan maklumat DispatcherServletPath

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan pemasangan automatik Springboot dengan menyuntik DispatcherServlet. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam