【问题标题】:Autowiring email sender bean into another bean?将电子邮件发件人 bean 自动装配到另一个 bean 中?
【发布时间】:2013-10-18 14:52:24
【问题描述】:

我正在使用 spring 3.x 版本并使用注释来连接依赖项。我有两个豆子如下。

package com.sample.project.service;
@Component
public class MyAppender extends AppenderSkeleton{


     //here trying to inject emailSender bean
    @Autowired
    private EmailSender emailSender;

//some code with emailSender
//emailSender.callSomeService...


}

上面的 bean 扩展了 log4j 的 AppenderSkeleton 类。

package com.sample.project.service;
@Component
public class EmailSender {

  @Autowired
  private SomeOtherBean someOther;

//somecode

}

我在 applicationContext.xml 中有一个条目,如下所示。

<context:component-scan base-package="com.sample.project.service" />

Log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">

    <!-- Appenders -->

    <appender name="stdout" class="com.sample.project.service.MyAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %p [%c] - %m%n"/>
        </layout>
    </appender>


    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
        <param name="BufferSize" value="500"/>
        <appender-ref ref="stdout"/>
    </appender>

    <root>
        <level value="INFO" />
        <appender-ref ref="ASYNC" />
    </root>

</log4j:configuration>

但问题是,注入MyAppenderemailSender 始终是null。 我在这里做错什么了吗。或者覆盖 log4jspecific 类并用 @Component 注释它们有什么问题吗?谢谢!请帮帮我!

【问题讨论】:

  • 除非您自己创建 MyAppender 对象,否则它不可能是 null
  • 没有。我没有创建 MyAppender 对象。它已经用@Component注解了。
  • 告诉我们你在哪里以及如何注射它。
  • MyAppender 已经用@Component 进行了注解。
  • 好的,所以它在您的上下文中作为 bean 存在。你是怎么用的?

标签: java spring dependency-injection java-ee-6


【解决方案1】:

有了这个配置

<appender name="stdout" class="com.sample.project.service.MyAppender">
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %p [%c] - %m%n"/>
    </layout>
</appender>

log4j 正在创建自己的 MyAppender 实例。此实例与 Spring 创建的 @Component 实例无关。因此,没有进行自动装配,并且您的字段默认初始化为 null

【讨论】:

  • 请在这里给我建议任何替代方案。不知何故我需要 MyAppender 中的 emailSender 实例。谢谢!
  • @user755806 没有简单的替代方案。 log4j 使用 static 初始化器设置自己。春天在此之后运行。您可以通过指定root 记录器来执行like what is described here 的操作。在完成之前,log4j 将使用您的配置文件中的内容。
  • @user755806 ApplicationContextAware 只会让它知道 Springs ApplicationContext 它正在创建它。它仍然与 log4j 无关。你有点不走运。 Try this while you are at it.
  • @Stirios,非常感谢。我将按照上述方法进行尝试。同时,如果您有时间,请提出一些想法。谢谢!
  • @user755806 Found this too. 这些是你唯一真正的选择:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多