java接口自動化框架,Spring Boot的自動裝配原理

 2023-10-18 阅读 30 评论 0

摘要:? ? ? ? Spring?Boot的“開箱即用”的原則,使得企業應用開發中各種場景的Spring開發更加快速,更加高效,由于配置大量減少,開發效率相得益彰。   啟動原理:SpringBoot項目會有一個啟動類,這個啟動類會使用@SpringBootApplicat

? ? ? ? Spring?Boot的“開箱即用”的原則,使得企業應用開發中各種場景的Spring開發更加快速,更加高效,由于配置大量減少,開發效率相得益彰。

  啟動原理:SpringBoot項目會有一個啟動類,這個啟動類會使用@SpringBootApplication聲明。

下面是@SpringBootApplication的源碼:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy,RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters={@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)})
public @interface SpringBootApplication{@AliasFor(annotation = EnableAutoConfiguration.class, attribute = "exclude")Class<?>[] exclude() default{};@AliasFor(annotation = EnableAutoConfiguration.class, attribute = "excludeName")String[] excludeName() default{};@AliasFor(annotation = EnableAutoConfiguration.class, attribute = "scanBasePackageClasses")Class<?>[] scanBasePackageClasses() default{};
}

java接口自動化框架。@SpringbootApplication其實是一個組合注解,注意高亮的三個注解:

  @EnableAutoConfiguration:啟動注解,該注解會讓SpringBoot根據當前項目所依賴的jar包自動配置到項目中;

  @ComponentScan:自動掃描,SpringBoot默認會掃描@SpringbootApplication所在類的同級包,以及它的子包,因此建議將@SpringbootApplication修飾的入口類放在項目包(Group?Id +?Artifact?Id)下,這樣可以保證SpringBoot項目可以自動掃描所有依賴的包;

  @SpringBootConfiguration:源碼如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration{}

鉸鏈自動裝配機、@SpringBootConfiguration其實又是一個組合注解,注意又一個高亮注解:@Configuration,

  使用@Configuration聲明的類,這個類就相當于一個xml配置文件。這樣就容易理解了,我們使用Spring,springMVC時都會使用xml配置文件去加載相關依賴jar包的類,而SpringBoot使用@SpringBootConfiguration(推薦使用,來代替@Configuration),然后自動掃描(@ComponentScan),自動配置(@EnableAutoConfiguration)。

  下面就來講述其自動配置原理:

  上面講到一個使用了@SpringBootApplication聲明的項目啟動類,這個啟動類有一個main方法,是程序的入口,main方法下面會創建SpringApplication類的run()方法(即SpringApplication.run(App.class,args),App.class是項目啟動類)

卡簧裝配機?run()方法源碼:

public static ConfigurableApplicationContext run(Object[] sources, String[] args){return new SpringApplication(sources).run(args);
}

  可以看到,run方法實際上是創建SpringApplication實例,然后又調用run方法,重點在于創建SpringApplication對象,下面是SpringApplication的構造方法源碼:

public SpringApplication(Object... sources){initialize(sources);
}

  以啟動類作為參數,調用初始化方法initialize(sources),initialize(sources)源碼:

@SuppressWarnings({"unchecked", "rawtypes"})
private void initialize(Object[] sources){if(sources != null && sources.length>0){this.sources.addAll(Arrays.asList(sources));}...setListeners(Collection) getSpringFactoriesInstances(ApplicationListener.class);...
}

其他源碼不是這里的重點,關注高亮代碼,接著再進入getSpringFactoriesInstances方法的源碼:

private <T> Collection<? extends T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args){ClassLoader classLoader = Thread.currentThread().getContextClassLoader();Set<String> names = new LinkedHashSet<String>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));...
}

自動化裝配自動生產線、再進入SpringFactoriesLoader的loadFactoryNames方法的源碼:?

public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader){String factoryClassName = factoryClass.getName();try{Enumeration<URL> urls = (classLoader != null ? classLoader.getSources(FACTORIES_RESOURCE_LOCATION) : ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));List<String> result = new ArrayList<String>();while(urls.hasMoreElements()){URL url = urls.nextElement();Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));String factoryClassNames = properties.getProperty(factoryClassName);result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassName)));}return result;}catch (IOException ex){throw new IllegalArgumentException("Unable to load ["+factoryClass.getName() + "]", ex);}
}        

?上面源碼用到了一個常量:FACTORIES_RESOURCE_LOCATION,這個常量源碼如下:

public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

到目前為止,已經知道是怎樣的了,最終SpringBoot是通過加載META-INF/spring.factories文件進行自動配置,這個文件是放在spring-boot-autoconfigure包下面的META-INF/spring.factories,該?文件時官方文件,里面寫了很多相關類名,供其掃描,自動配置。譬如spring.factories文件下面有一行代碼,這行代碼是一個配置類的類名,叫做org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,它會根據這個全路徑類名,找到這個類,進行加載。

可以看一下org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration的源代碼:?

@Configuration
@ConditionalOnWebApplication
@ConditionOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class})
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration{...
}

Springboot項目??  一開始也講過了,使用了@Configuration的類,相當于一個xml文件,@ContionalOnClass是一個條件注解,意思是只有當當前項目運行環境中有Servlet類,并且有DispatcherServlet類,以及WebMvcConfigurerAdapter類,SpringBoot才會初始化加載這個類,說白了這個類,就相當于spring-servlet.xml文件。既然是spring-servlet.xml文件,那么肯定也會找到很多<bean/>配置類,這里拿視圖配置類InternalResourceViewResolver,舉個例子,

  在spring-servlet.xml文件里面,我們通常是這樣配置聲明InternalResourceViewResolver的:

<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/view"/><property name="suffix" value=".jsp"/>
</bean>

  到了WebMvcAutoConfiguration類,下面可以找到一個defaultViewResolver方法,可以看一下源碼:

@Bean
@ContionalOnMissingBean
public InternalResourceViewResolver defaultViewResolver(){InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix(this.mvcProperties.getView().getPrefix());resolver.setSuffix(this.mvcProperties.getView().getSuffix());return resolver;
}

@Bean,其實就相當于<bean/>標簽,defaultViewResolver方法得返回值類型就是InternalResourceViewResolver類,里面的代碼就是負責創建InternalResourceViewResolver對象,前后對比一下,清晰了很多,SpringBoot就是把Spring技術的配置換成了加載類,直接封裝起來。這里有個問題,prefix和suffix的值怎么確定呢?很簡單,就是到application.properties配置,對于springboot2.x,配置信息如下:

spring.mvc.view.prefix = /WEB-INF/view
spring.mvc.view.suffix= .jsp

閘片卡簧自動安裝。  總結:自動配置原理:從classpath中搜尋所有的META-INF/spring.factories配置文件,并將其中org.springframework.boot.autoconfigure.EnableAutoConfiguration對應的配置項,通過反射機制實例化為IOC容器配置類(這些配置類都是使用了@Configuration注解聲明的),然后匯總并加載到Spring框架的IOC容器。

轉載于:https://www.cnblogs.com/SysoCjs/p/9781764.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/145744.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息