当前位置: 首页 > 面试题库 >

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);

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

编辑: 根据Luiggi的评论:

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

SomeOtherClass或此类都不在上下文中被分类为bean或在上下文中没有任何存在。

我知道这是一个非常基本的问题,但我正在努力解决。

感谢您的耐心等待。


问题答案:

如注释中所述,问题在于您是在手动创建bean,而不是让Spring容器创建它。基本上,您正在执行以下操作:

new MyBeanOne()

因此,Spring容器无法注入您已配置的任何字段,因此就是null例如jdbcTemplatefield。有一些解决方案:

  1. 将您SomeOtherClass转换为由Spring容器管理的bean,并使其注入MyBeanOne实例(可能使用@Autowired注释)。

  2. 如果由于需要 手动 创建Bean 而无法采用后一种方法,则可以如下所示手动创建Bean:如何动态创建Spring Bean?

但是这种实现使您可以在spring config文件名的 某处 进行 硬编码 ,并在代码中使用它。因此,更好的方法是选择3。

  1. 看一下这个解决方案:创建新的按需Spring Bean,在其中创建一个客户端抽象类,该类具有Spring将实现的用于检索Spring托管bean的新实例的方法。

我发现了另一种通过使用@Configurable注释来处理此问题的方法。通过使用此批注装饰Bean,可以按需创建Bean的新实例,Spring将为您管理Spring托管Bean的注入。但是要实现这一点,Spring需要在幕后使用方面,而您应该为项目激活方面的使用。解释很长,因此我提供了深入解释此解决方案的链接:

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

请注意,为了启用此 功能 ,您必须在启动JVM时 添加Java代理该Java代理 将在运行时使用方面来编织类。



 类似资料:
  • 这可能是一个很新手的问题,但是我搜索过,要么是我的理解有很大的差距,要么是在做一些我想不通的错误的事情。 在我的上下文文件中,这里有一个节选 现在我在myBeanOne中: 当我试图在调用setDataSource的行上执行该命令时,我会得到以下错误: 行中: 我尝试了十种不同的配置来使其工作,但我似乎做不到。感谢任何协助,谢谢。 我知道这是一个非常基本的问题,但我正在与之斗争。 谢谢你的耐心。

  • 问题内容: 我能够使用RestTemplate并将其自动连线。但是我想将我与其余模板相关的代码部分移到另一个类中,如下所示: 在另一堂课上我称之为: 我是Spring和Dependency Injection术语的新手。我的变量为null并引发异常。我该怎么解决(我不知道它与我使用 关键字有关)吗? 问题答案: 使用不适用于依赖项注入。你没有被注入,因为wbin不是由Spring管理的。 你必须自

  • 我的项目使用MySQL、JavaFX、Spring Boot、Spring Data JP和Hibernate框架/技术。 这是我的POM文件。 这是我的。属性配置。 这是我的主课 这是stacktrace: 上下文初始化期间遇到异常-取消刷新尝试:org。springframework。豆。工厂UnsatifiedPendencyException:创建名为“org”的bean时出错。sprin

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

  • 问题内容: 我在结合JavaFX和Spring时遇到问题。我有一个简单的JavaFX应用程序,它运行良好。现在,我正在尝试向其中添加一些Spring。我在Spring教程中跟随JavaFX 2。我的代码: 是具有main的文件: : : 我的SpringFxmlLoader在教程中看起来与此类似: 我的SpringApplicationConfig: 在我的应用程序中,我具有绑定控制器: 当我运行

  • 主要内容:1. 引入依赖,2. 开启组件扫描,3. 使用注解定义 Bean,4. 基于注解方式实现依赖注入,示例从 Java 5 开始,Java 增加了对注解(Annotation)的支持,它是代码中的一种特殊标记,可以在编译、类加载和运行时被读取,执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下,在源代码中嵌入补充信息。 Spring 从 2.5 版本开始提供了对注解技术的全面支持,我们可以使用注解来实现自动装配,简化 Spring 的 XML 配置。 Spring 通过注解