使用new()

时间:2015-12-03 12:07:40

标签: java spring spring-mvc

我是Spring的新手。我在spring-config.xml中工作了这个:

<bean id="statusEmailSender" class="my.package.email.StatusEmailSenderImpl">
    <property name="mailSender" ref="mailSender"/>
    <property name="templateMessage" ref="templateMessage"/>
</bean>

在已定义的某些类中,我看到类似这样的内容:

@Autowired
private StatusEmailSender statusEmailSender;

它有效。当我在自己的班级中这样做时,我得到一个NullPointerException。 我知道原因:我用new()创建我的类:

return new EmailAction(config,logger);

我的班级看起来像这样:

public class EmailAction{
@Autowired
StatusEmailSender statusEmailSender;
public EmailAction(...)
{
...
}
}

你知道我怎么能解决这个问题吗?这是遗留代码,并且很难绕过新的EmailAction()调用。

2 个答案:

答案 0 :(得分:0)

为什么不在需要时自动填充您的EmailAction课程?

EmailAction.java:

@Component
public class EmailAction{
 // ...
}

WhereYouNeedIt.java:

public class WhereYouNeedIt{

@Autowired
EmailAction emailAction;


 // access emailAction here

}

答案 1 :(得分:0)

您希望在非spring类(遗留代码)中使用spring bean。为了做到这一点,你需要让Spring的ApplicationContext(其中包含{bean}所在的BeanFactory)可用于遗留代码。

为此你需要创建一个类似于:

的spring bean
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class SpringContext implements ApplicationContextAware {
  private static ApplicationContext context;

  public void setApplicationContext(ApplicationContext context) throws BeansException {
    this.context = context;
  }
  public static ApplicationContext getApplicationContext() {
    return context;
  }
}

并在Spring配置文件中定义此bean(或者如果您使用注释驱动,请使用@Component注释bean)

<bean id="springContext" class="com.util.SpringContext />

由于SpringContext公开了静态方法,遗留代码可以访问它。例如,如果遗留代码需要spring bean EmailAction,请调用如下:

EmailAction emailAction= (EmailAction)SpringContext.getApplicationContext.getBean(EmailAction.class);

现在emailAction将包含其所有依赖项。