当前位置: 首页 > 知识库问答 >
问题:

使用Constructor注入扫描Spring Auto Components

司承业
2023-03-14

我知道如何单独使用自动元件扫描和构造器注入。http://www.mkyong.com/spring/spring-auto-scanning-components/http://www.dzone.com/tutorials/java/spring/spring-bean-constructor-injection-1.html

是否可以将自动组件扫描与构造函数注入结合使用?使用自动组件扫描时,spring框架扫描所有指向“基包”的类,并通过调用每个没有参数的构造函数来创建每个类的实例。让我们说如何修改以下类和相关的SpringXML文件。

package com.fb.common;
@Repository
public class Person {

    private String name;
    private int age;

    public Person(String name, int age){
        this.name=name;
        this.age=age;
    }

    public String toString(){
        return "Name: "+name+" Age:"+age;
    }

}

XML文件

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <context:component-scan base-package="com.fb.common" />

    <!--
    <bean id="person" class="com.fb.common.Person">
        <constructor-arg type="java.lang.String" value="DefaultName"/>
        <constructor-arg type="int" value="30"/>
    </bean>
    -->
</beans>

共有3个答案

楚良平
2023-03-14

如果启用了组件扫描,Spring 将尝试创建一个 Bean,即使该类的 Bean 已经在 spring 配置 xml 中定义。但是,如果在spring配置文件中定义的bean和自动发现的bean具有相同的名称,则spring在执行组件扫描时不会创建新的bean。如果 Bean 没有无参数构造函数,则必须至少有一个构造函数是自动连接的。如果没有构造函数是自动连接的,spring 将尝试使用默认的 no-args 构造函数创建一个对象。您可以在此处找到有关此主题的更多信息

慎星纬
2023-03-14

您需要将@Value注释添加到每个构造函数参数中

public Person(@Value("DefaultName")String name, @Value("30")int age){
    this.name=name;
    this.age=age;
}

您可以使用属性占位符来引用属性文件中定义的属性,而不是对值进行硬编码。

public Person(@Value("${person.defaultName}")String name, @Value("${person.age}")int age){
    this.name=name;
    this.age=age;
}

像Person(实体值对象)这样的类通常不会被创建为spring beans。

能远
2023-03-14

您可以执行以下操作

@Inject // or @Autowired
public Person(@Value("DefaultName") String name, @Value("30") int age){
    this.name=name;
    this.age=age;
}

根据伯仲在这里的回答,Spring不喜欢构造函数注入。也许你不应该这样做。

对于你问题的评论,应该在

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

对于@Inject,您需要

<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>

但您可以使用Spring提供的@Autowired

 类似资料:
  • 问题内容: 我有几个需要用名称注释的类,因此我将注释定义为 现在,需要此注释的类定义为 我使用下面的代码来扫描注释 问题是返回的映射包含,但是我需要映射包含作为键,这是Annotation的值而不是bean名称。 有办法吗? 问题答案: 只需获取注释对象并提取值即可 让我知道是否不清楚。

  • 问题内容: 我正在尝试让扫描仪在循环中进行输入。一旦用户想要完成操作,他就可以退出此循环。我尝试了许多不同的方法来执行此操作,但始终存在一些问题。这是代码: 上面代码的问题(在我尝试的其他方法上也会发生)是,当用户键入 Y时 ,将跳过名字的第一个输入,并跳转到姓氏。如果用户键入 N, 则循环将正确停止。有人可以解释发生这种情况的原因,以及如何克服使用课堂的问题? ps:执行类似的操作,将导致循环终

  • 我正在尝试通过单行输入检索用户输入:例如,使用扫描仪分隔符为Comma5,6,4,8,9。如何使用这种类型的输入检索任意数量的整数?也就是说,不必询问用户希望输入多少个整数。下面是我一直在使用的代码,但是当我想中断时,不能中断while循环。请注意,我保留System.Out以跟踪程序当前运行的位置。令人困惑的是,我可以以这种格式获得用户输入,但程序停止并再次要求用户输入,然后如果输入是一个整数,

  • 我很难想出如何正确使用扫描仪来验证用户输入。例如,程序需要用户输入int,用户只能输入正数,如果用户输入“apple”、“delicious apple”或负数,问题将显示错误消息。我尝试了下面的代码,然后我发现了一个令人不安的问题,“那不是一个数字!”我不知道是什么引起了这些问题。。。。 我在“number=sc.nextInt()”下面加了一行代码,意外地解决了这个问题,现在我的代码变成: 这

  • 我开发了一个字符排序器,我想每次字符串排序后提示用户输入一个新的字符串。我遇到的问题是扫描仪一直在扫描用户的第一个输入。如果我使用scanner.next(),它不会计算输入末尾的空白,这不是解决方案。 这是while循环的开始。一旦代码完成,它将再次从“inputtext”开始。

  • 注入是将依赖注入对象的过程。 构造函数注入很常见。 在此过程中,依赖项作为参数注入构造函数。 请参阅下面的示例。 创建一个名为GuiceTester的java类。 GuiceTester.java import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Inj