?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
假設(shè)某個(gè)業(yè)務(wù)接口名為OrderManager
:
public interface OrderManager { void placeOrder(Order order); }
我們同時(shí)假設(shè)有一個(gè)用例:需要生成帶有訂單號(hào)的email信件, 并向客戶發(fā)送該訂單。
import org.springframework.mail.MailException; import org.springframework.mail.MailSender; import org.springframework.mail.SimpleMailMessage; public class SimpleOrderManager implements OrderManager { private MailSender mailSender; private SimpleMailMessage templateMessage; public void setMailSender(MailSender mailSender) { this.mailSender = mailSender; } public void setTemplateMessage(SimpleMailMessage templateMessage) { this.templateMessage = templateMessage; } public void placeOrder(Order order) { // Do the business calculations... // Call the collaborators to persist the order... // Create a thread safe "copy" of the template message and customize it SimpleMailMessage msg = new SimpleMailMessage(this.templateMessage); msg.setTo(order.getCustomer().getEmailAddress()); msg.setText( "Dear " + order.getCustomer().getFirstName() + order.getCustomer().getLastName() + ", thank you for placing order. Your order number is " + order.getOrderNumber()); try{ this.mailSender.send(msg); } catch(MailException ex) { // simply log it and go on... System.err.println(ex.getMessage()); } } }
上面的代碼的bean定義應(yīng)該是這樣的:
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="mail.mycompany.com"/>
</bean>
<!-- this is a template message that we can pre-load with default state -->
<bean id="templateMessage" class="org.springframework.mail.SimpleMailMessage">
<property name="from" value="customerservice@mycompany.com"/>
<property name="subject" value="Your order"/>
</bean>
<bean id="orderManager" class="com.mycompany.businessapp.support.SimpleOrderManager">
<property name="mailSender" ref="mailSender"/>
<property name="templateMessage" ref="templateMessage"/>
</bean>
下面是OrderManager
的另一種實(shí)現(xiàn), 使用了MimeMessagePreparator
回調(diào)接口。
請(qǐng)注意在這個(gè)用例中,mailSender
屬性是JavaMailSender
類型, 所以我們可以使用JavaMail的MimeMessage
類:
import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMessage; import org.springframework.mail.MailException; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessagePreparator; public class SimpleOrderManager implements OrderManager { private JavaMailSender mailSender; public void setMailSender(JavaMailSender mailSender) { this.mailSender = mailSender; } public void placeOrder(final Order order) { // Do the business calculations... // Call the collaborators to persist the order... MimeMessagePreparator preparator = new MimeMessagePreparator() { public void prepare(MimeMessage mimeMessage) throws Exception { mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(order.getCustomer().getEmailAddress())); mimeMessage.setFrom(new InternetAddress("mail@mycompany.com")); mimeMessage.setText( "Dear " + order.getCustomer().getFirstName() + " " + order.getCustomer().getLastName() + ", thank you for placing order. Your order number is " + order.getOrderNumber()); } }; try { this.mailSender.send(preparator); } catch (MailException ex) { // simply log it and go on... System.err.println(ex.getMessage()); } } }
以上的郵件代碼是一個(gè)橫切關(guān)注點(diǎn),能被完美地重構(gòu)為自定義Spring AOP切面的候選者,這樣它就可以在目標(biāo)對(duì)象OrderManager
的一些合適的連接點(diǎn)(joinpoint)中被執(zhí)行了。
Spring Framework的郵件支持直接提供兩種MailSender
的實(shí)現(xiàn)。標(biāo)準(zhǔn)的JavaMail實(shí)現(xiàn)和基于Jason Hunter編寫的MailMessage
類之上的實(shí)現(xiàn),后者位于
com.oreilly.servlet
包中。請(qǐng)查閱相關(guān)Javadocs以獲得進(jìn)一步的資料。