当前位置: 首页 > news >正文

新北建设局网站株洲seo排名

新北建设局网站,株洲seo排名,小米手机网站架构,网站未备案可以做经营活动吗在Spring Boot应用开发中#xff0c;依赖注入是最常用的功能之一#xff0c;它极大地简化了对象之间的依赖关系管理。 然而#xff0c;当Spring容器中存在多个类型相同的Bean时#xff0c;就会产生注入冲突问题。 本文将介绍Spring Boot中的四种Bean注入冲突解决方案。 …在Spring Boot应用开发中依赖注入是最常用的功能之一它极大地简化了对象之间的依赖关系管理。 然而当Spring容器中存在多个类型相同的Bean时就会产生注入冲突问题。 本文将介绍Spring Boot中的四种Bean注入冲突解决方案。 一、Bean注入冲突的基本概念 1.1 什么是Bean注入冲突 Bean注入冲突指的是当Spring容器中存在多个相同类型的Bean实例时在进行依赖注入时Spring不知道应该注入哪一个实例的情况。这通常发生在以下场景 多个类实现了同一个接口配置了多个相同类型的Bean引入的第三方库中含有相同类型的Bean定义 1.2 示例场景 假设我们有一个支付服务接口PaymentService以及它的两个实现类AlipayService和WechatPayService public interface PaymentService {boolean pay(BigDecimal amount); }Service public class AlipayService implements PaymentService {Overridepublic boolean pay(BigDecimal amount) {System.out.println(使用支付宝支付: amount);return true;} }Service public class WechatPayService implements PaymentService {Overridepublic boolean pay(BigDecimal amount) {System.out.println(使用微信支付: amount);return true;} }当我们尝试注入PaymentService时Spring会抛出NoUniqueBeanDefinitionException异常 Service public class OrderService {private final PaymentService paymentService;Autowiredpublic OrderService(PaymentService paymentService) {this.paymentService paymentService;}public void processOrder(BigDecimal amount) {paymentService.pay(amount);} }错误信息通常是 org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type com.example.service.PaymentService available: expected single matching bean but found 2: alipayService,wechatPayService这就是典型的Bean注入冲突问题下面我们将介绍四种解决方案。 二、使用Primary注解指定主要Bean 2.1 基本原理 Primary注解用于指示当多个Bean满足自动装配条件时被注解的Bean应该优先被考虑。 一旦某个Bean被标记为主要BeanSpring在自动装配时会优先选择它。 2.2 实现方式 修改上述例子我们可以为其中一个实现类添加Primary注解 Service Primary public class AlipayService implements PaymentService {Overridepublic boolean pay(BigDecimal amount) {System.out.println(使用支付宝支付: amount);return true;} }Service public class WechatPayService implements PaymentService {Overridepublic boolean pay(BigDecimal amount) {System.out.println(使用微信支付: amount);return true;} }这样当注入PaymentService时Spring会自动选择AlipayService。 2.3 在Java配置类中使用Primary 如果Bean是通过Bean方法定义的也可以在方法上使用Primary Configuration public class PaymentConfig {BeanPrimarypublic PaymentService alipayService() {return new AlipayService();}Beanpublic PaymentService wechatPayService() {return new WechatPayService();} }2.4 优缺点分析 优点 简单直观只需添加一个注解不需要修改注入点的代码适合有明确主要实现的场景 缺点 一个类型只能有一个PrimaryBean不够灵活无法根据不同的注入点选择不同的实现在某些场景下可能不够明确 2.5 适用场景 系统中有一个明确的默认或主要实现希望在不修改现有代码的情况下更改默认行为第三方库集成时需要指定首选实现 三、使用Qualifier注解指定Bean名称 3.1 基本原理 Qualifier注解用于在依赖注入点上指定要注入的Bean的名称从而明确告诉Spring应该注入哪个Bean。 3.2 实现方式 首先可以为Bean定义指定名称 Service(alipay) public class AlipayService implements PaymentService {// 实现略 }Service(wechat) public class WechatPayService implements PaymentService {// 实现略 }然后在注入点使用Qualifier指定要注入的Bean名称 Service public class OrderService {private final PaymentService paymentService;Autowiredpublic OrderService(Qualifier(wechat) PaymentService paymentService) {this.paymentService paymentService;}public void processOrder(BigDecimal amount) {paymentService.pay(amount);} }也可以在字段注入时使用 Service public class OrderService {AutowiredQualifier(alipay)private PaymentService paymentService;// 方法略 }3.3 自定义限定符 除了使用Bean名称作为限定符外还可以创建自定义的限定符注解 Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Qualifier public interface Alipay { }Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Qualifier public interface Wechat { }然后在Bean和注入点使用这些注解 Service Alipay public class AlipayService implements PaymentService {// 实现略 }Service Wechat public class WechatPayService implements PaymentService {// 实现略 }Service public class OrderService {AutowiredWechatprivate PaymentService paymentService;// 方法略 }3.4 优缺点分析 优点 精确控制每个注入点使用的Bean可以在不同的注入点使用不同的实现通过自定义限定符可以提高代码可读性 缺点 需要修改每个注入点的代码增加了代码的耦合度如果注入点很多需要修改的地方也很多 3.5 适用场景 不同的业务场景需要不同的实现Bean的选择逻辑是静态的在编码时就能确定代码清晰度和明确性比灵活性更重要的场景 四、使用Resource按名称注入 4.1 基本原理 Resource是JavaEE的注解Spring对其提供了支持。与Autowired主要按类型匹配不同Resource默认按名称匹配只有当找不到与名称匹配的Bean时才会按类型匹配。 4.2 实现方式 不需要修改Bean定义只需在注入点使用Resource并指定名称 Service public class OrderService {Resource(name alipayService)private PaymentService paymentService;public void processOrder(BigDecimal amount) {paymentService.pay(amount);} }如果不指定name属性则使用字段名或参数名作为Bean名称 Service public class OrderService {Resourceprivate PaymentService alipayService; // 会查找名为alipayService的Bean// 方法略 }在构造函数参数中使用Resource Service public class OrderService {private final PaymentService paymentService;public OrderService(Resource(name wechatPayService) PaymentService paymentService) {this.paymentService paymentService;}// 方法略 }4.3 优缺点分析 优点 不需要额外的Qualifier注解可以利用字段名自动匹配Bean名称是JavaEE标准的一部分不是Spring特有的 缺点 不如Qualifier灵活不支持自定义限定符不支持与Primary的配合使用Spring官方更推荐使用Autowired和Qualifier的组合 4.4 适用场景 需要按名称注入且不想使用额外注解的场景迁移自JavaEE的项目字段名与Bean名称一致的简单场景 五、使用条件注解进行动态配置 5.1 基本原理 Spring Boot提供了一系列ConditionalOn...注解用于根据条件动态决定是否创建某个Bean。这可以用来解决Bean冲突问题通过在运行时动态决定使用哪个Bean。 5.2 常用条件注解 Spring Boot提供了多种条件注解常用的包括 ConditionalOnProperty基于配置属性的条件ConditionalOnClass基于类存在的条件ConditionalOnMissingBean基于Bean不存在的条件ConditionalOnExpression基于SpEL表达式的条件ConditionalOnWebApplication基于Web应用的条件 5.3 实现方式 使用ConditionalOnProperty根据配置属性决定创建哪个Bean Configuration public class PaymentConfig {BeanConditionalOnProperty(name payment.type, havingValue alipay, matchIfMissing true)public PaymentService alipayService() {return new AlipayService();}BeanConditionalOnProperty(name payment.type, havingValue wechat)public PaymentService wechatPayService() {return new WechatPayService();} }在application.properties或application.yml中配置 payment.typewechat使用ConditionalOnMissingBean创建默认实现 Configuration public class PaymentConfig {BeanConditionalOnMissingBean(PaymentService.class)public PaymentService defaultPaymentService() {return new AlipayService();} }结合多种条件 Configuration public class PaymentConfig {BeanConditionalOnProperty(name payment.enabled, havingValue true, matchIfMissing true)ConditionalOnClass(name com.alipay.sdk.AlipayClient)public PaymentService alipayService() {return new AlipayService();}BeanConditionalOnProperty(name payment.type, havingValue wechat)ConditionalOnMissingBean(PaymentService.class)public PaymentService wechatPayService() {return new WechatPayService();} }5.4 使用Profile进行环境隔离 Profile注解也是一种特殊的条件注解可以根据不同的环境创建不同的Bean Configuration public class PaymentConfig {BeanProfile(dev)public PaymentService mockPaymentService() {return new MockPaymentService();}BeanProfile(prod)public PaymentService alipayService() {return new AlipayService();} }然后通过配置spring.profiles.active属性激活相应的环境 spring.profiles.activedev5.5 自定义条件注解 如果内置的条件注解不满足需求还可以创建自定义条件注解 public class OnPaymentTypeCondition implements Condition {Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {// 获取注解属性MapString, Object attributes metadata.getAnnotationAttributes(ConditionalOnPaymentType.class.getName());String type (String) attributes.get(value);// 获取环境属性String paymentType context.getEnvironment().getProperty(payment.type);return type.equals(paymentType);} }Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Conditional(OnPaymentTypeCondition.class) public interface ConditionalOnPaymentType {String value(); }使用自定义条件注解 Configuration public class PaymentConfig {BeanConditionalOnPaymentType(alipay)public PaymentService alipayService() {return new AlipayService();}BeanConditionalOnPaymentType(wechat)public PaymentService wechatPayService() {return new WechatPayService();} }5.6 优缺点分析 优点 灵活性极高可以根据各种条件动态决定使用哪个Bean不需要修改注入点代码降低耦合度可以通过配置文件更改行为无需修改代码适合复杂的决策逻辑 缺点 配置相对复杂条件逻辑可能分散在多个地方降低可读性调试困难特别是当条件组合复杂时 5.7 适用场景 根据环境或配置动态选择不同实现的场景第三方库集成需要根据类路径决定使用哪个实现微服务架构中的可插拔组件需要通过配置文件控制应用行为的场景 六、总结 在实际应用中应根据项目需求和复杂度选择合适的方案或者混合使用多种方案。 通过合理解决Bean注入冲突问题我们可以充分利用Spring的依赖注入功能构建灵活、松耦合的应用架构。
http://www.sczhlp.com/news/194746/

相关文章:

  • 专业门户网站建设网站收录查询情况
  • 做3d兼职网站设计网名的软件
  • 网站建设有什么好的介绍网站建设公司优惠中
  • 网站建设的团队分工公司级别网站开发
  • c 能做网站传奇简单网站模板
  • 网站备案照相网站的搜索框如何做
  • 建设网站一定要会代码吗做篮球网站用的背景图
  • 主流网站宽度易科技 建设网站
  • 云南网站建设一度科技公司个人网站有什么内容
  • 省博物馆网站建设帮人家做家务的网站
  • 山东环保行业网站开发郑州专业网站建设公司
  • dede 中英文网站北京中高端网站建设
  • 太原网站关键词推广杭州做网站小芒
  • 泰兴公司做网站文章资讯类网站模板
  • 建设网站的题目广州网站建设建航科技公司
  • 江苏网站建设渠道无版权图片做网站
  • 个人建站系统wordpress评分管理
  • 英语_阅读_telescope_待读
  • fiddler早期免费版下载,fiddler抓包工具及使用
  • 2025 年污水处理设备厂家最新推荐!国内优质厂家综合实力排行榜,助力企业精准挑选高效环保处理设备
  • Spring Boot 集成免费的 EdgeTTS 实现文本转语音
  • 网站加搜索框室内设计师工作内容
  • 深圳建筑室内设计网站wordpress去掉竖线
  • 做网站 做应用免费自动回收的传奇手游
  • 网站建设算无形资产吗营销策略英文
  • 淘宝直播要先建设个网站吗ps做网站需注意什么
  • 直接ip访问网站wordpress注册邮箱
  • 网站建设问题做淘宝客怎么建网站
  • 网站设计评语无代码开发小程序
  • 用哪个网站做相册视频政务网站建设实施方案