spring core中的自动装配与xml配置冲突

2023-12-26

以帖子为参考Spring @Autowired 和 @Qualifier https://stackoverflow.com/questions/40830548/spring-autowired-and-qualifier

我们有这个例子来解决自动装配冲突:

public interface Vehicle {
     public void start();
     public void stop();
}

有两颗豆子,Car and Bike实施Vehicle界面。

@Component(value="car")
public class Car implements Vehicle {

     @Override
     public void start() {
           System.out.println("Car started");
     }

     @Override
     public void stop() {
           System.out.println("Car stopped");
     }
 }

@Component(value="bike")
public class Bike implements Vehicle {

     @Override
     public void start() {
          System.out.println("Bike started");
     }

     @Override
     public void stop() {
          System.out.println("Bike stopped");
     }
}

@Component
public class VehicleService {

    @Autowired
    @Qualifier("bike")
    private Vehicle vehicle;

    public void service() {
         vehicle.start();
         vehicle.stop();
    }
}

这是解决这个问题的一个很好的例子。

但是当我遇到同样的问题但在应用程序上下文中没有这些应答器时:

<context:component-scan></context:component-scan>
<context:annotation-config></context:annotation-config>

所有问题都可以通过使用来解决@Qualifier注释,但在我的例子中,我们不使用允许使用注释的应答器。

问题是 :

如何仅使用应用程序上下文中的配置来解决此问题,就是这样,不使用注释?

我搜索了很多并且我发现人们在谈论autowirebean 声明中的属性<bean id="dao" class="package.IDao" autowire="byName"></bean> https://dzone.com/articles/explain-major-benefits-amp-limits-of-auto-wiring-i我需要更多解释。


如何仅使用应用程序中的配置来解决此问题 语境?

你可以使用qualifier如下所示的标签(参见https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/beans.html#beans-autowired-annotation-qualifiers https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/beans.html#beans-autowired-annotation-qualifiers)

<context:annotation-config/>
  <beans>
    <bean class="your_pkg_route.Vehicle">
      <qualifier value="bike"/>
    </bean>
  </beans>
</context:annotation-config>

我发现人们在谈论 bean 中的 autowire 属性 声明,我需要更多解释

使用注释

@Autowired https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/annotation/Autowired.html用于 bean 声明方法会通过(另一个)声明的 bean 注入定义的依赖项。现在,如果您的依赖项位于应用程序的同一上下文中,则无需使用@Autowired根本不需要注释,因为 Spring 能够自己找出它们。因此,如果您的依赖项位于应用程序上下文之外,那么您可以使用它。

例如,参考以下代码:

@Autowired
@Bean
public MyBean getMybean(Dependency1 depdency1, Dependency2 depdency2) {
    return new MyBean(depdency1.getSomeStuff(), depdency2.getSomeOtherStuff());
}

Here, @Autowired会找到一个实例Dependency1 and Dependency2并将提供它们来创建一个实例MyBean.

使用xml配置

From 专业春季5 https://www.apress.com/gp/book/9781484228074... Spring 支持五种自动装配模式。

  • byName:使用时byName自动装配,Spring 尝试将每个属性连接到同名的 bean。因此,如果目标 bean 有一个名为foo and a foo豆定义在ApplicationContext, the foo豆被分配给foo目标的属性。
  • byType:使用时byType自动装配,Spring 尝试连接每个 通过自动使用相同类型的 bean 来实现目标 bean 的属性ApplicationContext.
  • constructor: 这个功能就像byType接线,不同之处在于它使用构造函数而不是设置器来执行注入。 Spring 尝试在构造函数中匹配最大数量的参数。因此,如果您的 bean 有两个构造函数,其中一个接受String和一个接受String and an Integer,并且您同时拥有String and an Integer豆子在你的ApplicationContext,Spring使用双参数构造函数。
  • default: Spring 将在以下之间进行选择constructor and byType模式 自动地。如果您的 bean 有一个默认(无参数)构造函数,Spring 使用byType;否则,它使用构造函数。
  • no: 这是默认的

所以,在你的情况下,你需要做这样的事情(但是,我不会推荐它。为什么?,你需要声明Vehicle类作为一个 bean 和一个组件这是不正确的,请参阅Spring:@Component 与 @Bean https://stackoverflow.com/questions/10604298/spring-component-versus-bean。另一方面,我不确定你是否可以使用它,只是将其声明为 bean):

// xml config
<context:annotation-config/>
  <beans>

    // use the primary tag here too! in order to say this the primary bean
    // this only works when there are only two implementations of the same interface
    <bean id="bike" primary="true" class="your_pkg_route.Bike"/>
    <bean id="car" class="your_pkg_route.Car"/>         

    <bean autowire="byName" class="your_pkg_route.VehicleService"/>

  <beans>
</context:annotation-config>

// VehicleService
@Component
public class VehicleService {

    private Vehicle bike;   // call attribute 'bike' so it is autowired by its name

    public void service() {
         //...
    }
}

正如您所看到的,尝试使用 xml 配置执行此操作会遇到很多复杂情况,因此我建议您如果可能的话使用注释选项。

相关文章:

  • 为什么 Spring 配置类中的 @Bean 方法不需要 @Autowired? https://stackoverflow.com/questions/32078600/why-do-i-not-need-autowired-on-bean-methods-in-a-spring-configuration-class
  • @Bean 和 @Autowired 之间的区别 https://stackoverflow.com/questions/34172888/difference-between-bean-and-autowired

PS:我还没有测试任何发布的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring core中的自动装配与xml配置冲突 的相关文章

  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 静态方法中的统一

    一个可能很简单的问题 但很奇怪为什么我不知道该怎么做 Unity PRISM 和静态方法 在这种特殊情况下 需要使用扩展方法 但一般来说 如何在静态方法中访问 统一提供的实例 想想例如我想访问一个日志服务来记录我在静态方法中所做的一些事情
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 将不同类型的参数传递给 jdbctemplate 查询

    我正在尝试使用带有少量不同类型参数的 where 子句从数据库中检索记录 这是我编写的简单方法 我将breedId和性别作为参数传递 public List
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef

随机推荐