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

Spring注入或自动将数据源bean导入类

仲孙诚
2023-03-14

这可能是一个很新手的问题,但是我搜索过,要么是我的理解有很大的差距,要么是在做一些我想不通的错误的事情。

在我的上下文文件中,这里有一个节选

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${datasource.driverClassName}" />
    <property name="url" value="${datasource.url}" />
    <property name="username" value="${datasource.username}" />
    <property name="password" value="${datasource.password}" />
</bean>

<bean id="myBeanOne" class="a.b.c.myBeanOne">
         <property name="dataSource" ref="dataSource" />
</bean>

现在我在myBeanOne中:

private DataSource dataSource;

private JdbcTemplate jdbcTemplate;

@Autowired
public void setDataSource (DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
}

public void myMethod() {
    String sql = "'My generic SQL update query'";
    try {
        this.jdbcTemplate.update(sql);
    } catch (org.springframework.dao.EmptyResultDataAccessException ex) {
    }
    System.exit(0);
}

当我试图在调用setDataSource的行上执行该命令时,我会得到以下错误:

ERROR org.springframework.integration.handler.LoggingHandler 
    org.springframework.integration.MessageHandlingException: 
       java.lang.NullPointerException

行中:this.jdbctemplate.update(sql);

我尝试了十种不同的配置来使其工作,但我似乎做不到。感谢任何协助,谢谢。

//in yet another classes run method
myBeanOne bOne = SomeOtherClass.create();   //just returns new myBeanOne
bOne.myMethod();

我知道这是一个非常基本的问题,但我正在与之斗争。

谢谢你的耐心。

共有1个答案

白宏大
2023-03-14

正如注释中所指出的,问题是您手动创建bean,而不是让Spring容器创建它。基本上,你是这样做的:

new MyBeanOne()

因此Spring容器不能注入您配置的任何字段,因此是null,例如jdbctemplate字段。对此有一些解决方法:

>

  • 将您的SomeOtherClass转换为Spring容器管理的bean,并让它注入MyBeanOne实例(可能使用@AutoWired注释)。

    如果后一种方法由于需要手动创建bean而无法完成,则可以手动创建bean,如下所示:如何动态创建spring bean?

    但是这个实现使您在某个地方硬编码spring配置文件名并在代码中使用它。因此,更好的办法是备选案文3。

    看看这个解决方案:按需创建新的Spring bean,在这里您创建了一个客户端抽象类,其中使用一个Spring将实现的方法来检索您的Spring托管bean的新实例。

    我找到了另一种方法,通过使用@configurable注释来处理这个问题。通过使用这个注释装饰bean,您可以按需创建bean的新实例,并且Spring将为您管理Spring托管bean的注入。但是要实现这一点,Spring需要在后台使用方面,您应该为您的项目激活方面的用法。解释相当长,因此我提供了深入解释此解决方案的链接:

    • Spring Framework:7.8将AspectJ与Spring应用程序一起使用
    • 通过三个简单步骤使用Spring的@Configurable

    请注意,为了启用这个特性,您必须在启动JVM时添加一个java代理,该JVM将在运行时使用方面编织类。

  •  类似资料:
    • 问题内容: 这可能是一个非常新手的问题,但是我进行了搜索,发现我的理解上有很大的差距,或者做错了一些我无法弄清楚的事情。 在我的上下文文件中,这是摘录 现在在myBeanOne中,我有: 当我尝试在调用setDataSource的行上执行此操作时,出现以下错误: 在线上: 我尝试了十种不同的配置来使其正常工作,但我似乎无法做到。感谢您的任何帮助,谢谢。 编辑: 根据Luiggi的评论: SomeO

    • 在我的Spring项目中,我通常使用以下三个文件下的xml配置: 我已经将此bean用于在同一个applicationContext-db.xml文件中定义的Sessionfactory bean。 PS:当我删除扩展类时,我的数据源已定义,但我需要这个类来设置Spring Security ACL配置。

    • 问题内容: 是否可以将Spring bean注入RestEasy @Path类中?我设法通过Jersey并使用@InjectParam注释完成了此操作,但是由于某些其他原因,我需要切换到RestEasy,而且我似乎找不到解决方法(尝试了javax.inject.Inject,但没有)。 编辑 此解决方案有效:http : //www.mkyong.com/webservices/jax-rs/re

    • 问题内容: 我试图将EJB注入到Spring(3.1.2)服务中(都在不同的 WAR中)两者都非常简单(删除了方法以简化示例): EJB: Service: 事情很简单,但我尝试过: 它没有用。然后我还尝试了: and 但都没有奏效。 我设法使用以下方法注入了EJB: 在我的spring配置和服务中: 但我真的不喜欢这种解决方案。我希望在某些注释中包含我的JNDI路径,例如: 问题答案: 我们找到

    • 我正在开发一个遗留的JSF应用程序,我们正在慢慢地将其移植到Spring MVC。我们正在使用Spring Security来控制登录信息。在用户登录之后,JSF页面全局地实例化一个在任何地方都使用的会话作用域bean。我想更改应用程序,这样我们就可以先进入用Spring MVC开发的页面。 我尝试的一种方法是将bean转换为spring bean,并将其注入JSF,但不幸的是,这需要对bean进

    • 问题内容: 我想将Mockito模拟对象注入到Spring(3+)bean中,以进行JUnit的单元测试。我的bean依赖项当前是通过在私有成员字段上使用注释来注入的。 我考虑过使用,但是我希望注入的bean实例实际上是一个代理,因此没有声明目标类的私有成员字段。我不希望为依赖项创建一个公共的setter,因为我将纯粹出于测试目的而修改接口。 我遵循了Spring社区提供的一些建议,但是未创建该模