??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久久9999,色综合天天综合,欧美6一10sex性hdhttp://www.aygfsteel.com/zhanglongsr/category/12017.html路O漫其修远兮,向ְ上下而求索!zh-cnMon, 30 Jan 2012 14:43:44 GMTMon, 30 Jan 2012 14:43:44 GMT60Spring 源码阅读(IOC容器)-bean的实例化以及注入http://www.aygfsteel.com/zhanglongsr/articles/369029.htmlzhangxlzhangxlMon, 30 Jan 2012 08:04:00 GMThttp://www.aygfsteel.com/zhanglongsr/articles/369029.htmlhttp://www.aygfsteel.com/zhanglongsr/comments/369029.htmlhttp://www.aygfsteel.com/zhanglongsr/articles/369029.html#Feedback0http://www.aygfsteel.com/zhanglongsr/comments/commentRss/369029.htmlhttp://www.aygfsteel.com/zhanglongsr/services/trackbacks/369029.html阅读全文

zhangxl 2012-01-30 16:04 发表评论
]]>
Spring 源码阅读(IOC容器)-容器启动2http://www.aygfsteel.com/zhanglongsr/articles/369019.htmlzhangxlzhangxlMon, 30 Jan 2012 06:24:00 GMThttp://www.aygfsteel.com/zhanglongsr/articles/369019.htmlhttp://www.aygfsteel.com/zhanglongsr/comments/369019.htmlhttp://www.aygfsteel.com/zhanglongsr/articles/369019.html#Feedback0http://www.aygfsteel.com/zhanglongsr/comments/commentRss/369019.htmlhttp://www.aygfsteel.com/zhanglongsr/services/trackbacks/369019.html阅读全文

zhangxl 2012-01-30 14:24 发表评论
]]>
Spring 源码阅读(IOC容器)-容器启动1http://www.aygfsteel.com/zhanglongsr/articles/365591.htmlzhangxlzhangxlMon, 05 Dec 2011 06:46:00 GMThttp://www.aygfsteel.com/zhanglongsr/articles/365591.htmlhttp://www.aygfsteel.com/zhanglongsr/comments/365591.htmlhttp://www.aygfsteel.com/zhanglongsr/articles/365591.html#Feedback0http://www.aygfsteel.com/zhanglongsr/comments/commentRss/365591.htmlhttp://www.aygfsteel.com/zhanglongsr/services/trackbacks/365591.html阅读全文

zhangxl 2011-12-05 14:46 发表评论
]]>
一很生动的IOC讲解文章http://www.aygfsteel.com/zhanglongsr/articles/348680.htmlzhangxlzhangxlThu, 21 Apr 2011 02:13:00 GMThttp://www.aygfsteel.com/zhanglongsr/articles/348680.htmlhttp://www.aygfsteel.com/zhanglongsr/comments/348680.htmlhttp://www.aygfsteel.com/zhanglongsr/articles/348680.html#Feedback0http://www.aygfsteel.com/zhanglongsr/comments/commentRss/348680.htmlhttp://www.aygfsteel.com/zhanglongsr/services/trackbacks/348680.html一、什么是IOC

IoCInversion of ControlQ控制反转。在Java开发中Q?/span>IoC意味着你设计好的cMl系l去控制Q而不是在你的cd部控制。这UCؓ控制反{?/span>

 

下面我们以几个例子来说明什么是IoC

 

假设我们要设计一?/span>Girl和一?/span>Boyc,其中Girl?/span>kissҎQ即GirlKiss一?/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 {  
    void kiss(){
       Boy boy = new Boy();
    }
}

 

 

    然而从开始就创徏?/span>Boy~点是无法在更换。ƈ且要负责Boy的整个生命周期。如果我们的Girl惌换一个怎么办?Q笔者严重不支持Girll常更换BoyQ?/span>

 

    亲友介绍Q由中间责提?/span>Boy来见?/span>

       


public
class Girl {
    void kiss(){
       Boy boy = BoyFactory.createBoy();      
    }
}

 

    亲友介绍Q固然是好。如果不满意Q尽另外换一个好了。但是,亲友BoyFactoryl常是以Singleton的Ş式出玎ͼ不然是Q存在于GlobalsQ无处不在,无处不能。实在是太繁琐了一点,不够灉|。我Z么一定要q个亲友掺和q来呢?Z么一定要付给她介l费呢?万一最好的朋友׃了我的男朋友呢?

 

    父母包办Q一切交l父母,自己不用费吹C力,只需要等着Kiss好了?/span>

 

      


public

class Girl {
    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() {
        kissable = new Boy();
    }

    public void kissYourKissable() {
        kissable.kiss();
    }

}

 

 

    Girl自己建立自己?/span>BoyQ很难更换,很难׃nl别人,只能单独使用Qƈ负责完全的生命周期?/span>

 

    IOC type 1Q?/span>先看代码Q?/span>

 

 

public class Girl implements Servicable {

    Kissable kissable;

    public void service(ServiceManager mgr) {
        kissable = (Kissable) mgr.lookup(kissable);
    }

    public void kissYourKissable() {
        kissable.kiss();
    }

}

 

 

    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=kissable class=Boy">              
       <configuration>
</configuration>
    </component>

    <component name=girl" class=Girl" />
</container>

 

 

    IOC type 2Q?/span>

   

 

public class Girl {

    private Kissable kissable;

    public void setKissable(Kissable kissable) {
        this.kissable = kissable;
    }

    public void kissYourKissable() {
        kissable.kiss();
    }

}

 

 

    Type 2出现?/span>Spring FrameworkQ是通过JavaBean?/span>setҎ来将需要的Boy传递给Girl。它必须依赖于配|文件?/span>

       

 

<beans>
    <bean id=boy" class=Boy"/>
    <bean id=girl class=Girl">
        <property name=kissable">
           <ref bean=boy"/>
        </property>
    </bean>
</beans>

 

 

IOC type 3

 

 

public class Girl {

    private Kissable kissable;

    public Girl(Kissable kissable) {
        this.kissable = kissable;
    }

    public void kissYourKissable() {
        kissable.kiss();
    }

}

 

 

    q就?/span>PicoContainer的组?/span> 。通过构造函C?/span>Boyl?/span>Girl?/span>

 

 

 

PicoContainer container = new DefaultPicoContainer();
container.registerComponentImplementation(Boy.class);
container.registerComponentImplementation(Girl.class);
Girl girl = (Girl) container.getComponentInstance(Girl.class);
girl.kissYourKissable();

 

 

    关于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



zhangxl 2011-04-21 10:13 发表评论
]]>
用Java动态代理实现AOP http://www.aygfsteel.com/zhanglongsr/articles/348676.htmlzhangxlzhangxlThu, 21 Apr 2011 01:45:00 GMThttp://www.aygfsteel.com/zhanglongsr/articles/348676.htmlhttp://www.aygfsteel.com/zhanglongsr/comments/348676.htmlhttp://www.aygfsteel.com/zhanglongsr/articles/348676.html#Feedback0http://www.aygfsteel.com/zhanglongsr/comments/commentRss/348676.htmlhttp://www.aygfsteel.com/zhanglongsr/services/trackbacks/348676.html 目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至Q也涌现出大量支持AOP的优UFrameworkQ?-SpringQ?JACQ?Jboss AOP {等。AOPg一时之间成了潮。Java初学者不要发出感慨QOOPq没有学通呢Q又来AOP。本pd文章便是为您做出q方面的补救Q只是通过一个简单的例子便可以向初学者展CZ下如何来q行AOP?

Z单v见,例子没有没有使用MW三方的AOP FrameworkQ?而是利用Java语言本n自带的动态代理功能来实现AOP?

让我们先回到AOP本nQAOP主要应用于日志记录,性能l计Q安全控Ӟ事务处理{方面。它的主要意囑ְ要将日志记录Q性能l计Q安全控制等{代码从商业逻辑代码中清楚的划分出来Q我们可以把q些行ؓ一个一个单独看作系l所要解决的问题Q就是所谓的面向问题的编E?不知AOP译作面向问题的编E是否欠?。通过对这些行为的分离Q我们希望可以将它们独立地配|到商业Ҏ中,而要改变q些行ؓ也不需要媄响到商业Ҏ代码?

假设pȝ׃pd的BusinessObject所完成业务逻辑功能Q系l要求在每一ơ业务逻辑处理时要做日志记录。这里我们略d体的业务逻辑代码?

public interface BusinessInterface {
public void processBusiness();
}

public class BusinessObject implements BusinessInterface {
private Logger logger = Logger.getLogger(this.getClass().getName());
public void processBusiness(){
try {
logger.info("start to processing...");
//business logic here?
System.out.println(“here is business logic”);
logger.info("end processing...");
} catch (Exception e){
logger.info("exception happends...");
//exception handling
}
}
}

q里处理商业逻辑的代码和日志记录代码混合在一Pq给日后的维护带来一定的困难Qƈ且也会造成大量的代码重复。完全相同的log代码出现在pȝ的每一个BusinessObject中?

按照AOP的思想Q我们应该把日志记录代码分离出来。要这些代码分d涉及C个问题,我们必须知道商业逻辑代码何时被调用,q样我们好插入日志记录代码。一般来说要截获一个方法,我们可以采用回调Ҏ或者动态代理。动态代理一般要更加灉|一些,目前多数的AOP Framework也大都采用了动态代理来实现。这里我们也采用动态代理作Z子?

JDK1.2以后提供了动态代理的支持Q程序员通过实现java.lang.reflect.InvocationHandler接口提供一个执行处理器Q然后通过 java.lang.reflect.Proxy得到一个代理对象,通过q个代理对象来执行商业方法,在商业方法被调用的同Ӟ执行处理器会被自动调用?

有了JDK的这U支持,我们所要做的仅仅是提供一个日志处理器?

public class LogHandler implements InvocationHandler {

private Logger logger Q?Logger.getLogger(
this.getClass().getName());
private Object delegate;
public LogHandler(Object delegate){
this.delegate = delegate;
}

public Object invoke(Object proxyQ?
Method methodQ?Object[] args)
throws Throwable {
Object o = null;
try {
logger.info("method stats..." Q?method);
o = method.invoke(delegateQargs);
logger.info("method ends..." + method);
} catch (Exception e){
logger.info("Exception happends...");
//excetpion handling?
}
return o;
}
}

现在我们可以把BusinessObject里面的所有日志处理代码全部去掉了?

public class BusinessObject implements BusinessInterface {

private Logger logger = Logger.getLogger(
this.getClass().getName());
public void processBusiness(){
//business processing
System.out.println(“here is business logic”);
}
}

客户端调用商业方法的代码如下Q?

BusinessInterface businessImp = new BusinessObject();

InvocationHandler handler =
new LogHandler(businessImp);

BusinessInterface proxy = (
BusinessInterface) Proxy.newProxyInstance(
businessImp.getClass().getClassLoader()Q?
businessImp.getClass().getInterfaces()Q?
handler);

proxy.processBusiness();

E序输出如下Q?

INFO: method stats..?
here is business logic
INFO: method ends..?

x我们的第一ơ小试是完成了。可以看刎ͼ采用AOP之后Q日志记录和业务逻辑代码完全分开了,以后要改变日志记录的话只需要修Ҏ志记录处理器p了,而业务对象本w(BusinessObjectQ无需做Q何修攏Vƈ且这个日志记录不会造成重复代码了,所有的商业处理对象都可以重用这个日志处理器?

当然在实际应用中Q这个例子就昑־太粗p了。由于JDK的动态代理ƈ没有直接支持一ơ注册多?InvocationHandlerQ那么我们对业务处理Ҏ既要日志记录又要性能l计Ӟ需要自己做一些变通了。一般我们可以自己定义一?Handler接口Q然后维护一个队列存放所有HandlerQ当InvocationHandler被触发的时候我们依ơ调用自qHandler。所q的是目前几乎所有的AOP Framework都对q方面提供了很好的支?q里推荐大家使用Spring?

本文转自 Qhttp://blog.csdn.net/turkeyzhou/archive/2008/03/01/2137358.aspx


zhangxl 2011-04-21 09:45 发表评论
]]>
Spring下开发带有图片的html邮ghttp://www.aygfsteel.com/zhanglongsr/articles/51461.htmlzhangxlzhangxlThu, 08 Jun 2006 11:05:00 GMThttp://www.aygfsteel.com/zhanglongsr/articles/51461.htmlhttp://www.aygfsteel.com/zhanglongsr/comments/51461.htmlhttp://www.aygfsteel.com/zhanglongsr/articles/51461.html#Feedback0http://www.aygfsteel.com/zhanglongsr/comments/commentRss/51461.htmlhttp://www.aygfsteel.com/zhanglongsr/services/trackbacks/51461.html   发送邮仉要通过验证,我们需要徏立一个带有实CAuthenticator的Session.我们应该了解,在用Java~写JavaMail时是需要用的验证?但是,在Spring中没有提供注入验证实现的功能(x入Authenticator的实?.但是我们可以用以下方式加以实?下面׃gmail邮gZ说明:
   在Spring中的配置信息如下:

<?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>

实现我们自己的验证实?/font>
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);
	}
}
   ~写试cd送邮?
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();
	}
}

   对于gmail端口的设|可以参?http://mail.google.com/support/bin/a...y?answer=13287,个h认ؓyahoo?gmail 都希望我们用验?q且我们可以为每个邮件服务器讄不同的端?如果没有采用验证,与gmail的连接将会抛Z个没有验证信息的异常!


zhangxl 2006-06-08 19:05 发表评论
]]>
վ֩ģ壺 | | ɽ| | | ֲ| | | | ͭ| | | Դ| | | | ͭɽ| ¡| | | Ѯ| | ̩| Զ| | ν| | ˮ| ˳| | | ˳| ͨ| ¡| ̴| | ٺ| ̩| | | |