??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
]]>
IoC是Inversion of ControlQ控制反转。在Java开发中Q?/span>IoC意味着你设计好的cMl系l去控制Q而不是在你的cd部控制。这UCؓ控制反{?/span>
下面我们以几个例子来说明什么是IoC
假设我们要设计一?/span>Girl和一?/span>Boyc,其中Girl?/span>kissҎQ即Girl惌Kiss一?/span>Boy。那么,我们的问题是Q?/span>Girl如何能够认识q个BoyQ?/span>
在我们中国,常见的Q与GG的认识方式有以下几种
Q 青梅竚wQ?/span> Q 亲友介绍Q?/span> Q 父母包办
那么哪一U才是最好呢Q?/span>
青梅竚wQ?/span>Girl从小q道自qBoy?/span>
public
class
Girl {
|
然而从开始就创徏?/span>Boy~点是无法在更换。ƈ且要负责Boy的整个生命周期。如果我们的Girl惌换一个怎么办?Q笔者严重不支持Girll常更换BoyQ?/span>
亲友介绍Q由中间责提?/span>Boy来见?/span>
|
亲友介绍Q固然是好。如果不满意Q尽另外换一个好了。但是,亲友BoyFactoryl常是以Singleton的Ş式出玎ͼ不然是Q存在于GlobalsQ无处不在,无处不能。实在是太繁琐了一点,不够灉|。我Z么一定要q个亲友掺和q来呢?Z么一定要付给她介l费呢?万一最好的朋友׃了我的男朋友呢?
父母包办Q一切交l父母,自己不用费吹C力,只需要等着Kiss好了?/span>
void kiss(Boy boy){ // kiss boy boy.kiss(); } } |
WellQ这是对Girl最好的ҎQ只要想办法贿赂?/span>Girl的父母,q把Boy交给他。那么我们就可以L的和Girl?/span>Kiss了。看来几千年传统的父母之命还真是有用哦。至?/span>Boy?/span>Girl不用自己瞎忙乎了?/span>
q就?/span>IOCQ将对象的创建和获取提取到外部。由外部容器提供需要的lg?/span>
我们知道好莱坞原?/span>Q?/span>“Do not call us, we will call you.” 意思就是,You, girlie, do not call the boy. We will feed you a boy?/span>
我们q应该知?strong>依赖倒{原则?/span> Dependence Inversion PrincinpleQ?/span>DIP?/span>
Eric Gamma_要面向抽象编E。面向接口编E是面向对象的核心?/span>
lg应该分ؓ两部分,?/span>
Service, 所提供功能的声?/span>
Implementation, Service的实?/span>
好处是:多实现可以Q意切换,防止 “everything depends on everything” 问题Q即具体依赖于具体?/span>
所以,我们?/span>Boy应该是实?/span>Kissable接口。这样一?/span>Girl不想kiss可恶?/span>Boy的话Q还可以kiss可爱?/span>kitten和慈的grandmother?/span>
二?/span>IOC?/span>type
IoC?/span>Type指的?/span>Girl得到Boy的几U不同方式。我们逐一来说明?/span>
IOC type 0Q?/span>不用IOC
public class Girl implements Servicable { private Kissable kissable; public Girl()
{ public
void
kissYourKissable() { }
|
Girl自己建立自己?/span>BoyQ很难更换,很难׃nl别人,只能单独使用Qƈ负责完全的生命周期?/span>
IOC type 1Q?/span>先看代码Q?/span>
public class Girl implements Servicable { Kissable kissable; public
void
service(ServiceManager mgr) { public
void
kissYourKissable() { }
|
q种情况出现?/span>Avalon Framework。一个组件实CServicable接口Q就必须实现serviceҎQƈ传入一?/span>ServiceManager。其中会含有需要的其它lg。只需要在serviceҎ中初始化需要的Boy?/span>
另外Q?/span>J2EE中从Context取得对象也属?/span>type 1?/span>
它依赖于配置文g
<container> <component
name=“girl"
class=“Girl"
/>
|
IOC type 2Q?/span>
public class Girl { private Kissable kissable; public
void
setKissable(Kissable kissable) { public
void
kissYourKissable() { }
|
Type 2出现?/span>Spring FrameworkQ是通过JavaBean?/span>setҎ来将需要的Boy传递给Girl。它必须依赖于配|文件?/span>
<beans>
|
IOC type 3
public class Girl { private Kissable kissable; public Girl(Kissable
kissable) { public
void
kissYourKissable() { }
|
q就?/span>PicoContainer的组?/span> 。通过构造函C?/span>Boyl?/span>Girl?/span>
PicoContainer container =
new
DefaultPicoContainer();
|
关于PicoContainerQ作者后l文章会详细介绍?/span>
作者语Q?/span>
WellQ以上的q些理论部分有些已经有了新的定义了。过些天我会再写一些文章具体说明。比如,原来的三U?/span>typel构现在已经重新定义Z赖注的许多层次?/span>
IoC很年轻,q在发展。伴随着IOC的发展,AOPQ?/span>COPQ?/span>SOP{等都在不断的发展。作为程序员Q随时关注着新的思想的发展是一件很L愉快的事情。有没有人愿意和我一h讨学习共同进步呀Q?/span>
摘自Qhttp://dev.csdn.net/develop/article/24/24397.shtm
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <!-- our Authenticator implementation --> <bean id="smtpAuthenticator" class="forums.mailtest.SmtpAuthenticator"> <constructor-arg value="yourname@gmail.com" /> <constructor-arg value="password" /> </bean> <!-- now setup an authenticated session --> <bean id="mailSession" class="javax.mail.Session" factory-method="getInstance"> <constructor-arg> <props> <prop key="mail.smtp.auth">true</prop> <prop key="mail.smtp.socketFactory.port">465</prop> <prop key="mail.smtp.socketFactory.class"> javax.net.ssl.SSLSocketFactory </prop> <prop key="mail.smtp.socketFactory.fallback"> false </prop> </props> </constructor-arg> <constructor-arg ref="smtpAuthenticator" /> </bean> <!-- and configure the MailSender with the authenticated session --> <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="smtp.gmail.com" /> <property name="session" ref="mailSession" /> </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="yourname@gmail.com" /> <property name="subject" value="Testing" /> </bean> <bean id="mailTest" class="forums.mailtest.MailTest"> <constructor-arg ref="mailSender" /> <constructor-arg ref="templateMessage" /> </bean> </beans>
package forums.mailtest; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; public class SmtpAuthenticator extends Authenticator { private String username; private String password; public SmtpAuthenticator(String username, String password) { super(); this.username = username; this.password = password; } public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }
package forums.mailtest; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.mail.MailException; import org.springframework.mail.MailSender; import org.springframework.mail.SimpleMailMessage; public class MailTest { private MailSender mailSender; private SimpleMailMessage templateMessage; public MailTest(MailSender mailSender, SimpleMailMessage templateMessage) { super(); this.mailSender = mailSender; this.templateMessage = templateMessage; } public void sendMeMail() { SimpleMailMessage msg = new SimpleMailMessage(templateMessage); msg.setTo("test@example.com"); msg.setText("This is a test.\nGo Spring!\n"); try { this.mailSender.send(msg); } catch (MailException e) { System.err.println("Didn't work."); e.printStackTrace(); } } public static final void main(String[] args) { ApplicationContext appCtx = new ClassPathXmlApplicationContext(new String[] { "forums/mailtest/application-config.xml" }); MailTest tester = (MailTest) appCtx.getBean("mailTest"); tester.sendMeMail(); } }