﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Duffblog-文章分类-开源技术</title><link>http://www.blogjava.net/Duffblog/category/16322.html</link><description>前进一步，看看，需要前进更大一步才可以。</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 05:59:01 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 05:59:01 GMT</pubDate><ttl>60</ttl><item><title>结合Spring2.0和ActiveMQ进行异步消息调用(转)</title><link>http://www.blogjava.net/Duffblog/articles/90595.html</link><dc:creator>追球者</dc:creator><author>追球者</author><pubDate>Thu, 28 Dec 2006 14:12:00 GMT</pubDate><guid>http://www.blogjava.net/Duffblog/articles/90595.html</guid><wfw:comment>http://www.blogjava.net/Duffblog/comments/90595.html</wfw:comment><comments>http://www.blogjava.net/Duffblog/articles/90595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Duffblog/comments/commentRss/90595.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Duffblog/services/trackbacks/90595.html</trackback:ping><description><![CDATA[
		<span class="content"> 在Spring 2.0之前，Spring的JMS的作用局限于产生消息。这个功能（封装在 <tt class="classname">JmsTemplate</tt> 类中）当然是很好的， 但是，它没有描述完整的JMS堆栈，比如像消息的 <span class="emphasis"><em>异步</em></span> 产生和消耗。JMS堆栈缺少的这一部分已经被添加，Spring 2.0现在提供对消息异步消耗的完整支持。<br />      让我们从一个例子开始。<br />      首先我们打开ActiveMQ。从ActiveMQ的安装路径上的bin目录，那里有一个ActiveMQ.bat，双击执行即可。不过要注意必须先设置java_home环境变量。ActiveMQ默认的服务端口是61616。<br />      然后我们开始配置Spring配置文件。我起名为spring-jms.xml<br /><ol><li>首先要配置一个ConnectionFactory代码如下</li></ol><p> &lt;bean id="connectionFactory"<br />        class="org.apache.activemq.ActiveMQConnectionFactory"&gt;<br />        &lt;property name="brokerURL" value="tcp://localhost:61616" /&gt;<br />&lt;/bean&gt;<br /><span class="content"></span></p><li>这里用到的ConnectionFactory是ActiveMQ提供的工厂，为了能使用这个工厂，我们必须在项目中添加以下几个jar文件：<br />geronimo-jms_1.1_spec-1.0.jar,<br />activeio-core-3.0-beta3.jar,<br />activemq-core-4.0.1.jar,<br />backport-util-concurrent-2.1.jar,<br />commons-logging-1.0.4.jar,<br />geronimo-j2ee-management_1.0_spec-1.0.jar<br />以上这些Jar文件都存在于ActiveMQ安装目录的lib目录下，这些可是我一个一个试验出来的，累个半死。。<br /><br /></li><li>然后应该配置一个Queue（我使用的是点对点方式），不过ActiveMQ只要提供一个名字就可以自动创建队列，因此这一步省了，呵呵<br /></li><li>下面就轮到Spring的支持类了，首先是JmsTemplate。这个类提供了大量的方法简化我们对JMS的操作。常用的有两个， org.springframework.jms.core.JmsTemplate102和 org.springframework.jms.core.JmsTemplate，这两个类分别支持JMS的1.02版本和1.1版本。现在比较常用的还是1.02版本。配置如下
<p>&lt;bean id="jmsTemplate"<br />        class="org.springframework.jms.core.JmsTemplate102"&gt;<br />        &lt;property name="connectionFactory" ref="connectionFactory"/&gt;<br />        &lt;property name="timeToLive" value="86400000"/&gt;<br />        &lt;property name="defaultDestinationName" value="cmpp" /&gt;<br />        &lt;property name="messageConverter" ref="messageConverter" /&gt;<br />        &lt;property name="receiveTimeout" value="30000" /&gt;<br />    &lt;/bean&gt;<br /><span class="content">上面的配置中用到了第一步配置的connectionFactory以及一个消息转换的类 messageConverter，这个类实现了 org.springframework.jms.support.converter.MessageConverter接口，可以在消息发送之前和接受之后进行消息类型转换。具体的看最后的实例代码。配置代码如下：<br /> &lt;!-- Spring JMS SimpleConverter --&gt;<br />       &lt;bean id="simpleConverter"  class="org.springframework.jms.support.converter.SimpleMessageConverter" /&gt;<br />&lt;!-- Message Converter --&gt;<br />    &lt;bean id="messageConverter"<br />        class="com.liangj.apmgt.jms.ApmgtMessageConverter"&gt;<br />        &lt;property name="converter"&gt;<br />            &lt;ref local="simpleConverter" /&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;<br /><span class="content"></span></span></p></li><li>这里还配置了发送的消息的存在时间timeToLive，目标Queue的名字defaultDestinationName，接受消息超时时间receiveTimeout<br /><p>4。配置发送代码<br />    &lt;bean id="producer"<br />        class="com.liangj.apmgt.jms.DefaultApmgtMessageProducer"&gt;<br />        &lt;property name="jmsTemplate" ref="jmsTemplate" /&gt;<br />    &lt;/bean&gt;<br /><span class="content">5。接着配置监听器，这是Spring2.0新增的功能，配置如下：<br />&lt;!-- this is the Message Driven POJO (MDP) --&gt;<br />    &lt;bean id="messageListener"<br />        class="org.springframework.jms.listener.adapter.MessageListenerAdapter"&gt;<br />        &lt;constructor-arg&gt;<br />            &lt;bean<br />                class="com.liangj.apmgt.jms.DefaultApmgtMessageListener" /&gt;<br />        &lt;/constructor-arg&gt;<br />        &lt;property name="defaultListenerMethod" value="onMessage" /&gt;<br />        &lt;property name="messageConverter" ref="messageConverter" /&gt;<br />    &lt;/bean&gt;</span></p><p><span class="content">    &lt;!-- and this is the attendant message listener container --&gt;<br />    &lt;bean id="listenerContainer"<br />        class="org.springframework.jms.listener.DefaultMessageListenerContainer"&gt;<br />        &lt;property name="connectionFactory" ref="connectionFactory" /&gt;<br />        &lt;property name="destinationName" value="${jms.destinationName.cmpp}" /&gt;<br />        &lt;property name="messageSelector" value="${jms.messageSelector}" /&gt;<br />        &lt;property name="messageListener" ref="messageListener" /&gt;<br />    &lt;/bean&gt;</span></p><p><span class="content"><span class="content"> Spring配置监听器有很多种选择，在这里我选择这回种MessageListenerAdapter方法主要是因为这个方法比较灵活。实现他只要一个很普通的java类即可，和JMS以及Spring的耦合度最低。其中方法onMessage可以随便修改方法名，只要在配置文件中对应的修改就好了。<br />     <tt class="classname">MessageListenerAdapter</tt>还有一个功能就是如果处理方法(我这里是onMessage)返回一个非空值，它将自动返回一个响应<tt class="interfacename">消息</tt>。这个消息会返回给JMS Reply-To属性定义的<tt class="interfacename">目的地</tt>(如果存在)，或者是<tt class="classname">MessageListenerAdapter</tt>设置(如果配置了)的缺省<tt class="interfacename">目的地</tt>；如果没有定义<tt class="interfacename">目的地</tt>，那么将产生一个<tt class="classname">InvalidDestinationException</tt>异常(此异常将不会只被捕获而不处理，它<span class="emphasis"><em>将</em></span>沿着调用堆栈上传)。<br />     这样我们的配置就都完成了。接下来我们来实现对应的Java文件<br />先是接口文件发送消息接口IApmgtMessageProducer.java<br />public interface IApmgtMessageProducer {<br />    public abstract void sendMessage(ApmgtMessageData messageData);<br />}<br /><span class="content">接受消息接口IApmgtMessageListener.java<br />public interface IApmgtMessageListener {<br />    public void onMessage(ApmgtMessageData message);<br />}<br /><span class="content">发消息的文件DefaultApmgtMessageProducer.java<br /> public class DefaultApmgtMessageProducer implements IApmgtMessageProducer {<br />    <br />    private JmsTemplate jmsTemplate;</span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content">    public void setJmsTemplate(JmsTemplate jmsTemplate) {<br />        this.jmsTemplate = jmsTemplate;<br />    }</span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content">    public void sendMessage(ApmgtMessageData messageData) {<br />        this.jmsTemplate.convertAndSend(messageData);<br />    }<br />}<br /><span class="content">收消息文件DefaultApmgtMessageListener.java<br />public class DefaultApmgtMessageListener implements IApmgtMessageListener {<br />    public void onMessage(ApmgtMessageData message) {<br />        System.out.println("监听到消息："+message);<br />    }<br />}<br /><span class="content">消息转换类ApmgtMessageConverter.java<br /></span>public class ApmgtMessageConverter implements MessageConverter {</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    private Log log = LogFactory.getLog(ApmgtMessageConverter.class);</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    private SimpleMessageConverter converter;</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public void setConverter(SimpleMessageConverter converter) {<br />        this.converter = converter;<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public Object fromMessage(Message message) throws JMSException, MessageConversionException {<br />        if (message instanceof ObjectMessage) {<br />            ObjectMessage o_message = (ObjectMessage)message;<br />            MessageHeader header = new MessageHeader();<br />            header.setId(message.getLongProperty("id"));<br />            header.setReceiver(message.getIntProperty("receiver"));<br />            header.setSender(message.getIntProperty("sender"));<br />            header.setSendPerson(message.getStringProperty("sendPerson"));<br />            header.setType(message.getIntProperty("type"));<br />            Serializable messageContent = o_message.getObject();<br />            ApmgtMessageData&lt;Serializable&gt; messageData = new ApmgtMessageData&lt;Serializable&gt;();<br />            messageData.setMessageContent(messageContent);<br />            messageData.setMessageHeader(header);<br />            return messageData;<br />        }<br />        return null;<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {<br />        if (object instanceof ApmgtMessageData) {<br />            ApmgtMessageData data = (ApmgtMessageData) object;<br />            Message message = converter.toMessage(data.getMessageContent(), session);<br />            message.setLongProperty("id", data.getMessageHeader().getId());<br />            message.setIntProperty("receiver", data.getMessageHeader().getReceiver());<br />            message.setIntProperty("sender", data.getMessageHeader().getSender());<br />            message.setIntProperty("type", data.getMessageHeader().getType());<br />            message.setStringProperty("sendPerson", data.getMessageHeader().getSendPerson());<br />            log.info("发送消息[MessageSender]:\n" + message);<br />             return message;<br />        } else {<br />            return null;<br />        }<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">}<br /><span class="content">消息类文件  消息父类：ApmgtMessageData.java<br /></span>public class ApmgtMessageData&lt;T extends Serializable&gt;{</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    protected T messageContent;<br />    <br />    protected MessageHeader messageHeader;</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public T getMessageContent() {<br />        return this.messageContent;<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public MessageHeader getMessageHeader() {<br />        return this.messageHeader;<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public void setMessageContent(T messageContent) {<br />        this.messageContent = messageContent;<br />    }<br />    public void setMessageHeader(MessageHeader messageHeader) {<br />        this.messageHeader = messageHeader;<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">}<br /><span class="content">消息属性的一个类MessageHeader.java</span><br />public class MessageHeader {</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    /**<br />     * 消息ID<br />     */<br />    private long id;</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    /**<br />     * 消息类型<br />     */<br />    private int type;</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    /**<br />     * 消息发送方，发送消息的模块<br />     */<br />    private int sender;</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    /**<br />     * 消息接收方，接收消息的模块<br />     */<br />    private int receiver;</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    /**<br />     * 消息发送者，具体的用户<br />     */<br />    private String sendPerson;</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public MessageHeader(){<br />        this.id = System.currentTimeMillis() ;<br />    }<br />    <br />    public long getId() {<br />        return id;<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public void setId(long id) {<br />        this.id = id;<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public String getSendPerson() {<br />        return sendPerson;<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public void setSendPerson(String sendPerson) {<br />        this.sendPerson = sendPerson;<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public int getReceiver() {<br />        return receiver;<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public void setReceiver(int receiver) {<br />        this.receiver = receiver;<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public int getSender() {<br />        return sender;<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public void setSender(int sender) {<br />        this.sender = sender;<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public int getType() {<br />        return type;<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">    public void setType(int type) {<br />        this.type = type;<br />    }</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">}</span></span></span></span></span></p><p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content"><span class="content">消息体的类ModPasswordRequest.java<br />public class ModPasswordRequest implements Serializable{</span></span></span></span></span></span></p><span class="content"><span class="content"><span class="content"><span class="content"><span class="content"><span class="content"><p><br />    private static final long serialVersionUID = 1L;</p><p>    /**<br />     * 旧密码<br />     */<br />    private String oldPassword;<br />    <br />    /**<br />     * 新密码<br />     */<br />    private String newPassword;</p><p>    public String getNewPassword() {<br />        return newPassword;<br />    }</p><p>    public void setNewPassword(String newPassword) {<br />        this.newPassword = newPassword;<br />    }</p><p>    public String getOldPassword() {<br />        return oldPassword;<br />    }</p><p>    public void setOldPassword(String oldPassword) {<br />        this.oldPassword = oldPassword;<br />    }</p><p>}</p><p><span class="content">消息类：ApmgtModPasswordRequest.java<br />public class ApmgtModPasswordRequest extends ApmgtMessageData&lt;ModPasswordRequest&gt; {<br />    <br />    <br />    <br />    private static final int REQ_MODPASSWORD = 0;<br />    private static final int INTF = 1;<br />    private static final int APMGT = 2;</span></p><p><span class="content">    public void init(){<br />        messageHeader = new MessageHeader();<br />        messageContent = new ModPasswordRequest();<br />        messageHeader.setType(REQ_MODPASSWORD);<br />        messageHeader.setSender(INTF);<br />        messageHeader.setReceiver(APMGT);<br />        messageContent.setNewPassword("123456");<br />        messageContent.setOldPassword("654321");<br />    }<br />   <br />}<br />最后是测试类Main.java<br /></span></p><p><span class="content">    public class Main {</span></p><p><span class="content">    public static void main(final String[] args) throws Exception {<br />        <br />        PropertyConfigurator.configure("log4j.properties");<br />        <br />        AbstractApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] { "spring-jms.xml" });<br />//        ctx.registerShutdownHook();<br />        <br />        IApmgtMessageProducer producer = (IApmgtMessageProducer)ctx.getBean("producer");<br />        <br />        ApmgtModPasswordRequest messageData = new ApmgtModPasswordRequest();<br />        messageData.setMessageHeader(new MessageHeader());<br />        messageData.setMessageContent(new ModPasswordRequest());<br />        messageData.init();<br />        <br />        producer.sendMessage(messageData);<br />    }<br />}<br /><span class="content">还有两个配置文件，第一个spring-jms.xml<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;beans xmlns="[url]http://www.springframework.org/schema/beans"[/url]<br />    xmlns:xsi="[url]http://www.w3.org/2001/XMLSchema-instance"[/url]<br />    xsi:schemaLocation="[url]http://www.springframework.org/schema/beans[/url] [url]http://www.springframework.org/schema/beans/spring-beans.xsd"&gt;[/url]</span></span></p><span class="content"><span class="content"><p><br />    &lt;bean id="propertyConfigurer"<br />        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;<br />        &lt;property name="locations"&gt;<br />            &lt;list&gt;<br />                &lt;value&gt;apmgt.properties&lt;/value&gt;<br />            &lt;/list&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;</p><p>    &lt;!-- ####################################### --&gt;<br />    &lt;!--          JMS Spring Beans               --&gt;<br />    &lt;!-- ####################################### --&gt;</p><p>    &lt;!-- Jms ConnectionFactory --&gt;<br />    &lt;bean id="connectionFactory"<br />        class="org.apache.activemq.ActiveMQConnectionFactory"&gt;<br />        &lt;property name="brokerURL" value="${jms.brokerURL}" /&gt;<br />    &lt;/bean&gt;</p><p>    &lt;!-- Spring JMS SimpleConverter --&gt;<br />    &lt;bean id="simpleConverter"<br />        class="org.springframework.jms.support.converter.SimpleMessageConverter" /&gt;</p><p>    &lt;!-- JMS Queue Template --&gt;<br />    &lt;bean id="jmsTemplate"<br />        class="org.springframework.jms.core.JmsTemplate102"&gt;<br />        &lt;property name="connectionFactory" ref="connectionFactory"/&gt;<br />        &lt;property name="timeToLive" value="${jms.timeToLive}"/&gt;<br />        &lt;property name="defaultDestinationName" value="${jms.destinationName.cmpp}" /&gt;<br />        &lt;property name="messageConverter" ref="messageConverter" /&gt;<br />        &lt;property name="receiveTimeout" value="${jms.receiveTimeout}" /&gt;<br />    &lt;/bean&gt;</p><p>    &lt;!-- Message Converter --&gt;<br />    &lt;bean id="messageConverter"<br />        class="com.liangj.apmgt.jms.ApmgtMessageConverter"&gt;<br />        &lt;property name="converter"&gt;<br />            &lt;ref local="simpleConverter" /&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;</p><p>    &lt;!-- Message porducer --&gt;<br />    &lt;bean id="producer"<br />        class="com.liangj.apmgt.jms.DefaultApmgtMessageProducer"&gt;<br />        &lt;property name="jmsTemplate" ref="jmsTemplate" /&gt;<br />    &lt;/bean&gt;</p><p>    &lt;!-- this is the Message Driven POJO (MDP) --&gt;<br />    &lt;bean id="messageListener"<br />        class="org.springframework.jms.listener.adapter.MessageListenerAdapter"&gt;<br />        &lt;constructor-arg&gt;<br />            &lt;bean<br />                class="com.liangj.apmgt.jms.DefaultApmgtMessageListener" /&gt;<br />        &lt;/constructor-arg&gt;<br />        &lt;property name="defaultListenerMethod" value="onMessage" /&gt;<br />        &lt;property name="messageConverter" ref="messageConverter" /&gt;<br />    &lt;/bean&gt;</p><p>    &lt;!-- and this is the attendant message listener container --&gt;<br />    &lt;bean id="listenerContainer"<br />        class="org.springframework.jms.listener.DefaultMessageListenerContainer"&gt;<br />        &lt;property name="connectionFactory" ref="connectionFactory" /&gt;<br />        &lt;property name="destinationName" value="${jms.destinationName.cmpp}" /&gt;<br />        &lt;property name="messageSelector" value="${jms.messageSelector}" /&gt;<br />        &lt;property name="messageListener" ref="messageListener" /&gt;<br />    &lt;/bean&gt;<br />&lt;/beans&gt;</p><p><span class="content">apmgt.properties</span></p></span></span><p><span class="content">#jms properties<br />jms.brokerURL=tcp://localhost:61616<br />jms.receiveTimeout=3000<br />jms.destinationName.cmpp=cmpp<br />jms.messageSelector=receiver=2<br />#one day is 86400000 ms. 0 is means that it lives forever.<br />jms.timeToLive=86400000<br /><br />转：<a href="http://blog.iecn.net/blog/html/do-showone-tid-1035.html">http://blog.iecn.net/blog/html/do-showone-tid-1035.html</a></span></p></span></span></span></span></span></span></li></span>
<img src ="http://www.blogjava.net/Duffblog/aggbug/90595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Duffblog/" target="_blank">追球者</a> 2006-12-28 22:12 <a href="http://www.blogjava.net/Duffblog/articles/90595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Ioc以及DI。</title><link>http://www.blogjava.net/Duffblog/articles/75446.html</link><dc:creator>追球者</dc:creator><author>追球者</author><pubDate>Mon, 16 Oct 2006 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/Duffblog/articles/75446.html</guid><wfw:comment>http://www.blogjava.net/Duffblog/comments/75446.html</wfw:comment><comments>http://www.blogjava.net/Duffblog/articles/75446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Duffblog/comments/commentRss/75446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Duffblog/services/trackbacks/75446.html</trackback:ping><description><![CDATA[Ioc：Inversion Of Control。即控制反转。<br />IoC模式基本上是一個高層的概念，在Martin Fowler的Inversion of Control Containers and the Dependency Injection pattern中談到，實現IoC有兩種方式：Dependency Injection與Service Locator。<br />您可以在下面的網址中找到該篇文章：<br /><span class="nobr"><a title="Visit page outside Confluence" href="http://www.martinfowler.com/articles/injection.html" rel="nofollow">http://www.martinfowler.com/articles/injection.html</a>（这个要好好看看。）<br />Spring所採用的是Dependency Injection來實現IoC，中文翻譯為依賴注入，依賴注入的意義是：「保留抽象介面，讓組件依賴於抽象介面，當組件要與其它實際的物件發生依賴關係時，藉過抽象介面來注入依賴的實際物件。」<br />依賴注入在Martin Fowler的文章中談到了三種實現方式：interface injection、setter injection與constructor injection。並分別稱其為type 1 IoC、type 2 IoC與type 3 IoC。<br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />Spring支持type2Ioc（setter），以及type3Ioc（constructor ）。在Xml中就支持这两种。<br />type 1 IoC，脫離目前這個容器，就必須修改程式，想想在更複雜的依賴關係中產生更多複雜的介面，組件與容器（框架）的依賴會更加複雜，最後使得組件無法從容器中脫離。<br />所以type 1 IoC具有強的侵入性，使用它來實現依賴注入會使得組件相依於容器（框架），降低組件的重用性。<br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />总结：<br />Spring的核心是個IoC容器，您可以用setter或constructor的方式來實現您的業務物件，至於物件與物件之間的關係建立，則透過組態設定，讓Spring在執行時期根據組態檔的設定來為您建立物件之間的依賴關係，您不必特地撰寫一些Helper來自行建立這些物件之間的依賴關係，這不僅減少了大量的程式撰寫，也降低了物件之間的耦合程度。</span><img src ="http://www.blogjava.net/Duffblog/aggbug/75446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Duffblog/" target="_blank">追球者</a> 2006-10-16 17:08 <a href="http://www.blogjava.net/Duffblog/articles/75446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>