成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot項(xiàng)目開發(fā)中常用的一些技巧總結(jié)

開發(fā) 項(xiàng)目管理
BeanNameAutoProxyCreator 是處理器類,只要beanName的后綴是Service結(jié)尾的都會(huì)被創(chuàng)建代理,然后通過以tokenInterceptor為beanName的攔截器增強(qiáng)。

環(huán)境:SpringBoot2.7.16

1. Bean初始化及銷毀

如你希望Bean對(duì)象被創(chuàng)建過程中執(zhí)行以下初始化動(dòng)作,你可以通過實(shí)現(xiàn)InitializingBean接口或者使用@PostConstruct注解。

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


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

如希望在容器關(guān)閉時(shí)執(zhí)行資源釋放或者其它一些動(dòng)作可以實(shí)現(xiàn)DisposableBean接口或者使用@PreDestroy注解。

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

2. 單例Bean注入多例Bean

// 多例Bean
@Component
@Scope("prototype")
public class PersonService {
}
// 默認(rèn)單例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在初始化前后執(zhí)行相關(guān)的動(dòng)作,可以通過實(shí)現(xiàn)該接口。

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

4. BeanFactoryPostProcessor接口

如你希望在創(chuàng)建Bean對(duì)象之前修改BeanDefinition的相關(guān)屬性可以通過實(shí)現(xiàn)該接口

public PackBeanFactoryPostProcessor implements BeanFactoryPostProcessor {


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

5. 動(dòng)態(tài)注冊(cè)Bean

如需要根據(jù)添加動(dòng)態(tài)注冊(cè)Bean,比如通過掃描包下的類符合條件的類注冊(cè)為Bean對(duì)象,則可以通過如下的方式。

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

6.導(dǎo)入配置類

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

7. *Runner接口

如需要在應(yīng)用程序成功啟動(dòng)以后,執(zhí)行一些任務(wù),可以通過實(shí)現(xiàn)ApplicationRunner或者CommandLineRunner接口。

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

8. 全局異常處理

當(dāng)應(yīng)用發(fā)生異常時(shí)可以通過注冊(cè)全局異常處理,統(tǒng)一處理異常信息

@RestControllerAdvice
public class GlobalControllerAdvice {


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

10 全局類型轉(zhuǎn)換

自定義類型轉(zhuǎn)換

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


}

注冊(cè)類型轉(zhuǎn)換器

@Component
public class WebConfig implements WebMvcConfigurer {


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

以上示例注冊(cè)了一個(gè),將字符串轉(zhuǎn)換為Teacher和Student。

11. 獲取BeanFactory對(duì)象

如果你希望在Bean中獲取BeanFactory,可以通過實(shí)現(xiàn)BeanFactoryAware接口

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


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

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

12. Web攔截器

如你需要對(duì)某些接口進(jìn)行鑒權(quán)或者其它一些處理,你可以注冊(cè)自定義攔截器

@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. 默認(rèn)AOP切面實(shí)現(xiàn)

BeanNameAutoProxyCreator

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

上面的BeanNameAutoProxyCreator 是處理器類,只要beanName的后綴是Service結(jié)尾的都會(huì)被創(chuàng)建代理,然后通過以tokenInterceptor為beanName的攔截器增強(qiáng)。

以上是在SpringBoot項(xiàng)目開發(fā)中常用的一些技巧,希望本文對(duì)你有幫助。

完畢!!!

責(zé)任編輯:武曉燕 來源: Spring全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2014-05-13 09:55:13

iOS開發(fā)工具

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代碼優(yōu)化

2018-01-09 18:06:41

Python爬蟲技巧

2011-06-01 16:50:21

JAVA

2013-03-29 13:17:53

XCode調(diào)試技巧iOS開發(fā)

2012-05-21 10:13:05

XCode調(diào)試技巧

2011-07-19 18:11:09

iPhone 開發(fā)

2010-09-28 14:14:19

SQL語句

2011-03-15 17:46:43

2009-06-04 09:14:32

struts學(xué)習(xí)struts常用屬性

2011-08-01 13:59:22

Oracle數(shù)據(jù)庫命名空間

2011-10-26 20:55:43

ssh 安全

2011-05-23 18:06:24

站內(nèi)優(yōu)化SEO

2021-10-12 23:10:58

UnsafeJavaJDK

2009-11-30 09:39:46

VS2003版本
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久高清国产视频 | 日韩成人在线播放 | 国产在视频一区二区三区吞精 | 天天综合日日夜夜 | 国产黄视频在线播放 | 久久久精选| 精品欧美一区二区在线观看欧美熟 | 久久久成人免费一区二区 | 欧美一区二区三区在线观看视频 | 888久久久 | 国产精品久久久久久久久久 | 日本a网站 | 亚洲激情一区二区三区 | 亚洲va国产日韩欧美精品色婷婷 | 中文字幕97 | 中文字幕av网 | 蜜臀网站 | 天天射美女 | 中文字幕在线免费观看 | 成人免费大片黄在线播放 | 日韩高清国产一区在线 | 久久久91精品国产一区二区三区 | 91精品国产91 | 2023亚洲天堂 | 精品日韩一区二区 | 国产精品99久久久久久久vr | 97国产在线观看 | 国产日韩一区二区 | 久久在线免费 | 免费一区二区三区在线视频 | jizz18国产 | 欧美一区二区大片 | 97综合在线 | 亚洲综合天堂网 | 综合久| 久久久精彩视频 | 99精品国产在热久久 | 91精品免费视频 | 欧美国产日韩精品 | 国产精品69毛片高清亚洲 | 久久久久久久久久久久久久国产 |