【问题标题】:Spring declare component in xmlSpring在xml中声明组件
【发布时间】:2014-12-29 23:17:32
【问题描述】:

我在我的项目中主要使用@Autowired@Component 注释。但是,我将使用DataSource 类进行数据库操作。

所以,我在 dispatcher-servlet.xml 中使用它:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/market"/>
    <property name="username" value="root"/>
    <property name="password" value=""/>
</bean>

在我的 dao 类中,dataSource 的设置器是:

@Autowired
private DataSource dataSource;

public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
    this.jdbcTemplateObject = new JdbcTemplate(dataSource);

}

但是,这并不能解决问题。我的jdbcTemplateObjectnull

如果我不使用“context:component scan ...”,而是使用经典的 spring bean,而不使用 @Autowired 注释,那么一切正常。

我可以使用我的数据库。但是,我不想在我的 xml 文件中一一声明所有 bean。随着项目的发展,它将不实用。我怎么解决这个问题 ?是否可以在我的dispatcher-servlet.xml 中将dataSource 声明为组件,所以@Autowired 适用于数据源?

【问题讨论】:

  • 当你在字段上使用@Autowired 时,Spring 会查找依赖项并直接注入它们,如果设置方法在这里没有意义。
  • Spring 会做到这一点,您不需要二传手。您可以在 xml 中使用 jdbctemplate 并自动装配它。
  • 非常感谢。我不知道我不需要二传手。没有 setter 怎么设置呢?
  • 输入它作为答案,以便我将其标记为正确。

标签: java mysql xml spring-mvc datasource


【解决方案1】:

当您在字段Spring 上使用@Autowired 时,将寻找dependencies 并立即注入它们,如果设置方法在这里没有意义。

您无需担心 spring 将如何注入依赖项。它将负责完整的生命周期。

有关Spring's Dependecy Injection 的更多信息,请访问this 链接。

【讨论】:

    【解决方案2】:

    您已使用 @Autowired 注释该字段,这告诉 spring 将依赖项直接注入该字段。如果您真的想使用 setter,请使用 @Autowired 而不是字段来注释 setter。

    @Autowired
    public void setDataSource(DataSource ds) { ... }
    

    但是,我强烈建议不要为每个需要一个 JdbcTemplate 的 bean 创建一个(创建起来非常繁重)。 JdbcTemplate 是一个线程安全的对象,一旦被构造。因此,不要为每个需要的 bean 创建一个新的(在 setDataSource 方法中),只需创建一个 JdbcTemplate 并注入它。

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>
    

    然后在你的道中。

    @Autowired
    private JdbcTemplate jdbcTemplate;
    

    或者我喜欢做什么..

    private final JdbcTemplate jdbcTemplate;
    
    @Autowired
    public YourRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate=jdbcTemplate;
    }
    

    这样你就不能构造一个非法对象,而使用基于 setter 的注入你可以。同时保持注入一个用于测试目的的可能性。

    另一个注意事项,DriverManagerDataSource 非常适合测试,但不适用于生产用途,因为它使用真正的连接池,例如 HikariCPTomcat JDBC

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-27
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2020-10-24
      • 1970-01-01
      相关资源
      最近更新 更多