我是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()调用。
答案 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 beanimport 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
将包含其所有依赖项。