0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Spring中最常用的11個(gè)擴(kuò)展點(diǎn)

jf_ro2CN3Fa ? 來(lái)源:蘇三說(shuō)技術(shù) ? 2023-01-11 10:31 ? 次閱讀


之前給大家寫過(guò)一篇 Bean 的生命周期,非常受歡迎,里面其實(shí)介紹了 Bean 生命周期中所有的擴(kuò)展點(diǎn)。

今天給大家?guī)?lái)的文章,可以作為 Spring 擴(kuò)展點(diǎn)的補(bǔ)充,一共 11 個(gè),工作中會(huì)經(jīng)常用到,如果用得好,很可能會(huì)事半功倍哈。

前言

我們一說(shuō)到spring,可能第一個(gè)想到的是 IOC(控制反轉(zhuǎn)) 和 AOP(面向切面編程)。

沒(méi)錯(cuò),它們是spring的基石,得益于它們的優(yōu)秀設(shè)計(jì),使得spring能夠從眾多優(yōu)秀框架中脫穎而出。

除此之外,我們?cè)谑褂胹pring的過(guò)程中,有沒(méi)有發(fā)現(xiàn)它的擴(kuò)展能力非常強(qiáng)。由于這個(gè)優(yōu)勢(shì)的存在,讓spring擁有強(qiáng)大的包容能力,讓很多第三方應(yīng)用能夠輕松投入spring的懷抱。比如:rocketmq、mybatis、redis等。

今天跟大家一起聊聊,在Spring中最常用的11個(gè)擴(kuò)展點(diǎn)。

f83be988-9151-11ed-bfe3-dac502259ad0.png

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

1.自定義攔截器

spring mvc攔截器根spring攔截器相比,它里面能夠獲取HttpServletRequestHttpServletResponse等web對(duì)象實(shí)例。

spring mvc攔截器的頂層接口是:HandlerInterceptor,包含三個(gè)方法:

  • preHandle 目標(biāo)方法執(zhí)行前執(zhí)行
  • postHandle 目標(biāo)方法執(zhí)行后執(zhí)行
  • afterCompletion 請(qǐng)求完成時(shí)執(zhí)行

為了方便我們一般情況會(huì)用HandlerInterceptor接口的實(shí)現(xiàn)類HandlerInterceptorAdapter類。

假如有權(quán)限認(rèn)證、日志、統(tǒng)計(jì)的場(chǎng)景,可以使用該攔截器。

第一步,繼承HandlerInterceptorAdapter類定義攔截器:

publicclassAuthInterceptorextendsHandlerInterceptorAdapter{

@Override
publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)
throwsException{
StringrequestUrl=request.getRequestURI();
if(checkAuth(requestUrl)){
returntrue;
}

returnfalse;
}

privatebooleancheckAuth(StringrequestUrl){
System.out.println("===權(quán)限校驗(yàn)===");
returntrue;
}
}

第二步,將該攔截器注冊(cè)到spring容器:

@Configuration
publicclassWebAuthConfigextendsWebMvcConfigurerAdapter{

@Bean
publicAuthInterceptorgetAuthInterceptor(){
returnnewAuthInterceptor();
}

@Override
publicvoidaddInterceptors(InterceptorRegistryregistry){
registry.addInterceptor(newAuthInterceptor());
}
}

第三步,在請(qǐng)求接口時(shí)spring mvc通過(guò)該攔截器,能夠自動(dòng)攔截該接口,并且校驗(yàn)權(quán)限。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

2.獲取Spring容器對(duì)象

在我們?nèi)粘i_發(fā)中,經(jīng)常需要從Spring容器中獲取Bean,但你知道如何獲取Spring容器對(duì)象嗎?

2.1 BeanFactoryAware接口

@Service
publicclassPersonServiceimplementsBeanFactoryAware{
privateBeanFactorybeanFactory;

@Override
publicvoidsetBeanFactory(BeanFactorybeanFactory)throwsBeansException{
this.beanFactory=beanFactory;
}

publicvoidadd(){
Personperson=(Person)beanFactory.getBean("person");
}
}

實(shí)現(xiàn)BeanFactoryAware接口,然后重寫setBeanFactory方法,就能從該方法中獲取到spring容器對(duì)象。

2.2 ApplicationContextAware接口

@Service
publicclassPersonService2implementsApplicationContextAware{
privateApplicationContextapplicationContext;

@Override
publicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{
this.applicationContext=applicationContext;
}

publicvoidadd(){
Personperson=(Person)applicationContext.getBean("person");
}
}

實(shí)現(xiàn)ApplicationContextAware接口,然后重寫setApplicationContext方法,也能從該方法中獲取到spring容器對(duì)象。

2.3 ApplicationListener接口

@Service
publicclassPersonService3implementsApplicationListener<ContextRefreshedEvent>{
privateApplicationContextapplicationContext;
@Override
publicvoidonApplicationEvent(ContextRefreshedEventevent){
applicationContext=event.getApplicationContext();
}

publicvoidadd(){
Personperson=(Person)applicationContext.getBean("person");
}
}

3.全局異常處理

以前我們?cè)陂_發(fā)接口時(shí),如果出現(xiàn)異常,為了給用戶一個(gè)更友好的提示,例如:

@RequestMapping("/test")
@RestController
publicclassTestController{

@GetMapping("/add")
publicStringadd(){
inta=10/0;
return"成功";
}
}

如果不做任何處理請(qǐng)求add接口結(jié)果直接報(bào)錯(cuò):

f85bffca-9151-11ed-bfe3-dac502259ad0.png

what?用戶能直接看到錯(cuò)誤信息?

這種交互方式給用戶的體驗(yàn)非常差,為了解決這個(gè)問(wèn)題,我們通常會(huì)在接口中捕獲異常:

@GetMapping("/add")
publicStringadd(){
Stringresult="成功";
try{
inta=10/0;
}catch(Exceptione){
result="數(shù)據(jù)異常";
}
returnresult;
}

接口改造后,出現(xiàn)異常時(shí)會(huì)提示:“數(shù)據(jù)異?!?,對(duì)用戶來(lái)說(shuō)更友好。

看起來(lái)挺不錯(cuò)的,但是有問(wèn)題。。。

如果只是一個(gè)接口還好,但是如果項(xiàng)目中有成百上千個(gè)接口,都要加上異常捕獲代碼嗎?

答案是否定的,這時(shí)全局異常處理就派上用場(chǎng)了:RestControllerAdvice。

@RestControllerAdvice
publicclassGlobalExceptionHandler{

@ExceptionHandler(Exception.class)
publicStringhandleException(Exceptione){
if(einstanceofArithmeticException){
return"數(shù)據(jù)異常";
}
if(einstanceofException){
return"服務(wù)器內(nèi)部異常";
}
returnnull;
}
}

只需在handleException方法中處理異常情況,業(yè)務(wù)接口中可以放心使用,不再需要捕獲異常(有人統(tǒng)一處理了)。真是爽歪歪。

4.類型轉(zhuǎn)換器

spring目前支持3中類型轉(zhuǎn)換器:

  • Converter:將 S 類型對(duì)象轉(zhuǎn)為 T 類型對(duì)象
  • ConverterFactory:將 S 類型對(duì)象轉(zhuǎn)為 R 類型及子類對(duì)象
  • GenericConverter:它支持多個(gè)source和目標(biāo)類型的轉(zhuǎn)化,同時(shí)還提供了source和目標(biāo)類型的上下文,這個(gè)上下文能讓你實(shí)現(xiàn)基于屬性上的注解或信息來(lái)進(jìn)行類型轉(zhuǎn)換。

這3種類型轉(zhuǎn)換器使用的場(chǎng)景不一樣,我們以Converter例。假如:接口中接收參數(shù)的實(shí)體對(duì)象中,有個(gè)字段的類型是Date,但是實(shí)際傳參的是字符串類型:2021-01-03 1015,要如何處理呢?

第一步,定義一個(gè)實(shí)體User:

@Data
publicclassUser{

privateLongid;
privateStringname;
privateDateregisterDate;
}

第二步,實(shí)現(xiàn)Converter接口:

publicclassDateConverterimplementsConverter<String,Date>{

privateSimpleDateFormatsimpleDateFormat=newSimpleDateFormat("yyyy-MM-ddHHss");

@Override
publicDateconvert(Stringsource){
if(source!=null&&!"".equals(source)){
try{
simpleDateFormat.parse(source);
}catch(ParseExceptione){
e.printStackTrace();
}
}
returnnull;
}
}

第三步,將新定義的類型轉(zhuǎn)換器注入到spring容器中:

@Configuration
publicclassWebConfigextendsWebMvcConfigurerAdapter{

@Override
publicvoidaddFormatters(FormatterRegistryregistry){
registry.addConverter(newDateConverter());
}
}

第四步,調(diào)用接口

@RequestMapping("/user")
@RestController
publicclassUserController{

@RequestMapping("/save")
publicStringsave(@RequestBodyUseruser){
return"success";
}
}

請(qǐng)求接口時(shí)User對(duì)象中registerDate字段會(huì)被自動(dòng)轉(zhuǎn)換成Date類型。

5.導(dǎo)入配置

有時(shí)我們需要在某個(gè)配置類中引入另外一些類,被引入的類也加到spring容器中。這時(shí)可以使用@Import注解完成這個(gè)功能。

如果你看過(guò)它的源碼會(huì)發(fā)現(xiàn),引入的類支持三種不同類型。

但是我認(rèn)為最好將普通類和@Configuration注解的配置類分開講解,所以列了四種不同類型:

f871ea2e-9151-11ed-bfe3-dac502259ad0.png

5.1 普通類

這種引入方式是最簡(jiǎn)單的,被引入的類會(huì)被實(shí)例化bean對(duì)象。

publicclassA{
}

@Import(A.class)
@Configuration
publicclassTestConfiguration{
}

通過(guò)@Import注解引入A類,spring就能自動(dòng)實(shí)例化A對(duì)象,然后在需要使用的地方通過(guò)@Autowired注解注入即可:

@Autowired
privateAa;

是不是挺讓人意外的?不用加@Bean注解也能實(shí)例化bean。

5.2 配置類

這種引入方式是最復(fù)雜的,因?yàn)?code style="font-size:14px;padding:2px 4px;margin-right:2px;margin-left:2px;color:rgb(30,107,184);background-color:rgba(27,31,35,.05);font-family:'Operator Mono', Consolas, Monaco, Menlo, monospace;">@Configuration注解還支持多種組合注解,比如:

  • @Import
  • @ImportResource
  • @PropertySource等。
publicclassA{
}

publicclassB{
}

@Import(B.class)
@Configuration
publicclassAConfiguration{

@Bean
publicAa(){
returnnewA();
}
}

@Import(AConfiguration.class)
@Configuration
publicclassTestConfiguration{
}

通過(guò)@Import注解引入@Configuration注解的配置類,會(huì)把該配置類相關(guān)@Import、@ImportResource、@PropertySource等注解引入的類進(jìn)行遞歸,一次性全部引入。

5.3 ImportSelector

這種引入方式需要實(shí)現(xiàn)ImportSelector接口:

publicclassAImportSelectorimplementsImportSelector{

privatestaticfinalStringCLASS_NAME="com.sue.cache.service.test13.A";

publicString[]selectImports(AnnotationMetadataimportingClassMetadata){
returnnewString[]{CLASS_NAME};
}
}

@Import(AImportSelector.class)
@Configuration
publicclassTestConfiguration{
}

這種方式的好處是selectImports方法返回的是數(shù)組,意味著可以同時(shí)引入多個(gè)類,還是非常方便的。

5.4 ImportBeanDefinitionRegistrar

這種引入方式需要實(shí)現(xiàn)ImportBeanDefinitionRegistrar接口:

publicclassAImportBeanDefinitionRegistrarimplementsImportBeanDefinitionRegistrar{
@Override
publicvoidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata,BeanDefinitionRegistryregistry){
RootBeanDefinitionrootBeanDefinition=newRootBeanDefinition(A.class);
registry.registerBeanDefinition("a",rootBeanDefinition);
}
}

@Import(AImportBeanDefinitionRegistrar.class)
@Configuration
publicclassTestConfiguration{
}

這種方式是最靈活的,能在registerBeanDefinitions方法中獲取到BeanDefinitionRegistry容器注冊(cè)對(duì)象,可以手動(dòng)控制BeanDefinition的創(chuàng)建和注冊(cè)。

6.項(xiàng)目啟動(dòng)時(shí)

有時(shí)候我們需要在項(xiàng)目啟動(dòng)時(shí)定制化一些附加功能,比如:加載一些系統(tǒng)參數(shù)、完成初始化、預(yù)熱本地緩存等,該怎么辦呢?

好消息是springboot提供了:

  • CommandLineRunner
  • ApplicationRunner

這兩個(gè)接口幫助我們實(shí)現(xiàn)以上需求。

它們的用法還是挺簡(jiǎn)單的,以ApplicationRunner接口為例:

@Component
publicclassTestRunnerimplementsApplicationRunner{

@Autowired
privateLoadDataServiceloadDataService;

publicvoidrun(ApplicationArgumentsargs)throwsException{
loadDataService.load();
}
}

實(shí)現(xiàn)ApplicationRunner接口,重寫run方法,在該方法中實(shí)現(xiàn)自己定制化需求。

如果項(xiàng)目中有多個(gè)類實(shí)現(xiàn)了ApplicationRunner接口,他們的執(zhí)行順序要怎么指定呢?

答案是使用@Order(n)注解,n的值越小越先執(zhí)行。當(dāng)然也可以通過(guò)@Priority注解指定順序。

7.修改BeanDefinition

Spring IOC在實(shí)例化Bean對(duì)象之前,需要先讀取Bean的相關(guān)屬性,保存到BeanDefinition對(duì)象中,然后通過(guò)BeanDefinition對(duì)象,實(shí)例化Bean對(duì)象。

如果想修改BeanDefinition對(duì)象中的屬性,該怎么辦呢?

答:我們可以實(shí)現(xiàn)BeanFactoryPostProcessor接口。

@Component
publicclassMyBeanFactoryPostProcessorimplementsBeanFactoryPostProcessor{

@Override
publicvoidpostProcessBeanFactory(ConfigurableListableBeanFactoryconfigurableListableBeanFactory)throwsBeansException{
DefaultListableBeanFactorydefaultListableBeanFactory=(DefaultListableBeanFactory)configurableListableBeanFactory;
BeanDefinitionBuilderbeanDefinitionBuilder=BeanDefinitionBuilder.genericBeanDefinition(User.class);
beanDefinitionBuilder.addPropertyValue("id",123);
beanDefinitionBuilder.addPropertyValue("name","蘇三說(shuō)技術(shù)");
defaultListableBeanFactory.registerBeanDefinition("user",beanDefinitionBuilder.getBeanDefinition());
}
}

在postProcessBeanFactory方法中,可以獲取BeanDefinition的相關(guān)對(duì)象,并且修改該對(duì)象的屬性。

8.初始化Bean前后

有時(shí),你想在初始化Bean前后,實(shí)現(xiàn)一些自己的邏輯。

這時(shí)可以實(shí)現(xiàn):BeanPostProcessor接口。

該接口目前有兩個(gè)方法:

  • postProcessBeforeInitialization 該在初始化方法之前調(diào)用。
  • postProcessAfterInitialization 該方法再初始化方法之后調(diào)用。

例如:

@Component
publicclassMyBeanPostProcessorimplementsBeanPostProcessor{

@Override
publicObjectpostProcessAfterInitialization(Objectbean,StringbeanName)throwsBeansException{
if(beaninstanceofUser){
((User)bean).setUserName("蘇三說(shuō)技術(shù)");
}
returnbean;
}
}

如果spring中存在User對(duì)象,則將它的userName設(shè)置成:蘇三說(shuō)技術(shù)。

其實(shí),我們經(jīng)常使用的注解,比如:@Autowired、@Value、@Resource、@PostConstruct等,是通過(guò)AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor實(shí)現(xiàn)的。

9.初始化方法

目前spring中使用比較多的初始化bean的方法有:

  1. 使用@PostConstruct注解
  2. 實(shí)現(xiàn)InitializingBean接口

9.1 使用@PostConstruct注解

@Service
publicclassAService{
@PostConstruct
publicvoidinit(){
System.out.println("===初始化===");
}
}

在需要初始化的方法上增加@PostConstruct注解,這樣就有初始化的能力。

9.2 實(shí)現(xiàn)InitializingBean接口

@Service
publicclassBServiceimplementsInitializingBean{

@Override
publicvoidafterPropertiesSet()throwsException{
System.out.println("===初始化===");
}
}

實(shí)現(xiàn)InitializingBean接口,重寫afterPropertiesSet方法,該方法中可以完成初始化功能。

10.關(guān)閉容器前

有時(shí)候,我們需要在關(guān)閉spring容器前,做一些額外的工作,比如:關(guān)閉資源文件等。

這時(shí)可以實(shí)現(xiàn)DisposableBean接口,并且重寫它的destroy方法:

@Service
publicclassDServiceimplementsInitializingBean,DisposableBean{

@Override
publicvoiddestroy()throwsException{
System.out.println("DisposableBeandestroy");
}

@Override
publicvoidafterPropertiesSet()throwsException{
System.out.println("InitializingBeanafterPropertiesSet");
}
}

這樣spring容器銷毀前,會(huì)調(diào)用該destroy方法,做一些額外的工作。

通常情況下,我們會(huì)同時(shí)實(shí)現(xiàn)InitializingBean和DisposableBean接口,重寫初始化方法和銷毀方法。

11.自定義作用域

我們都知道spring默認(rèn)支持的Scope只有兩種:

  • singleton 單例,每次從spring容器中獲取到的bean都是同一個(gè)對(duì)象。
  • prototype 多例,每次從spring容器中獲取到的bean都是不同的對(duì)象。

spring web又對(duì)Scope進(jìn)行了擴(kuò)展,增加了:

  • RequestScope 同一次請(qǐng)求從spring容器中獲取到的bean都是同一個(gè)對(duì)象。
  • SessionScope 同一個(gè)會(huì)話從spring容器中獲取到的bean都是同一個(gè)對(duì)象。

即便如此,有些場(chǎng)景還是無(wú)法滿足我們的要求。

比如,我們想在同一個(gè)線程中從spring容器獲取到的bean都是同一個(gè)對(duì)象,該怎么辦?

這就需要自定義Scope了。

第一步實(shí)現(xiàn)Scope接口:

publicclassThreadLocalScopeimplementsScope{
privatestaticfinalThreadLocalTHREAD_LOCAL_SCOPE=newThreadLocal();

@Override
publicObjectget(Stringname,ObjectFactoryobjectFactory){
Objectvalue=THREAD_LOCAL_SCOPE.get();
if(value!=null){
returnvalue;
}

Objectobject=objectFactory.getObject();
THREAD_LOCAL_SCOPE.set(object);
returnobject;
}

@Override
publicObjectremove(Stringname){
THREAD_LOCAL_SCOPE.remove();
returnnull;
}

@Override
publicvoidregisterDestructionCallback(Stringname,Runnablecallback){
}

@Override
publicObjectresolveContextualObject(Stringkey){
returnnull;
}

@Override
publicStringgetConversationId(){
returnnull;
}
}

第二步將新定義的Scope注入到spring容器中:

@Component
publicclassThreadLocalBeanFactoryPostProcessorimplementsBeanFactoryPostProcessor{
@Override
publicvoidpostProcessBeanFactory(ConfigurableListableBeanFactorybeanFactory)throwsBeansException{
beanFactory.registerScope("threadLocalScope",newThreadLocalScope());
}
}

第三步使用新定義的Scope:

@Scope("threadLocalScope")
@Service
publicclassCService{
publicvoidadd(){
}
}


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    396

    瀏覽量

    17269
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    490

    瀏覽量

    21986
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    335

    瀏覽量

    14259

原文標(biāo)題:聊聊 Spring 中最常用的 11 個(gè)擴(kuò)展點(diǎn)

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    功能測(cè)試覆蓋中最常見的是什么方法

    功能測(cè)試覆蓋是軟件測(cè)試過(guò)程中的一個(gè)重要環(huán)節(jié),它主要關(guān)注軟件產(chǎn)品的功能實(shí)現(xiàn)是否符合需求規(guī)格說(shuō)明。在功能測(cè)試覆蓋中,有多種方法可以采用,以確保測(cè)試的全面性和有效性。本文將詳細(xì)介紹功能測(cè)試覆蓋中最常
    的頭像 發(fā)表于 05-30 14:55 ?365次閱讀

    SpingBoot的5個(gè)擴(kuò)展點(diǎn),超級(jí)實(shí)用!

    我們?cè)趩?dòng)Spring Boot項(xiàng)目的時(shí)候,是執(zhí)行這樣一個(gè)方法來(lái)啟動(dòng)的
    的頭像 發(fā)表于 02-22 11:28 ?372次閱讀
    SpingBoot的5<b class='flag-5'>個(gè)</b><b class='flag-5'>擴(kuò)展</b><b class='flag-5'>點(diǎn)</b>,超級(jí)實(shí)用!

    計(jì)算機(jī)網(wǎng)絡(luò)中最常用的通信協(xié)議

    絞線是目前最常用的傳輸介質(zhì)之一,它由兩根絞在一起的導(dǎo)線組成,可用于傳輸模擬或數(shù)字信號(hào)。同軸電纜也是一種常用的傳輸介質(zhì),它由內(nèi)外兩層導(dǎo)體組成,中間填充絕緣材料。
    發(fā)表于 02-19 09:51 ?427次閱讀

    Spring中經(jīng)典的9種設(shè)計(jì)模式

    spring常用的設(shè)計(jì)模式達(dá)到九種,我們一一舉例
    的頭像 發(fā)表于 12-11 09:56 ?720次閱讀
    <b class='flag-5'>Spring</b>中經(jīng)典的9種設(shè)計(jì)模式

    Spring中依賴注入的四種方式

    詳細(xì)介紹四種常見的依賴注入方式。 第一種方式是構(gòu)造函數(shù)注入。構(gòu)造函數(shù)注入是最基礎(chǔ)也是最常用的依賴注入方式之一。它通過(guò)在對(duì)象創(chuàng)建時(shí)將依賴的對(duì)象作為參數(shù)傳遞給構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)注入。在Spring中,我們可以使用``標(biāo)簽來(lái)配置構(gòu)造函數(shù)注入。例
    的頭像 發(fā)表于 12-03 15:11 ?1470次閱讀

    Spring MVC的工作原理是怎樣的

    Spring MVC是一種基于Java的Web框架,它充分利用了Java的優(yōu)點(diǎn),如面向?qū)ο缶幊?、模塊化、可重用性和可擴(kuò)展性。Spring MVC的工作原理可以總結(jié)為以下幾個(gè)步驟:請(qǐng)求的發(fā)送、請(qǐng)求
    的頭像 發(fā)表于 11-22 16:53 ?567次閱讀

    Spring依賴注入的方式

    Spring 是一個(gè)開源的輕量級(jí)框架,可以用于構(gòu)建企業(yè)級(jí)應(yīng)用程序。其最重要的特性之一是依賴注入(Dependency Injection,DI),這是一種設(shè)計(jì)模式,它可以幫助我們解耦代碼、提高
    的頭像 發(fā)表于 11-22 15:12 ?387次閱讀

    springcloud如何實(shí)現(xiàn)分布式

    Spring Cloud提供了服務(wù)注冊(cè)與發(fā)現(xiàn)的功能,其中最常用的是Eureka和Consul。這些工具可以幫助我
    的頭像 發(fā)表于 11-16 11:01 ?562次閱讀

    spring分布式框架有哪些

    Spring分布式框架是一套基于Spring框架的解決方案,用于構(gòu)建分布式系統(tǒng)。它提供了一系列的組件和模塊,可以幫助開發(fā)人員輕松地構(gòu)建可擴(kuò)展、高可用、高性能的分布式應(yīng)用程序。下面將詳細(xì)介紹一些
    的頭像 發(fā)表于 11-16 10:58 ?650次閱讀

    反激式電源中最常見的噪聲來(lái)源

    電子發(fā)燒友網(wǎng)站提供《反激式電源中最常見的噪聲來(lái)源.doc》資料免費(fèi)下載
    發(fā)表于 11-15 10:34 ?1次下載
    反激式電源<b class='flag-5'>中最常</b>見的噪聲來(lái)源

    Spring Cloud :打造可擴(kuò)展的微服務(wù)網(wǎng)關(guān)

    Spring Cloud Gateway是一個(gè)基于Spring Framework 5和Project Reactor的反應(yīng)式編程模型的微服務(wù)網(wǎng)關(guān)。它提供了豐富的功能,包括動(dòng)態(tài)路由、請(qǐng)求限流、集成安全性等,使其成為構(gòu)建微服務(wù)架構(gòu)
    的頭像 發(fā)表于 10-22 10:03 ?427次閱讀
    <b class='flag-5'>Spring</b> Cloud :打造可<b class='flag-5'>擴(kuò)展</b>的微服務(wù)網(wǎng)關(guān)

    Spring Boot 的設(shè)計(jì)目標(biāo)

    什么是Spring Boot Spring Boot 是 Spring 開源組織下的一個(gè)子項(xiàng)目,也是 Spring 組件一站式解決方案,主要
    的頭像 發(fā)表于 10-13 14:56 ?487次閱讀
    <b class='flag-5'>Spring</b> Boot 的設(shè)計(jì)目標(biāo)

    Spring Boot Actuator快速入門

    一下 Spring Boot Actuator ,學(xué)習(xí)如何在 Spring Boot 2.x 中使用、配置和擴(kuò)展這個(gè)監(jiān)控工具。 Spring Boot 1.x 的使用就不再這邊介紹了。
    的頭像 發(fā)表于 10-09 17:11 ?528次閱讀

    Spring Boot時(shí)配置JSON序列化選項(xiàng)的幾種方法

    看看配置序列化和反序列化選項(xiàng)的最常用方法。 默認(rèn)配置 默認(rèn)情況下,Spring Boot的配置將禁用以下配置項(xiàng)。 MapperFeature.DEFAULT_VIEW_INCLUSION
    的頭像 發(fā)表于 10-09 10:26 ?1820次閱讀

    Spring AOP如何破解java應(yīng)用

    前面我們看過(guò)javaassit是如何破解java應(yīng)用,核心都是AOP相關(guān)的知識(shí),今天我們看下Spring AOP是怎么回事! Spring-AOP spring 5.x版本 AOP面向切面編程,通過(guò)
    的頭像 發(fā)表于 09-25 11:16 ?779次閱讀
    <b class='flag-5'>Spring</b> AOP如何破解java應(yīng)用