]]>spring对java˜qœç¨‹è°ƒç”¨çš„简åŒ?äº?之Hessian,Burlaphttp://www.aygfsteel.com/xfan/archive/2006/06/13/52446.html~ž®Q~ž®QTue, 13 Jun 2006 05:19:00 GMThttp://www.aygfsteel.com/xfan/archive/2006/06/13/52446.htmlhttp://www.aygfsteel.com/xfan/comments/52446.htmlhttp://www.aygfsteel.com/xfan/archive/2006/06/13/52446.html#Feedback0http://www.aygfsteel.com/xfan/comments/commentRss/52446.htmlhttp://www.aygfsteel.com/xfan/services/trackbacks/52446.html       HessianåƒRMIé‚£æ ·åQŒä‹É用二˜q›åˆ¶æ¶ˆæ¯æ¥å¾ç«‹å®¢æˆïL«¯å’ŒæœåŠ¡ç«¯ä¹‹é—´çš„äº¤‹¹ã€‚与其他二进制远½E‹æŠ€æœ?想RMI)ä¸åŒçš„æ˜¯åQŒå®ƒå¯ä»¥¿UÀL¤åˆ°å…¶ä»–éžJavaçš„è¯a€ã€?br />     Burlap是一¿U基于Xml的远½E‹æŠ€æœ¯ï¼Œ˜q™ä‹Éå¾—ä»–å¯ä»¥¿UÀL¤åˆîC“Q何å¯ä»¥è§£æžXMLçš„è¯a€ä¸ã€‚比起HessianåQŒå®ƒçš„å¯è¯ÀL€§æ›´å¼ºã€‚和其他åŸÞZºŽXml的远½E‹æŠ€æœ¯ï¼ˆå¦‚SOAPå’ŒXML-RPCåQ‰ä¸åŒï¼Œå®ƒçš„æ¶ˆæ¯¾l“æž„ž®½å¯èƒ½ç®€å•,ä¸éœ€è¦é¢å¤–的外部定义è¯è¨€(如WSDL或IDL).  针对å‰é¢çš„例å,看看spring对Hessianå’ŒBurlap是怎么½Ž€åŒ–ã€?br />1.Hessian 1)客户端的é…ç½®åQŒåªéœ€è¦ä¿®æ”¹bean_client.xml的酾|?br />
<beans>     <!--客户�/span>-->     <bean id="pf" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">         <property name="serviceUrl"  value="http://192.168.1.8:8080/spring/pay.service"/>         <property name="serviceInterface" value="com.open.rmi.ex2.PerfectTimeI"/>     </bean>     <bean id="test" class="com.open.rmi.ex2.DisplayPerfectTime">         <property name="pf" ref="pf"/>     </bean> </beans>
<servlet> Â Â Â Â Â Â Â Â <servlet-name>Dispatcher</servlet-name> Â Â Â Â Â Â Â Â <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> Â Â Â Â <servlet-mapping> Â Â Â Â Â Â Â Â <servlet-name>Dispatcher</servlet-name> Â Â Â Â Â Â Â Â <url-pattern>*.service</url-pattern> Â Â Â Â </servlet-mapping>
<beans>     <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">         <property name="mappings">             <props>                 <prop key="/pay.service">hessianService</prop>             </props>         </property>     </bean>     <bean id="hessianService" class="org.springframework.remoting.caucho.HessianServiceExporter">         <property name="service" ref="pt"/>         <property name="serviceInterface" value="com.open.rmi.ex2.PerfectTimeI"/>     </bean>     <bean id="pt" class="com.open.rmi.ex2.PerfectTime"/> </bean>
<beans>     <!--客户�/span>-->     <bean id="pf" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">         <property name="serviceUrl" value="rmi://192.168.1.8:1099/perfect_time"/>         <property name="serviceInterface" value="com.open.rmi.ex2.PerfectTimeI"/>     </bean>     <bean id="test" class="com.open.rmi.ex2.DisplayPerfectTime">         <property name="pf" ref="pf"/>     </bean> </beans>
package com.open.rmi.ex2; public class PerfectTime  implements PerfectTimeI {     public long getPerfectTime() {         return System.currentTimeMillis();     } }
é…ç½®bean_server.xml
<beans>     <!--æœåŠ¡ç«?Springè¯Õd–完定义文ä»?在生æˆserviceExporter实例åŽï¼ŒRMIæœåŠ¡ž®×ƒ¼šå¯åЍ-->     <bean id="serviceExporter"         class="org.springframework.remoting.rmi.RmiServiceExporter">         <property name="service" ref="pt"/>         <property name="serviceName" value="perfect_time"/>         <property name="serviceInterface" value="com.open.rmi.ex2.PerfectTimeI"/>     </bean>     <bean id="pt" class="com.open.rmi.ex2.PerfectTime"/> </beans>
3.‹¹‹è¯•代ç TestServer.java
package com.open.rmi.ex2; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestServer {     public static void main(String[] args) {         BeanFactory bf=new ClassPathXmlApplicationContext("bean_server.xml");         bf.getBean("serviceExporter");     } }
TestClient.java
package com.open.rmi.ex2; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestClient {     public static void main(String[] args) {         BeanFactory bf = new ClassPathXmlApplicationContext("bean_client.xml");         DisplayPerfectTime test = (DisplayPerfectTime)bf.getBean("test");         test.display();     } }
]]>事务的特点以åŠspringæä¾›äº‹åŠ¡½Ž¡ç†å™¨çš„½Ž€ä»?/title>http://www.aygfsteel.com/xfan/archive/2006/06/10/51839.html~ž®Q~ž®QSat, 10 Jun 2006 06:02:00 GMThttp://www.aygfsteel.com/xfan/archive/2006/06/10/51839.htmlhttp://www.aygfsteel.com/xfan/comments/51839.htmlhttp://www.aygfsteel.com/xfan/archive/2006/06/10/51839.html#Feedback0http://www.aygfsteel.com/xfan/comments/commentRss/51839.htmlhttp://www.aygfsteel.com/xfan/services/trackbacks/51839.html1)åŽŸåæ€?Atomic) 事务ç”׃¸€ä¸ªæˆ–å¤šä¸ªè¡ŒäØ“¾l‘在一èµïL»„æˆçš„åQŒå¥½åƒä¸€ä¸ªå•独的工作å•元。事务ä¸çš„æ“ä½œè¦ä¹ˆéƒ½å‘生åQŒè¦ä¹ˆéƒ½ä¸å‘生ã€?br />2)一致æ€?Consistent)一旦一个事务结æŸäº†(ä¸ç®¡æˆåŠŸä¸Žå¦)åQŒç³»¾lŸæ‰€å¤„的状æ€å’Œå®ƒçš„业务规则是一致的ã€?br />3)隔离æ€?Isolated)事务应该å…许多个用户æ“作åŒä¸€ä¸ªæ•°æ®ï¼Œä¸€ä¸ªç”¨æˆïLš„æ“ä½œä¸ä¼šå’Œå…¶ä»–用æˆïLš„æ“ä½œç›¸æØœ‹¹Šã€?br />4)æŒä¹…æ€?Durable)一旦事务完æˆï¼Œäº‹åŠ¡çš„ç»“æžœåº”è¯¥æŒä¹…化ã€?br /> springæä¾›äº†ä»¥ä¸‹äº‹åŠ¡ç®¡ç†å™¨ 1)DataSourceTransactionManager      在å•一的JDBC DataSourceä¸ç®¡ç†äº‹åŠ?br />2)HibernateTransactionManager 当æŒä¹…化机制是Hibernateæ—Óž¼Œç”¨å®ƒæ¥ç®¡ç†äº‹åŠ?br />3)JdoTransactionManager 当æŒä¹…化机制时JDOæ—Óž¼Œç”¨å®ƒæ¥ç®¡ç†äº‹åŠ?br />4)JtaTransactionManager使用一个JTA实行æ¥ç®¡ç†äº‹åŠ¡ã€‚å½“ä¸€ä¸ªäº‹åŠ¡è·¨‘Šå¤šä¸ªèµ„æºæ—¶Â    必须使用 5)PersistenceBrokerTransactionManager当Apacheçš„OJB用作æŒä¹…化时åQŒç”¨å®ƒæ¥½Ž¡ç†äº‹åŠ¡ 6)TopLinkTransactionManager当oracleçš„TopLink用作æŒä¹…化时åQŒç”¨å®ƒæ¥½Ž¡ç†äº‹åŠ¡ 7)JmsTransactionManager用它æ¥ç®¡ç†JMS的事åŠ?br />
]]>最½Ž€å•的动æ€ä»£ç†å®žä¾?springåŸÞZºŽæŽ¥å£ä»£ç†çš„AOP原ç†)http://www.aygfsteel.com/xfan/archive/2006/06/09/51628.html~ž®Q~ž®QFri, 09 Jun 2006 02:20:00 GMThttp://www.aygfsteel.com/xfan/archive/2006/06/09/51628.htmlhttp://www.aygfsteel.com/xfan/comments/51628.htmlhttp://www.aygfsteel.com/xfan/archive/2006/06/09/51628.html#Feedback1http://www.aygfsteel.com/xfan/comments/commentRss/51628.htmlhttp://www.aygfsteel.com/xfan/services/trackbacks/51628.htmlJDK的动æ€ä»£ç†æ˜¯åŸÞZºŽæŽ¥å£çš?br />
package com.open.aop; public interface BusinessInterface {     public void processBusiness(); }
ç›®æ ‡å¯¹è±¡
package com.open.aop; public class BusinessObject implements BusinessInterface {     public void processBusiness() {         System.out.println("action");     } }
package com.open.aop; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Test {     public static void main(String[] args) {         BusinessInterface bi = (BusinessInterface) new LogHandler()                 .binder(new BusinessObject());         bi.processBusiness();     } }
<beans> <bean id="bs" class="com.open.bean.BeanSet">         <property name="str1">             <list>                 <value>value1</value>                 <value>value2</value>             </list>         </property>         <property name="str2">             <value>value3,value4</value>         </property>         <property name="lst">             <list>                 <value>value5</value>                 <ref bean="cc1"/>             </list>         </property>         <property name="map">             <map>                 <entry key="key1">                     <value>xxx</value>                 </entry>                 <entry key="key2">                     <ref bean="cc1"/>                 </entry>             </map>         </property>         <property name="props">             <props>                 <prop key="key1">xxx</prop>                 <prop key="key2">yyy</prop>             </props>         </property>         <property name="child">             <list>                 <ref bean="cc1"/>                 <ref bean="cc2"/>             </list>         </property>     </bean>     <bean id="cc1" class="com.open.bean.ChildBean"/>     <bean id="cc2" class="com.open.bean.ChildBean"/> </beans>
‹¹‹è¯•代ç
package com.open.bean; import java.util.List; import java.util.Map; import java.util.Properties; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test1 {     public static void main(String[] args) {         ClassPathXmlApplicationContext cx=             new ClassPathXmlApplicationContext("bean.xml");         BeanSet bs=(BeanSet)cx.getBean("bs");         String[] str1=bs.getStr1();         String[] str2=bs.getStr1();         List lst=bs.getLst();         Map map=bs.getMap();         Properties props=bs.getProps();         ChildBean[] cb=bs.getChild();         System.out.println("str1="+"["+str1[0]+","+str1[1]+"]");         System.out.println("str2="+"["+str2[0]+","+str2[1]+"]");         System.out.println("lst="+lst);         System.out.println("map="+map);         System.out.println("props="+props);         System.out.println("cb="+"["+cb[0]+","+cb[1]+"]");     } }
]]>spring如何引用propertiesæ–‡äšg里的é…ç½®http://www.aygfsteel.com/xfan/archive/2006/06/07/51006.html~ž®Q~ž®QTue, 06 Jun 2006 18:40:00 GMThttp://www.aygfsteel.com/xfan/archive/2006/06/07/51006.htmlhttp://www.aygfsteel.com/xfan/comments/51006.htmlhttp://www.aygfsteel.com/xfan/archive/2006/06/07/51006.html#Feedback0http://www.aygfsteel.com/xfan/comments/commentRss/51006.htmlhttp://www.aygfsteel.com/xfan/services/trackbacks/51006.html它是把属性ä¸çš„定义的å˜é‡(var)替代,spring的酾|®æ–‡ä»¶ä¸ä½¿ç”¨${var}çš„å ä½ç¬¦
<beans> <bean id="configBean" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">           <property name="location"><value>db.properties</value></property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">     <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>     <property name="url"><value>${jdbc.url}</value></property>     <property name="username"><value>${jdbc.username}</value></property>     <property name="password"><value>${jdbc.password}</value></property> </bean> </beans>
<beans> <bean id="configBean" class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">            <property name="location"><value>db.properties</value></property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">     <property name="driverClassName"><value>org.hsqldb.jdbcDriver</value></property>     <property name="url"><value>jdbc:hsqldb:hsql://production:9002</value></property>     <property name="username"><value>test</value></property>     <property name="password"><value>123456</value></property> </bean> </beans>
package com.open.bean; import java.beans.PropertyEditorSupport; public class PhoneEditor extends PropertyEditorSupport {     public void setAsText(String textValue) throws IllegalArgumentException {         String []str=textValue.split("-");         if(str!=null&&str.length==2) {             PhoneNumber pn=new PhoneNumber(str[0],str[1]);             setValue(pn);         }else {             setValue(new PhoneNumber("0000","0000000"));         }        } }
<beans><!--注册¾~–辑å™?/span>-->     <bean id="customEditorConfigurer"         class="org.springframework.beans.factory.config.CustomEditorConfigurer">         <property name="customEditors">             <map>                 <entry key="com.open.bean.PhoneNumber">                     <bean id="phoneEditor" class="com.open.bean.PhoneEditor"/>                 </entry>             </map>         </property>     </bean>     <bean id="person" class="com.open.bean.Person">         <property name="phoneNumber" value="0731-8888888"/>     </bean> </beans>
]]>springä¸Bean的生命周æœ?/title>http://www.aygfsteel.com/xfan/archive/2006/06/06/50883.html~ž®Q~ž®QTue, 06 Jun 2006 11:56:00 GMThttp://www.aygfsteel.com/xfan/archive/2006/06/06/50883.htmlhttp://www.aygfsteel.com/xfan/comments/50883.htmlhttp://www.aygfsteel.com/xfan/archive/2006/06/06/50883.html#Feedback3http://www.aygfsteel.com/xfan/comments/commentRss/50883.htmlhttp://www.aygfsteel.com/xfan/services/trackbacks/50883.htmlLife¾c?
package com.open.bean; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; public class Life implements BeanFactoryAware, BeanNameAware,         InitializingBean, DisposableBean {     private String msg;     public Life() {         System.out.println("msg="+msg);         System.out.println("æž„é€ å‡½æ•?/span>");     }     public void setBeanFactory(BeanFactory beanFactory) throws BeansException {         System.out.println("setBeanFactory");     }     public void setBeanName(String name) {         System.out.println("setBeanName");     }     public void init() {         System.out.println("åˆå§‹åŒ?/span>");     }     public Object postProcessBeforeInitialization(Object bean, String beanName)             throws BeansException {         System.out.println("postProcessBeforeInitialization");         return null;     }     public Object postProcessAfterInitialization(Object bean, String beanName)             throws BeansException {         System.out.println("postProcessAfterInitialization");         return null;     }     public void afterPropertiesSet() throws Exception {         System.out.println("afterPropertiesSet");     }     public void destroy() throws Exception {         System.out.println("destroy");     }     public String getMsg() {         return msg;     }     public void setMsg(String msg) {         this.msg = msg;     } }
BeanPostProcessorImp¾c?
package com.open.bean; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class BeanPostProcessorImp implements BeanPostProcessor {     public Object postProcessBeforeInitialization(Object bean, String beanName)             throws BeansException {         System.out.println("postProcessBeforeInitialization");         return bean;     }     public Object postProcessAfterInitialization(Object bean, String beanName)             throws BeansException {         System.out.println("postProcessAfterInitialization");         return bean;     } }
BeanCounter¾c?
package com.open.bean; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; public class BeanCounter implements BeanFactoryPostProcessor {     public void postProcessBeanFactory(             ConfigurableListableBeanFactory beanFactory) throws BeansException {         System.out.println("¾cÈš„æ•°é‡åQ?/span>"+beanFactory.getBeanDefinitionCount());     } }
bean.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"     "http://www.springframework.org/dtd/spring-beans.dtd"> <beans>     <bean id="life" name="life_name" class="com.open.bean.Life"         init-method="init">         <property name="msg" value="lifexxxx"/>     </bean>        <bean id="processor" class="com.open.bean.BeanPostProcessorImp"/>     <bean id="counter" class="com.open.bean.BeanCounter"/> </beans>
‹¹‹è¯•¾c?
package com.open.bean; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test {     public static void main(String[] args) {         ClassPathXmlApplicationContext cx=             new ClassPathXmlApplicationContext("bean.xml");          Life life=(Life)cx.getBean("life");         } }   Â