转载请注明出处:
在项目开发过程中,往往是直接应用很多jar包中依赖且声明好的Bean,拿来即用,但很多场景也需要对这些原生的Bean 进行自定义,定制化封装,这样在项目使用的过程中,可以使用自定义的Bean,而不是原生的Bean。下面总结了几种定制化原生Bean 的几种方式:
1. 在项目中创建同包同类名的类
这种方式使用较少,因为项目中的包路径根据开发规范是根据业务名自定义的包路径
2.使用 @Primary 注解,或 @Qualifier 注解,定义Bean 的优先级或使用时,指定Bean
- @Primary 优先考虑,优先考虑被注解的对象注入
- @Qualifier 名字声明,声明后对名字进行使用
当一个类有多个Bean的实例时,可以在 Bean 的实现类中 使用 @Primary 注解声明Bean 的优先级,在使用过程中,spring则默认加载该类实例化出的Bean。而 @Qualifiler 注解先声明后使用,相当于多个实现起多个不同的名字,注入时候告诉我你要注入哪个;
@Primary 在源码中使用的示例: spring-cloud-starter-gateway 3.1.1 版本中的 GatewayAutoConfiguration 中的源码
@Qualiflier 注解使用,当一个类有多个Bean 实例时,在使用 Bean 时,通过 @Qualiflier 制定Bean
使用:
3. 使用 @ComponentScan 里面的 excludeFilters 排除不需要加载的类
示例如下,排除 MyTestFilter 类
这里需要注意的是,可以定义一个与原生相同的Bean,但在 上面引包的时候,需要引入的包路径是要排除的包路径,这样自定义的相同的类就可以加载到容器中,原生的Bean 则不会加载。
这种方式也是常用的方式;
4.使用 @Bean 注解覆盖原生的Bean
该场景针对,框架jar包中有@ConditionalOnMissingBean注解,这种注解是说明如果你也创建了一个一样的Bean则框架就不自己再次创建这个bean了,这样你可以覆写自己的bean。
直接继承要覆盖的类,自己重写里面方法,使用@Component注入到 spring 中去:
spring-cloud-starter-gateway 3.1.1 版本中的 GatewayAutoConfiguration 中的源码对 HttpClientFactory 的定义
重新自定义 该类的方法为: 直接继承要覆盖的类,自己重写里面方法,使用@Component注入到spring中去
5. 使用BeanDefinitionRegistryPostProcessor
使用 Spring 提供的 Bean 后置处理器,进行自定义的Bean 加载;
最常见的重写自定义Bean 的方式为以上的 2,3,4 三种方式,通过以上方式就可以实现重写并自定义原生的Bean;
Original: https://www.cnblogs.com/zjdxr-up/p/16533930.html
Author: 香吧香
Title: 重写并自定义依赖的原生的Bean方法
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/613163/
转载文章受原作者版权保护。转载请注明原作者出处!