精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

這六個Spring高級開發技巧掌握了嗎?

開發 前端
如果在SpringWeb項目中,類型轉換功能通常是由框架內部自動處理的,尤其是在Spring MVC的Controller層,當請求參數需要綁定到方法的參數時。

環境:Spring5.3.33

1. Lifecycle接口

Lifecycle接口是一個定義啟動/停止生命周期控制方法的通用接口。它允許Bean對象和容器(通常是Spring的ApplicationContext本身)實現啟動和停止操作,接口定義:

public interface Lifecycle {
  // Spring容器啟動之前執行
  void start();
  // Spring容器在要關閉時執行
  void stop();
  // 判斷是否正在運行
  boolean isRunning();
}

注意,常規的org.springframework.context.Lifecycle接口是顯式啟動和停止通知的簡單約定,并不意味著在上下文刷新時自動啟動。為了細粒度地控制自動啟動和特定bean的優雅停止(包括啟動和停止階段),你應該實現org.springframework.context.SmartLifecycle接口。

如下示例:

public class PackLifecycle implements SmartLifecycle {
  private volatile boolean running ;
  @Override
  public void start() {
    this.running = true;
    System.out.println("lifecycle start ... ") ;
  }
  @Override
  public void stop() {
    this.running = false ;
    System.out.println("lifecycle stop ... ") ;
  }
  @Override
  public boolean isRunning() {
    return running ;
  }
}

start/stop執行時機

start方法執行

public abstract class AbstractApplicationContext {
  public void refresh() {
    // ...
    // 實例化單例bean
    finishBeanFactoryInitialization(beanFactory);
    // 完成上下文刷新操作最后一步執行
    finishRefresh();
  }
  protected void finishRefresh() {
    // 通過LifecycleProcessor#onRefresh方法執行Lifecycle#start方法
    getLifecycleProcessor().onRefresh();
  }
}

stop方法執行

public abstract class AbstractApplicationContext {
  // 當容器關閉時執行
  public void close() {
    doClose();
  }
  protected void doClose() {
    // 通過LifecycleProcessor#onClose方法執行Lifecycle#stop方法
    this.lifecycleProcessor.onClose();
  }
}

你可以通過自定義Lifecycle,在容器啟動完成時和容器關閉時做你需要的人和事。

2. FactoryBean接口

如果你想自定義完全控制bean的實例化,那么你可以通過實現FactoryBean接口。

FactoryBean<T>接口提供了三種方法:

  • T getObject():  返回此工廠創建的對象的實例。實例可能是共享的,這取決于此工廠返回的是單件還是原型。
  • boolean isSingleton():  如果此FactoryBean返回singletons,則返回true;否則返回false。此方法的默認實現返回true。
  • Class<?> getObjectType(): 返回getObject()方法返回的對象類型,如果類型事先未知,則返回null。

如下示例:

public class User {}
@Component("user")
public class UserFactoryBean implements FactoryBean<User> {
  @Override
  public User getObject() throws Exception {
    // 自定義對象實例化
    User user = new User() ;
    return user ;
  }
  @Override
  public Class<?> getObjectType() {
    return User.class;
  }
}

雖然我們定義的是FactoryBean實例,但是我們使用的時候還是可以按照User類型注入使用即可,如下示例:

@Resource
private User user;

那如何獲取UserFactoryBean這個對象呢?我們可以通過如下方式:

try (GenericApplicationContext context = new GenericApplicationContext()) {
  // ...
  System.out.println(context.getBean("&user")) ;
}

在beanName之前添加'&'符合即可獲取真實的UserFactoryBean對象。

3. 非web環境優雅關閉容器

如果在非web應用程序環境中(例如,在富客戶端桌面環境中)使用Spring的IoC容器,請向JVM注冊關閉掛鉤。這樣做可以確保正常關閉,并在單例bean上調用相關的destroy方法,從而釋放所有資源。通過容器對象ConfigurableApplicationContext#registerShutdownHook()方法注冊關閉鉤子。

public class User implements DisposableBean {
  @Override
  public void destroy() throws Exception {
    System.out.println("User Object destroy...") ;
  }
}


public static void main(String[] args) {
  GenericApplicationContext context = new GenericApplicationContext() ;
  context.registerBean(User.class) ;
  // 該方法會啟動一個線程,該線程會關閉onClose方法;這樣bean相關的生命周期方法都能被調用
  context.registerShutdownHook() ;
  context.refresh() ; 
}
// 控制臺輸出;如果沒有調用registerShutdownHook則不會有任何輸出
User Object destroy...

注意:在SpringBoot環境下,上面的registerShutdownHook是自動調用。

4. 資源注入

我們可以直接通過@Value注解注入資源,如下示例:

@Value("${pack.images:file:///d:/images/1.png}")
private Resource res ;
// 將上面注入的資源,將圖片直接輸出到瀏覽器、
@GetMapping("/res0")
public void res0(HttpServletResponse response) throws Exception {
  response.setContentType("image/png") ;
  StreamUtils.copy(res.getInputStream(), response.getOutputStream()) ;
}

也可以注入資源數組;

@Component
public class PackResource {
  private final Resource[] templates ;
  public PackResource(@Value("${pack.templates.path}") Resource[] templates) {
    this.templates = templates;
  }
}

資源路徑配置;

pack:
  templates:
    path: classpath*:com/pack/templates/*.ftl

ResourceLoaderAware接口

ResourceLoaderAware接口是一個特殊的回調接口,用于標識期望為其提供ResourceLoader引用的組件,如下示例:

@Component
public class PackResourceLoader implements ResourceLoaderAware {


  @Override
  public void setResourceLoader(ResourceLoader resourceLoader) {
    Resource resource = resourceLoader.getResource("classpath:com/pack/templates/1.txt") ;
    System.out.println(StreamUtils.copyToString(resource.getInputStream(), StandardCharsets.UTF_8)) ;
  }
}

注意:由于ApplicationContext是ResourceLoader,因此bean還可以實現ApplicationContextAware接口,并直接使用提供的應用程序上下文來加載資源。但是,一般來說,如果你只需要專用的ResourceLoader接口,那么最好使用該接口。代碼將只耦合到資源加載接口(可以被視為實用程序接口),而不耦合到整個Spring ApplicationContext接口。

5. 參數驗證

參數驗證一般都只是用在Controller請求方法上,如下示例:

@PostMapping("")
public Object save(@Validated @RequestBody User user, BindingResult errors) {
  // TODO
}

在SpringBoot環境下(SpringBoot當你引入了validation模塊后,會自動配置Validator),你可以在任意管理的Bean中使用參數驗證功能,如下示例:

private final Validator validator ;
public UserService(Validator validator) {
  this.validator = validator ;
}
public void save(User user) {
  Errors errors = ...
  this.validator.validate(user, errors) ;
  if (errors.hasErrors()) {
    // TODO
  }
}

如果你不在SpringBoot環境下,那么你可以手動注冊Validator

@Bean
public LocalValidatorFactoryBean validator() {
  return new LocalValidatorFactoryBean() ;
}

有關參數驗證的其它更加全面的知識,請查看下面這篇文章:

必讀!SpringBoot接口參數校驗N種實用技巧大揭秘

SpringBoot參數驗證@Validated和@Valid分清楚了嗎?這些驗證細節你知道嗎?

6. 類型轉換

如果在SpringWeb項目中,類型轉換功能通常是由框架內部自動處理的,尤其是在Spring MVC的Controller層,當請求參數需要綁定到方法的參數時。然而,在應用程序的其他部分,比如Service層或其他組件中,有時我們確實需要手動執行類型轉換。在這些情況下,我們可以利用Spring提供的ConversionService接口來完成數據類型之間的轉換。

在Spring Boot環境下,系統自動為我們配置了ConversionService可以被注入到任何Bean對象中,以便我們在需要的時候使用它。如下示例:

private final ConversionService conversionService ;
public PackComponent(ConversionService conversionService) {
  this.conversionService = conversionService ;
}
public Object convert(Object source, Class<?> targetType) {  
  // 檢查源對象和目標類型是否為null  
  if (source == null || targetType == null) {  
    throw new IllegalArgumentException("Source or target type cannot be null");  
  }  
  // 嘗試進行類型轉換  
  return conversionService.convert(source, targetType) ;  
}

非常方便的進行類型轉換。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2025-04-08 09:10:00

PillowPython圖像處理

2025-02-28 13:00:00

JavaScrip開發語言

2024-03-12 12:27:00

Vue 3前端開發

2023-09-24 13:55:42

Spring應用程序

2021-08-23 11:35:00

工具yyds開源

2021-09-03 09:57:13

開源技術 項目

2025-05-06 09:10:00

Python路徑處理os.path

2018-05-20 16:17:50

物聯網互聯產品成熟度模型

2024-09-20 15:37:02

2024-03-06 10:50:30

云計算云實例云提供商

2016-12-15 09:53:07

自學編程技巧

2022-04-29 17:03:37

WordPress開發者網站安全

2025-01-07 08:21:03

2024-01-30 08:43:26

IF 語句JavaScripJS

2023-02-08 17:00:07

IF 語句技巧代碼

2024-07-15 08:10:57

2023-10-10 18:24:46

PostgreSQL性能RDBMS

2015-07-30 14:43:04

導航欄iOS開發

2016-01-04 15:20:46

2016趨勢互聯網

2021-11-16 11:30:10

Linux命令運維
點贊
收藏

51CTO技術棧公眾號

亚洲第一福利视频在线| 亚洲国产影院| 欧美欧美欧美欧美| 日本黄色a视频| 国产黄色av网站| 国产精品mm| 欧美高清性hdvideosex| 精品国产一区二区三区在线| 狠狠躁日日躁夜夜躁av| 欧美一级网站| 最近2019中文字幕mv免费看| 国产探花在线观看视频| 91吃瓜在线观看| 久久综合九色综合97婷婷女人| 午夜精品久久久久久久99黑人| 国产精品久久不卡| 激情欧美一区二区三区黑长吊| 97se亚洲国产综合自在线观| 国产精品午夜国产小视频| 亚洲AV成人无码精电影在线| 日韩精品免费视频一区二区三区| 午夜电影网亚洲视频| 日韩wuma| 亚洲精选一区二区三区| 国产精品资源| 久久九九有精品国产23| 国产又黄又粗又猛又爽的视频 | 日本黄色录像片| 国产日韩另类视频一区| 亚洲精品自拍动漫在线| 欧美激情导航| 国产免费的av| 视频一区二区三区入口| 美日韩精品视频免费看| 国产全是老熟女太爽了| 午夜精品在线| 欧美美女直播网站| www黄色日本| 中文在线观看免费| 久久免费美女视频| 国产三级精品在线不卡| 911美女片黄在线观看游戏| 国产视频一区三区| 欧美激情喷水视频| 日韩av片在线免费观看| 小嫩嫩12欧美| 亚洲国产天堂久久综合网| 午夜啪啪小视频| 午夜精品久久久久久久久久蜜桃| 一区二区国产盗摄色噜噜| 亚洲v国产v在线观看| 视频污在线观看| 国产成人av影院| 国产精品久久婷婷六月丁香| 妺妺窝人体色www聚色窝仙踪| 国产一区国产二区国产三区| 日韩经典第一页| 日本一级大毛片a一| 成人激情久久| 欧美剧情电影在线观看完整版免费励志电影| 精品无码国模私拍视频| 男女在线视频| 一级日本不卡的影视| 欧美乱做爰xxxⅹ久久久| 久草在线资源站资源站| 亚洲h精品动漫在线观看| 日本a级片免费观看| 日本免费久久| 欧美日韩国产小视频| 亚洲av无日韩毛片久久| 涩涩屋成人免费视频软件| 欧美精品一区二区在线观看| 日韩一级视频在线观看| 国产一区二区三区四区| 久久精品欧美视频| 久久视频免费看| 国产精品久久久久毛片大屁完整版| 欧美一区二区三区免费视| 黄色污污视频软件| 激情五月婷婷综合| 产国精品偷在线| 天堂av在线免费| 久久久噜噜噜久久中文字幕色伊伊| 欧美成人免费在线| 日本免费在线观看| 偷偷要91色婷婷| 欧美日韩在线观看不卡| 日韩精品一区二区三区免费视频| 亚洲国产欧美一区| a资源在线观看| 国内精品亚洲| 国产精品99免视看9| 国产美女无遮挡永久免费| a在线播放不卡| 亚洲精品日韩精品| 爱看av在线| 欧美色偷偷大香| 色婷婷免费视频| 我不卡影院28| 欧美一级电影久久| 国产av无码专区亚洲a∨毛片| 97se亚洲国产综合自在线| 在线观看欧美激情| 欧美黄色网页| 欧美岛国在线观看| 五月天色婷婷丁香| 午夜亚洲视频| 99精品国产高清一区二区| 你懂的在线免费观看| 亚洲精品成人a在线观看| 妞干网在线免费视频| 中文字幕亚洲在线观看| 色婷婷综合成人av| 国产精品自拍99| 国产91色综合久久免费分享| 婷婷久久青草热一区二区| 999精品网| 欧美一级专区免费大片| 日韩女同一区二区三区| 亚洲作爱视频| 国产精品成人观看视频免费| 在线观看免费黄色| 欧美日韩加勒比精品一区| 亚洲国产欧美日韩在线| 91亚洲国产高清| 国产精品成人播放| 青青草视频免费在线观看| 亚洲成人第一页| 精产国品一区二区三区| 亚洲国产精品91| 国产狼人综合免费视频| 狠狠色伊人亚洲综合网站l| 狠狠躁18三区二区一区| 中国免费黄色片| 欧美久久影院| 99高清视频有精品视频| 国产在线激情| 91精品欧美综合在线观看最新 | 国产精品日韩成人| 成年人视频在线免费| 久久99精品久久久野外观看| 日韩在线精品一区| 在线观看xxxx| 中文字幕一区av| 一二三级黄色片| 午夜精品视频一区二区三区在线看| 国产精品久久久久久久午夜 | 久久夜精品香蕉| 一级黄色片在线| 国产精品福利av| 天天干天天色天天干| 国产精品传媒精东影业在线 | 久9re热视频这里只有精品| 久久久女女女女999久久| 女人18毛片水真多18精品| 亚洲国产一二三| 日本五十肥熟交尾| 鲁大师成人一区二区三区| 欧美一区二视频在线免费观看| 亚洲十八**毛片| 国产一区二区精品丝袜| 中文字幕精品无码亚| 亚洲国产高清在线| 欧美国产日韩另类| 欧美日韩免费| 欧美极品色图| 91精品美女| 欧美精品免费在线| 少妇一级淫片免费看| 色综合视频一区二区三区高清| 熟妇高潮精品一区二区三区| 狂野欧美性猛交xxxx巴西| 亚洲无玛一区| 亚洲1区在线观看| 2018中文字幕一区二区三区| 成人午夜电影在线观看| 91精品一区二区三区久久久久久| 久久久久久久9999| 97se亚洲国产综合在线| 天天爽人人爽夜夜爽| 91精品啪在线观看国产81旧版| www.一区二区三区| 北岛玲heyzo一区二区| 日韩在线小视频| 亚洲高清视频在线播放| 欧美丝袜一区二区| 日本 欧美 国产| av电影天堂一区二区在线| 亚洲成色www.777999| 亚洲一级淫片| 欧美日韩三区四区| 麻豆一区在线| 日本不卡高字幕在线2019| fc2ppv国产精品久久| 日韩电影中文字幕av| 91精品国自产| 欧美日韩中文在线| 欧美人禽zoz0强交| 久久精品男人的天堂| 男人女人拔萝卜视频| 美女日韩在线中文字幕| 日本五级黄色片| 成人影院在线| 久久久人人爽| 日韩成人视屏| 国产欧美日韩精品在线观看| 91九色porn在线资源| 久久最新资源网| 福利在线午夜| 亚洲国产精品va在看黑人| 国产又粗又大又爽视频| 欧美日韩激情美女| 国产一级片久久| 亚洲欧洲国产专区| 亚洲精品视频久久久| 国产成人免费在线视频| 日韩一区二区三区久久| 美女精品一区| www黄色av| 亚洲区一区二| 久久99久久99精品| 久久久久免费av| 亚洲视频sss| 精品国产乱码久久久| 国产亚洲自拍偷拍| 中文字幕区一区二区三| 亚洲精品免费一区二区三区| 成人国产精品| 国产精品96久久久久久| 欧美羞羞视频| 青青草原一区二区| 欧美aa免费在线| 国内精品美女av在线播放| 亚洲羞羞网站| 九九热视频这里只有精品| 麻豆视频免费在线观看| www.亚洲一区| 国产黄在线看| 国产一区二区三区日韩欧美| 青青草av免费在线观看| 亚洲欧洲国产精品| 九色蝌蚪在线| 中文字幕日韩欧美在线 | 国产精品流白浆在线观看| 97人人模人人爽人人少妇| 国产精品亚洲欧美一级在线| 亚洲最大的免费| 欧美第一在线视频| 国产高清一区二区三区| 成人高潮a毛片免费观看网站| 成人永久免费| 全国精品免费看| 久久精品一区二区三区不卡免费视频| 欧美美女在线直播| 免费久久久一本精品久久区| 最新亚洲精品| 视频一区免费观看| 国产精品成久久久久| 黄色网在线视频| 在线欧美福利| 成人一级片网站| 日精品一区二区三区| www.这里只有精品| 国产九色精品成人porny| 日本一级大毛片a一| 久久奇米777| 潮喷失禁大喷水aⅴ无码| 亚洲美女少妇撒尿| 日韩av女优在线观看| 在线一区二区三区| 一级黄色大片免费| 精品日韩在线一区| 免费在线黄色网址| 久久国产一区二区三区| 超清av在线| 国产精品91在线| 欧洲大片精品免费永久看nba| 国产伦精品一区二区三区在线| 欧美久久精品| 中文字幕在线观看一区二区三区| 91超碰国产精品| 日本精品免费在线观看| 精品中文字幕一区二区小辣椒| 国产性猛交96| 中文字幕av资源一区| 久久久久久免费观看| 在线影视一区二区三区| 亚洲第一第二区| 亚洲午夜av久久乱码| 69成人在线| 日韩av免费在线播放| 日本免费精品| 日韩高清国产一区在线观看| 午夜电影亚洲| 男人天堂成人在线| 成人午夜视频在线观看| 国产视频123区| 欧美日韩国产综合视频在线观看中文 | www.桃色.com| 久久无码av三级| 久久综合加勒比| 欧美男女性生活在线直播观看| 成人毛片在线精品国产| 一区二区三区亚洲| 97人人爽人人澡人人精品| 成人综合网网址| 国产伦精品一区二区三区视频 | 老**午夜毛片一区二区三区 | 国产精品欧美激情在线| 亚洲老头老太hd| gogo久久| 亚洲自拍偷拍视频| 色综合久久一区二区三区| jizzjizzxxxx| www.欧美精品一二区| 欧美成人免费观看视频| 欧美欧美欧美欧美首页| 免费a级毛片在线观看| 国内精品模特av私拍在线观看 | 久久久久久久久久码影片| 国产综合久久| 人妻体体内射精一区二区| 中文字幕av不卡| 一区二区三区麻豆| 亚洲美女喷白浆| 成人短视频app| 开心色怡人综合网站| 在线免费观看欧美| 国产香蕉精品视频| 一区二区激情小说| 亚洲精品一区二区三区新线路| 免费不卡欧美自拍视频| 成人网av.com/| 超碰在线免费观看97| 久久国产精品色| 蜜桃av免费观看| 欧美日韩亚洲综合在线 | 亚洲成人一区在线| 国产91免费在线观看| 久久999免费视频| 午夜电影一区| 福利视频一区二区三区四区| 国产传媒日韩欧美成人| 免费在线观看av网址| 亚洲第一精品夜夜躁人人躁| 成人影音在线| 久久99国产精品| 日韩经典中文字幕一区| 国产91丝袜美女在线播放| 欧美日韩在线直播| 日本激情视频在线观看| 91美女片黄在线观看游戏| 自拍日韩欧美| 中文字幕在线视频播放| 欧美日韩加勒比精品一区| 青青青草原在线| 国产精品爽黄69天堂a| 五月激情综合| 蜜臀av粉嫩av懂色av| 精品成人久久av| 黄色在线视频观看网站| 国产日韩欧美在线播放| 欧美在线播放| 久久人妻一区二区| 欧美在线视频不卡| 最爽无遮挡行房视频在线| 狠狠色狠狠色综合人人| 玖玖精品视频| 老熟妻内射精品一区| 亚洲国产精品免费| 欧美一区 二区 三区| 在线视频精品一区| 风流少妇一区二区| 天码人妻一区二区三区在线看| 国产亚洲精品美女| 伊人亚洲精品| 国产成人无码精品久久久性色| 国产女人aaa级久久久级| 国产色片在线观看| 欧美一级淫片aaaaaaa视频| 久久国产中文字幕| 精品人妻一区二区三区免费| 午夜精品久久久| 在线看av的网址| 国产另类第一区| 奇米亚洲午夜久久精品| 久久久久成人精品无码| 亚洲午夜女主播在线直播| 国产亚洲字幕| 日韩有码免费视频| 国产精品你懂的在线| 黄色一级a毛片| 国产欧美精品va在线观看| 亚洲区欧美区| 日韩在线中文字幕视频| 亚洲欧美日韩爽爽影院| 麻豆国产一区| 一级黄色录像在线观看| 日韩欧美在线播放| 丁香花视频在线观看|