在弹簧容器内使用速度分量的最佳方法是什么。
在我的velocity util(emailer)类中,我已经声明了将电子邮件发送为STATIC的方法,以避免每次都创建电子邮件对象。我也宣布将二传手注射为静态。
这是正确的方法吗?
爪哇:
Class emailer{
public static Boolean sendEmail(){
SimpleMailMessage msg = new SimpleMailMessage();
String val = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, template, model);
msg.setText(val);
mailSender.send(msg);
}
private static MailSender mailSender;
@Autowired
public static void setMailSender(MailSender mailsender) {
LOGGER.debug("MailSender set successfully");
mailSender = mailsender;
}
private static VelocityEngine velocityEngine;
@Autowired
public static void setVelocityEngine(VelocityEngine velocityengine) {
LOGGER.debug("Velocity Engine set successfully");
velocityEngine = velocityengine;
}
}
xml更改: 本地主机
<bean id="emailHelper" class="emailer">
<property name="mailSender" ref="mailSender"/>
<property name="velocityEngine" ref="velocityEngine"/>
<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="velocityProperties">
<props>
<prop key="resource.loader">class</prop>
<prop key="class.resource.loader.class">
org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
</prop>
</props>
</property>
</bean>
答案 0 :(得分:0)
这里不应该使用静态方法。 Spring无法自动装配静态方法(参见Can you use @Autowired with static fields?)
但即使您可以自动装配静态方法,也不会比使用实例方法更好。这是因为Spring默认将bean创建为单例,这意味着它只创建一个实例,并且每个@Autowired
属性使用相同的实例。因此,每次不创建电子邮件对象或mailsender对象的新实例时,它将继续使用相同的实例。
Spring documentation更详细地解释了它。
您应该只使用实例属性和变量来使其工作 - 换句话说,只需从每个属性中删除单词static
。