当前位置:首页 > 科技  > 软件

SpringBoot项目开发中常用的一些技巧总结

来源: 责编: 时间:2024-02-01 12:51:32 310观看
导读环境:SpringBoot2.7.161. Bean初始化及销毁如你希望Bean对象被创建过程中执行以下初始化动作,你可以通过实现InitializingBean接口或者使用@PostConstruct注解。@Componentpublic class InitDataToRedis implements Ini

环境:SpringBoot2.7.16CaL28资讯网——每日最新资讯28at.com

1. Bean初始化及销毁

如你希望Bean对象被创建过程中执行以下初始化动作,你可以通过实现InitializingBean接口或者使用@PostConstruct注解。CaL28资讯网——每日最新资讯28at.com

@Componentpublic class InitDataToRedis implements InitializingBean {  public void afterPropertiesSet() throws Exception {    // 初始化  }}@Componentpublic class PersonService {  @PostConstruct  public void init() {    // 初始化  }}

如希望在容器关闭时执行资源释放或者其它一些动作可以实现DisposableBean接口或者使用@PreDestroy注解。CaL28资讯网——每日最新资讯28at.com

public class Person implements DisposableBean {  public void destroy() {    // 销毁动作  }}@Componentpublic class PersonService {  @PreDestroy  public void destroy() {    // 销毁  }}

2. 单例Bean注入多例Bean

// 多例Bean@Component@Scope("prototype")public class PersonService {}// 默认单例Bean@Controllerpublic class PersonController {}

如上如何在PersonController中注入PersonService呢?通过如下方法CaL28资讯网——每日最新资讯28at.com

方法1:CaL28资讯网——每日最新资讯28at.com

@Lazyprivate PersonService personService ;

方法2:CaL28资讯网——每日最新资讯28at.com

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

方法3:CaL28资讯网——每日最新资讯28at.com

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

3. BeanPostProcessor接口

如需要Bean在初始化前后执行相关的动作,可以通过实现该接口。CaL28资讯网——每日最新资讯28at.com

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的相关属性可以通过实现该接口CaL28资讯网——每日最新资讯28at.com

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

5. 动态注册Bean

如需要根据添加动态注册Bean,比如通过扫描包下的类符合条件的类注册为Bean对象,则可以通过如下的方式。CaL28资讯网——每日最新资讯28at.com

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注解的三种用法是必备的!》CaL28资讯网——每日最新资讯28at.com

7. *Runner接口

如需要在应用程序成功启动以后,执行一些任务,可以通过实现ApplicationRunner或者CommandLineRunner接口。CaL28资讯网——每日最新资讯28at.com

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. 全局异常处理

当应用发生异常时可以通过注册全局异常处理,统一处理异常信息CaL28资讯网——每日最新资讯28at.com

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

10 全局类型转换

自定义类型转换CaL28资讯网——每日最新资讯28at.com

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

注册类型转换器CaL28资讯网——每日最新资讯28at.com

@Componentpublic class WebConfig implements WebMvcConfigurer {  @Override  public void addFormatters(FormatterRegistry registry) {    registry.addConverter(new CustomGenericConverter()) ;  }  }

以上示例注册了一个,将字符串转换为Teacher和Student。CaL28资讯网——每日最新资讯28at.com

11. 获取BeanFactory对象

如果你希望在Bean中获取BeanFactory,可以通过实现BeanFactoryAware接口CaL28资讯网——每日最新资讯28at.com

@Servicepublic class PersonService implements BeanFactoryAware {  private BeanFactory beanFactory;  @Override  public void setBeanFactory(BeanFactory beanFactory) throws BeansException {      this.beanFactory = beanFactory;  }}

相关的*Aware接口,还有很多,如:ApplicationContextAware,ServletContextAware,BeanNameAware,EnvironmentAware等。CaL28资讯网——每日最新资讯28at.com

12. Web拦截器

如你需要对某些接口进行鉴权或者其它一些处理,你可以注册自定义拦截器CaL28资讯网——每日最新资讯28at.com

@Componentpublic 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切面实现

BeanNameAutoProxyCreatorCaL28资讯网——每日最新资讯28at.com

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

上面的BeanNameAutoProxyCreator 是处理器类,只要beanName的后缀是Service结尾的都会被创建代理,然后通过以tokenInterceptor为beanName的拦截器增强。CaL28资讯网——每日最新资讯28at.com

以上是在SpringBoot项目开发中常用的一些技巧,希望本文对你有帮助。CaL28资讯网——每日最新资讯28at.com

完毕!!!CaL28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-70454-0.htmlSpringBoot项目开发中常用的一些技巧总结

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 在项目中如何避免Java中的内存泄漏和解决内存泄漏问题

下一篇: Java中的缓存技术及其使用场景

标签:
  • 热门焦点
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    2023年上半年已经正式过去了,我们也迎来了安兔兔V10版本,在新的骁龙8Gen3和天玑9300发布之前,性能榜的榜单大体会以骁龙8Gen2和天玑9200+为主,至于那颗3.36GHz的骁龙8Gen2领先
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 消息称小米汽车开始筛选交付中心:需至少120个车位

    IT之家 7 月 7 日消息,日前,有微博简介为“汽车行业从业者、长三角一体化拥护者”的微博用户 @长三角行健者 发文表示,据经销商集团反馈,小米汽车目前
  • 三星折叠屏手机去年销售近1000万台 今年目标定为1500万

    7月29日消息,三星率先发力可折叠手机市场,在全球市场已经取得了非常亮眼的成绩,接下来会进一步巩固和扩大这一优势。三星在推出Galaxy Z Flip5和Galax
  • 中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    11月18日,记者从2022中关村论坛新闻发布会上获悉,中关村论坛将于11月25至30日在京举行。本届中关村论坛由科学技术部、国家发展改革委、工业和信息化部、国务
Top