package com.open.quartz; import org.springframework.mail.MailException; import org.springframework.mail.MailSender; import org.springframework.mail.SimpleMailMessage; public class MailService {     private MailSender mailSender;     private SimpleMailMessage mailMessage;//é‚®äšgæ¨¡æ¿ Â Â Â Â public void sendMail() {         System.out.println("-----------å‘é€é‚®ä»?---------");         SimpleMailMessage msg=new SimpleMailMessage(this.mailMessage);         msg.setText("this is a test mail");         try {             mailSender.send(msg);         } catch (MailException e) {             e.printStackTrace();         }         System.out.println("-----------å‘逿ˆåŠ?---------");     }      //çœç•¥set,getæ–ÒŽ³• }
在web.xmlé‡Œæ·»åŠ ä»¥ä¸‹ä»£ç ?br />
<listener> Â Â Â Â Â Â Â Â <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> Â Â Â Â </listener>
]]>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>
è·Ÿç¬¬ä¸€èŠ‚çš„ç›¸æ¯”åªæ˜¯æ›´æ¢äº†ä»£ç†ç±»åQŒå¯åЍtomcatåQŒåœ¨˜q行TestClientž®±å¯ä»¥çœ‹åˆ°è¾“出结果了 2.Burlap åªè¦æŠŠbean_client.xmlä¸çš„HessianProxyFactoryBeanæ”ÒŽˆBurlapProxyFactoryBean,Dispatcher-servlet.xmlä¸çš„HessianServiceExporteræ”ÒŽˆBurlapServiceExporteråQŒå°±å¯ä»¥äº†ã€?br />     通过上é¢å¯ä»¥çœ‹åˆ°åQŒåº”用从¾U¯RMI转æ¢åˆ°Hessian,Burlap是多么容易啊!
]]>spring对java˜qœç¨‹è°ƒç”¨çš„简åŒ?一)之RMIhttp://www.aygfsteel.com/xfan/archive/2006/06/12/52294.html~ž®Q~ž®QMon, 12 Jun 2006 15:15:00 GMThttp://www.aygfsteel.com/xfan/archive/2006/06/12/52294.htmlhttp://www.aygfsteel.com/xfan/comments/52294.htmlhttp://www.aygfsteel.com/xfan/archive/2006/06/12/52294.html#Feedback2http://www.aygfsteel.com/xfan/comments/commentRss/52294.htmlhttp://www.aygfsteel.com/xfan/services/trackbacks/52294.html1.˜qœç¨‹æ–ÒŽ³•调用åQˆRMIåQ?br />2.Cauchoçš„Hessianå’ŒBurlap 3.Spring自己的HTTP invoker 4.EJB 5.Web Services 一.RMI 它由5个包å?个应用工å…ïL»„æˆ?br />java.rmi ¾l„织客户端的RMI¾c…R€æŽ¥å£å’Œå¼‚常 java.rmi.server ¾l„织æœåŠ¡å™¨ç«¯çš„RMI¾c?接å£å’Œå¼‚å¸?br />java.rmi.registry ¾l„织用于½Ž¡ç†RMIå‘½åæœåŠ¡çš„ç±» java.rmi.dgc ¾l„织用于½Ž¡ç†åˆ†å¸ƒå¼åžƒåœ¾æ”¶é›†çš„¾c?br />java.rmi.activation ¾l„织用于实现按需‹È€‹zÈš„RMIæœåŠ¡çš„ç±» rmic ¾~–译器,它äñ”生RMIä½¿ç”¨çš„å˜æ ¹å’Œæ¡†æž¶ä»¥å®Œæˆåˆ†å¸ƒå¼é€šä¿¡ rmiregistry ä¸€ä¸ªäØ“RMIæä¾›å‘½åæœåŠ¡çš„æœåС噍åQŒè¿™™åÒŽœåŠ¡æŠŠåå—和对象关è”在一èµ?br />rmid 一个支æŒRMI‹È€‹zÀL¡†æž¶çš„æœåŠ¡å™?br />     如果具体˜q˜ä¸çŸ¥é“什么是RMIåQŒå¯ä»¥å‚考这½‹‡éžå¸æ€¸é”™çš„æ–‡ç« ã€?a >JavaRMI入门实战ã€?br />注æ„:    1)è¦æŠŠPerfectTime å’ŒPerfectTimeI¾cÖM¸çš?br />  System.setSecurityManager(new RMISecurityManager()); æ³¨é‡ŠæŽ‰ï¼ˆå› äØ“˜q™éœ€è¦é…安全½{–ç•¥åQŒæ¯”较麻烦)    2)˜q˜æœ‰åœ¨JDK5下,用rmic -d命ä×oçš„è¯åªä¼šè¾“出一个文ä»Óž¼Œå› 䨓JDK5对RMI˜q›è¡Œäº†ä¼˜åŒ?br />接下æ¥çœ‹çœ‹ç”¨springå¯V€?a >JavaRMI入门实战》例åçš„½Ž€åŒ?br />1.客户端的é…ç½®åŠä»£ç ?br />PerfectTimeI接å£åQˆä¸ç”¨ç‘ô承java.rmi.Remote接å£äº†ï¼Œæ™®é€šçš„POJOåQ?br />
package com.open.rmi.ex2; public interface PerfectTimeI  {     long getPerfectTime(); }
DisplayPerfectTime¾c?也是一个普通的¾c?
package com.open.rmi.ex2; public class DisplayPerfectTime {     private PerfectTimeI pf;     public void display() {         for (int i = 0; i < 10; i++) {             System.out.println("PerfectTime:" + pf.getPerfectTime());         }     }     //çœç•¥äº†pfçš„get,setæ–ÒŽ³• }
客户端酾|®bean_client.xml
<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.Method; import java.lang.reflect.Proxy; public class LogHandler implements InvocationHandler {     private Object delegate;     public Object binder(Object delegate) {         this.delegate=delegate;         return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),                 delegate.getClass().getInterfaces(),this);     }     public Object invoke(Object proxy, Method method, Object[] args)             throws Throwable {         Object obj = null;         System.out.println("对象æ–ÒŽ³•调用å‰?/span>");         try {             obj = method.invoke(delegate, args);         } catch (Exception e) {         }         System.out.println("对象æ–ÒŽ³•调用å?/span>");         return obj;     } }
‹¹‹è¯•¾c?
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();     } }
]]>spring夿‚属性的é…ç½®http://www.aygfsteel.com/xfan/archive/2006/06/08/51303.html~ž®Q~ž®QThu, 08 Jun 2006 04:48:00 GMThttp://www.aygfsteel.com/xfan/archive/2006/06/08/51303.htmlhttp://www.aygfsteel.com/xfan/comments/51303.htmlhttp://www.aygfsteel.com/xfan/archive/2006/06/08/51303.html#Feedback0http://www.aygfsteel.com/xfan/comments/commentRss/51303.htmlhttp://www.aygfsteel.com/xfan/services/trackbacks/51303.htmlpackage com.open.bean; import java.util.List; import java.util.Map; import java.util.Properties; public class BeanSet {     private String[] str1;     private String[] str2;     private List lst;     private Map map;     private Properties props;     private ChildBean[] child;    //çœç•¥set,getæ–ÒŽ³• }
<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>
]]>springä¸è‡ªå®šä¹‰å±žæ€§ç¼–辑器http://www.aygfsteel.com/xfan/archive/2006/06/06/50920.html~ž®Q~ž®QTue, 06 Jun 2006 13:48:00 GMThttp://www.aygfsteel.com/xfan/archive/2006/06/06/50920.htmlhttp://www.aygfsteel.com/xfan/comments/50920.htmlhttp://www.aygfsteel.com/xfan/archive/2006/06/06/50920.html#Feedback0http://www.aygfsteel.com/xfan/comments/commentRss/50920.htmlhttp://www.aygfsteel.com/xfan/services/trackbacks/50920.html例å: Person¾c?br />
package com.open.bean; public class Person {     PhoneNumber phoneNumber;     //set,getæ–ÒŽ³•çœç•¥ }
PhoneNumber¾c?br />
package com.open.bean; public class PhoneNumber {     private String areaCode;     private String number;     public PhoneNumber(String areaCode,String number ) {         this.areaCode=areaCode;         this.number=number;     }     //set,getæ–ÒŽ³•çœç•¥ }
自定义属性器PhoneEditor
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");         } }   Â