国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

SpringBoot項目開發中常用的一些技巧總結

開發 項目管理
BeanNameAutoProxyCreator 是處理器類,只要beanName的后綴是Service結尾的都會被創建代理,然后通過以tokenInterceptor為beanName的攔截器增強。

環境:SpringBoot2.7.16

1. Bean初始化及銷毀

如你希望Bean對象被創建過程中執行以下初始化動作,你可以通過實現InitializingBean接口或者使用@PostConstruct注解。

@Component
public class InitDataToRedis implements InitializingBean {
  public void afterPropertiesSet() throws Exception {
    // 初始化
  }
}


@Component
public class PersonService {
  @PostConstruct
  public void init() {
    // 初始化
  }
}

如希望在容器關閉時執行資源釋放或者其它一些動作可以實現DisposableBean接口或者使用@PreDestroy注解。

public class Person implements DisposableBean {
  public void destroy() {
    // 銷毀動作
  }
}
@Component
public class PersonService {
  @PreDestroy
  public void destroy() {
    // 銷毀
  }
}

2. 單例Bean注入多例Bean

// 多例Bean
@Component
@Scope("prototype")
public class PersonService {
}
// 默認單例Bean
@Controller
public class PersonController {}

如上如何在PersonController中注入PersonService呢?通過如下方法

方法1:

@Lazy
private PersonService personService ;

方法2:

@Component
@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class PersonService {}

方法3:

public class PersonController {
  @Resource
  private ApplicationContext context ;
  
  public Object index() {
    PersonService ps = this.context.getBean(PersonService.class) ;
  }
}

3. BeanPostProcessor接口

如需要Bean在初始化前后執行相關的動作,可以通過實現該接口。

public class PackBeanPostProcessor implements BeanPostProcessor {
  @Override
  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    // 初始化前執行
  }
  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    // 初始化后執行
  }
}

4. BeanFactoryPostProcessor接口

如你希望在創建Bean對象之前修改BeanDefinition的相關屬性可以通過實現該接口

public PackBeanFactoryPostProcessor implements BeanFactoryPostProcessor {


  @Override
  public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    BeanDefinition definition = beanFactory.getBeanDefinition("person") ;
    // 修改了作用域
    definition.setScope("prototype") ;
  }  
}

5. 動態注冊Bean

如需要根據添加動態注冊Bean,比如通過掃描包下的類符合條件的類注冊為Bean對象,則可以通過如下的方式。

public class RepositoryBeanDefinitionRegister implements BeanDefinitionRegistryPostProcessor {
  @Override
  public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
    // 動態注冊person
    registry.registerBeanDefinition("person", BeanDefinitionBuilder.genericBeanDefinition(Person.class).getBeanDefinition());
  }
}

6.導入配置類

詳細查看《想成為Spring專家?了解@Import注解的三種用法是必備的!》

7. *Runner接口

如需要在應用程序成功啟動以后,執行一些任務,可以通過實現ApplicationRunner或者CommandLineRunner接口。

public class App implements CommandLineRunner {
  public void run(String... args) throws Exception {
    // 執行任務
  }
}
// 或
public class App implements ApplicationRunner {
  public void run(ApplicationArguments args) throws Exception {
    // 執行任務
  }
}

8. 全局異常處理

當應用發生異常時可以通過注冊全局異常處理,統一處理異常信息

@RestControllerAdvice
public class GlobalControllerAdvice {


  @ExceptionHandler({Exception.class})
  public Object handle(Exception e) {
    // 其它處理
    return R.failure(R.ResultCode.FAILURE, e.getMessage()) ;
  }
  
}

10 全局類型轉換

自定義類型轉換

public class CustomGenericConverter implements GenericConverter {


  @Override
  public Set<ConvertiblePair> getConvertibleTypes() {
    ConvertiblePair teacherPair = new ConvertiblePair(String.class, Teacher.class) ;
    ConvertiblePair studentPair = new ConvertiblePair(String.class, Student.class) ;
    Set<ConvertiblePair> pairs = new HashSet<>() ;
    pairs.add(teacherPair) ;
    pairs.add(studentPair) ;
    return pairs ;
  }


  @Override
  public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
    String str = null ;
    if (sourceType.getObjectType() == String.class) {
      str = (String) source ; 
    }
    if (targetType.getObjectType() == Teacher.class) {
      String[] t = str.split("\\|") ;
      return new Teacher(t[0], Integer.valueOf(t[1])) ;
    }
    if (targetType.getObjectType() == Student.class) {
      String[] t = str.split("\\|") ;
      return new Student(t[0], t[1]) ;
    }
    return null ;
  }


}

注冊類型轉換器

@Component
public class WebConfig implements WebMvcConfigurer {


  @Override
  public void addFormatters(FormatterRegistry registry) {
    registry.addConverter(new CustomGenericConverter()) ;
  }
  
}

以上示例注冊了一個,將字符串轉換為Teacher和Student。

11. 獲取BeanFactory對象

如果你希望在Bean中獲取BeanFactory,可以通過實現BeanFactoryAware接口

@Service
public class PersonService implements BeanFactoryAware {
  private BeanFactory beanFactory;


  @Override
  public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
      this.beanFactory = beanFactory;
  }
}

相關的*Aware接口,還有很多,如:ApplicationContextAware,ServletContextAware,BeanNameAware,EnvironmentAware等。

12. Web攔截器

如你需要對某些接口進行鑒權或者其它一些處理,你可以注冊自定義攔截器

@Component
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(new HandlerInterceptor() {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
          System.out.println("preHandle method invoke...") ;
          return true;
        }
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
          System.out.println("postHandle method invoke...") ;
        }
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) throws Exception {
          System.out.println("afterCompletion method invoke...") ;
        }
      }).addPathPatterns("/**") ;
    }
  }
}

13. 默認AOP切面實現

BeanNameAutoProxyCreator

@Bean
public BeanNameAutoProxyCreator beanNameAutoProxyCreator() {
  BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator();
  beanNameAutoProxyCreator.setBeanNames("*Service") ;
  beanNameAutoProxyCreator.setInterceptorNames("tokenInterceptor");
  return beanNameAutoProxyCreator ;
}

上面的BeanNameAutoProxyCreator 是處理器類,只要beanName的后綴是Service結尾的都會被創建代理,然后通過以tokenInterceptor為beanName的攔截器增強。

以上是在SpringBoot項目開發中常用的一些技巧,希望本文對你有幫助。

完畢!!!

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

2014-05-13 09:55:13

iOS開發工具

2020-10-19 19:25:32

Python爬蟲代碼

2011-07-12 09:47:53

WebService

2010-10-08 16:32:59

MySQL語句

2021-08-28 11:47:52

json解析

2022-02-17 13:58:38

Linux技巧文件

2009-11-26 10:32:57

PHP代碼優化

2018-01-09 18:06:41

Python爬蟲技巧

2013-03-29 13:17:53

XCode調試技巧iOS開發

2012-05-21 10:13:05

XCode調試技巧

2011-06-01 16:50:21

JAVA

2011-07-19 18:11:09

iPhone 開發

2010-09-28 14:14:19

SQL語句

2011-03-15 17:46:43

2011-08-01 13:59:22

Oracle數據庫命名空間

2009-06-04 09:14:32

struts學習struts常用屬性

2021-10-12 23:10:58

UnsafeJavaJDK

2011-05-23 18:06:24

站內優化SEO

2011-10-26 20:55:43

ssh 安全

2009-11-30 09:39:46

VS2003版本
點贊
收藏

51CTO技術棧公眾號

欧美性理论片在线观看片免费| 欧美香蕉大胸在线视频观看| 午夜在线a亚洲v天堂网2018| 欧美在线观看你懂的| 成人av影视在线| 久久久久久草| hd国产人妖ts另类视频| 国产一区二区精品久久91| 中文字幕欧美专区| 国产a级片免费观看| 欧美网色网址| 在线亚洲人成电影网站色www| 国产精品视频福利| caoprom在线| 欧美日韩亚洲另类| 8x8ⅹ国产精品一区二区二区| 国产三级一区| 亚洲视频综合在线| 国精产品99永久一区一区| 男女视频在线| 久久久久久电影| 国产在线精品自拍| hd国产人妖ts另类视频| 日韩欧美一级二级三级久久久| 国产亚洲精品久久久久久久| 奇米影视一区二区三区| 2024亚洲男人天堂| 日本在线人成| 99国产欧美另类久久久精品 | 欧美婷婷精品激情| 成人羞羞网站| 日韩成人激情视频| 白虎精品一区| 成人午夜在线免费| 亚洲aa中文字幕| 日本免费一区二区三区等视频| 亚洲国产你懂的| 宅男av一区二区三区| 国产日韩视频在线| 国产视频在线观看一区二区| 黑人巨大精品欧美一区二区奶水| 免费欧美在线| 青青草原国产免费| 国产精品久久久久久久久久10秀| 日韩在线观看免费网站| 91xxx在线观看| 99re热视频精品| 爆乳熟妇一区二区三区霸乳| 亚洲制服av| 亚洲色婷婷久久精品av蜜桃| 久久综合久久综合久久综合| 国产精品久久7| 日本一不卡视频| 黄色aaa级片| 日韩二区三区在线观看| 国产精品爽爽爽| 欧美亚洲二区| 日韩av理论片| 成人性片免费| 日韩精品专区在线影院重磅| 向日葵视频成人app网址| 欧洲美女7788成人免费视频| 久久电影天堂| 国产精品久久久久久久久久久新郎 | 国产一区二区三区精品欧美日韩一区二区三区| 9191国产视频| 欧美日韩岛国| 欧亚精品在线观看| 99精品国产在热久久| 91久久嫩草影院一区二区| 伊人久久一区| 亚洲国产高清自拍| av网站在线免费观看| 精品小视频在线| 精品久久精品| 国产91色在线| 日韩精品1区2区3区| 成年美女网站| 欧美经典一区二区三区| 成人一级生活片| 激情综合网av| 中文字幕免费在线不卡| 亚洲免费电影在线| 老司机性视频| 亚洲最新在线观看| 国产一级电影网| 亚洲国产精品人久久电影| 午夜免费播放观看在线视频| 欧美成人合集magnet| 成人自拍视频| 久久夜色撩人精品| 超薄肉色丝袜脚交一区二区| 亚洲人午夜精品| 日韩久久一区二区三区| 国产精品www色诱视频| av在线不卡电影| 欧美 日本 亚洲| 不卡高清视频专区| 日韩网站在线免费观看| 91亚洲精品一区二区乱码| 水蜜桃一区二区三区| 日本aⅴ精品一区二区三区| 国产一二区视频| 欧美日韩国产91| 日本三级久久| 黄色片网址在线观看| 国产欧美日韩三区| 欧美精品总汇| 致1999电视剧免费观看策驰影院| 欧美中文字幕一区| 日韩精品第一区| 精品日本一区二区| 麻豆国产91在线播放| 国产人妻互换一区二区| 国产成人在线视频网址| 男女私大尺度视频| 亚洲第一区在线| 激情综合电影网| 亚洲国产一区在线| 成人精品电影在线观看| caoporm免费视频在线| 日韩的一区二区| 亚洲区欧美区| 国产日产欧美一区二区| 欧美日韩久久不卡| 伊人色综合一区二区三区影院视频| 亚洲男人天堂九九视频| 成人污版视频| 久久久久久久午夜| 久久久av亚洲男天堂| 国产午夜一区| av五月婷婷| 日韩一区二区精品葵司在线| 久久久人成影片一区二区三区在哪下载 | 国产三级三级三级精品8ⅰ区| 啊灬啊灬啊灬啊灬高潮在线看| 欧美大秀在线观看| 欧美日韩中文| 人操人视频在线观看| 精品国产一区二区亚洲人成毛片| 黑人一区二区三区| 欧美国产日韩激情| 欧美日韩在线免费观看| 久久精品不卡| 视频一区二区视频| 亚洲精品一区久久久久久| 国产伦精品一区二区三区视频青涩| 日本中文字幕高清| 高清一区二区三区四区五区| 一区二区日韩免费看| 77导航福利在线| 亚洲一区二区不卡视频| 亚洲精品国产一区二区精华液| 国产精品va在线观看视色| 久久精品综合一区| 日韩理论片久久| 久久久久久一级片| 精品久久网站| 超碰porn在线| 日本欧美视频在线观看| 992tv成人免费影院| 日本欧美在线观看| 国产极品久久久久久久久波多结野| 国产高清精品在线观看| 欧美精品丝袜中出| 国产主播性色av福利精品一区| 日本一区二区不卡高清更新| 亚洲国产成人午夜在线一区| av在线小说| 国产91对白刺激露脸在线观看| 国产成人精品久久亚洲高清不卡| 国产成人av一区二区三区在线| 国产精品一级伦理| 97在线视频观看| 美女网站在线免费欧美精品| 午夜免费性福利| 久久精品中文字幕| 亚洲精品视频在线观看免费| 影院欧美亚洲| 国产69精品久久| 原千岁中文字幕| 曰韩不卡视频| 青青草原成人在线视频| 欧美xxxxxxxx| 日韩视频二区| japanese23hdxxxx日韩| 日本一区高清在线视频| 日韩欧美在线视频免费观看| 黄色资源网久久资源365| 国模吧精品视频| 678在线观看视频| 国产视频一二三| 亚洲国产午夜伦理片大全在线观看网站| 欧美激情啊啊啊| 日韩三级在线免费观看| 亚洲视频香蕉人妖| 国产精品一区免费在线观看| 999久久久亚洲| 精品国产亚洲一区二区三区| 日本人体一区二区|