<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-5385959266567928702</id><updated>2009-10-10T22:06:33.786-07:00</updated><title type='text'>Blues in Java</title><subtitle type='html'>Plays soulful blues in Java world. Is it cool?</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bluesjava.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5385959266567928702/posts/default'/><link rel='alternate' type='text/html' href='http://bluesjava.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Java Blues</name><uri>http://www.blogger.com/profile/02681848616646299865</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5385959266567928702.post-8968266498832865130</id><published>2007-12-11T17:52:00.001-08:00</published><updated>2007-12-11T17:52:49.928-08:00</updated><title type='text'>Is Sun's developer over smart or just stupid?</title><content type='html'>&lt;p&gt;Look at this code, what it will come out?&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="0" unselectable="on"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="400"&gt; &lt;p&gt;import java.text.SimpleDateFormat;&lt;br&gt;import java.util.Date;  &lt;p&gt;public class Test{&lt;br&gt;&amp;nbsp; public static void main(String[] args){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Date dt = null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dt = sdf.parse("2000999878-3454555-35344");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(sdf.format(dt));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }catch (Exception e){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("error");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;}&lt;br&gt;}&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;The result is:&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="0" unselectable="on"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="400"&gt;&lt;strong&gt;247625706-07-03&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Is this what you expected? You thought it would have thrown an exception of invalid format of text you passed in.&lt;/p&gt; &lt;p&gt;It's very common for a developer do date and time data conversion from text and vice versa in different format. Will it breach your boundary validation if you purely rely on this stupid SimpleDateFormat class?&lt;/p&gt; &lt;p&gt;Work around so far like:&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="0" unselectable="on"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="400"&gt; &lt;p&gt;import java.text.SimpleDateFormat;&lt;br&gt;import java.util.Date;  &lt;p&gt;public class Test{&lt;br&gt;public static void main(String[] args){&lt;br&gt;&amp;nbsp;&amp;nbsp;SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");&lt;br&gt;&amp;nbsp; Date dt = null;&lt;br&gt;&amp;nbsp; try{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dt = sdf.parse("2000999878-3454555-35344");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String s = sdf.format(dt);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!s.equals("2000999878-3454555-35344"))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("Data format wrong!");&lt;br&gt;&amp;nbsp; }catch (Exception e){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("error");&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp; }&lt;br&gt;}&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Ugly codes, but works.  &lt;p&gt;How many online Web systems relying on Java and J2EE have those codes?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5385959266567928702-8968266498832865130?l=bluesjava.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluesjava.blogspot.com/feeds/8968266498832865130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5385959266567928702&amp;postID=8968266498832865130' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5385959266567928702/posts/default/8968266498832865130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5385959266567928702/posts/default/8968266498832865130'/><link rel='alternate' type='text/html' href='http://bluesjava.blogspot.com/2007/12/is-sun-developer-over-smart-or-just.html' title='Is Sun&amp;#39;s developer over smart or just stupid?'/><author><name>Java Blues</name><uri>http://www.blogger.com/profile/02681848616646299865</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17257251674584604362'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5385959266567928702.post-8463214476261109256</id><published>2007-11-07T11:30:00.001-08:00</published><updated>2008-12-11T04:04:55.600-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JConsole'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='JMX'/><category scheme='http://www.blogger.com/atom/ns#' term='Bean'/><title type='text'>Manageable Spring Application - enable JMX in minutes</title><content type='html'>&lt;p&gt;We are keeping talking about manageability of an application. Why is it so important? Because at any stage of the application lifecycle, you need a way to probe the some key aspects of the application's internal status and take appropriate actions to change the application's behaviors as a consequence. Without it, you just guess the application's runtime status and never able to steer it per your needs.&lt;/p&gt; &lt;p&gt;But hold on, it's easy to talk about manageability. And it's really a great idea in the air until you want put it in a concrete base in your application. It's so cumbersome, tedious and error prone to make an implementation. There are couples of option you could choose to inject the manageability in your application:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Your own proprietary mechanism.  &lt;li&gt;Standard SNMP  &lt;li&gt;JMX&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Forget about option 1, smart as you, don't want invent any wheel. Well, SNMP (Simple Network Management Protocol) sounds good: standardized, bunch of tools and applications and really structured, until you dig in the details of all the ugly OID (Obejct Identification) definitions, binary format, pure data driven approach. And difficulties of debugging. Plus extra cost for those usable commercial SNMP tools and editors.&lt;/p&gt; &lt;p&gt;Fortunately, &amp;nbsp;we are in campus of Java, which is so far the only language and platform that put the serious crucial enterprise aspects intrinsically in the body, especially manageability in an offer as JMX. For the people working for .Net, either they just don't know what is the manageability, or struggling with various proprietary approaches or annoying SNMP stuffs.&lt;/p&gt; &lt;p&gt;Best of the best in Java application manageability is that we have the generous platform MBean Server as a gift from SUN in new version of JVM, which save your efforts looking for a MBean server; we have the JConsole as tool to directly craft your JMX management GUI frontend; and the offer from Spring's JMX supports. Combine them together, you can make any Java application JMX enabled in minutes. &lt;/p&gt; &lt;p&gt;Here is a simple example called MockServer. It's just a simple socket server for any mock testing purpose. With JMX, you can get the information and stop it in runtime.&lt;/p&gt; &lt;p&gt;Following is the partial code snippets, which is definitely the beautiful POJO. No any special MBean or MXBean stuffs in it, see!&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="643" border="0" unselectable="on"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="641"&gt; &lt;p&gt;&lt;font color="#000080"&gt;/**&lt;br&gt;&amp;nbsp;* A mock Socket server.&lt;br&gt;&amp;nbsp;*/&lt;br&gt;public class MockServer implements Runnable{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String name="";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int port = 80;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private boolean bSSL = false;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int sotimeout = 2*60*1000;//2 minutes &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private ServerSocket listeningSocket = null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private boolean bStop=false;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private long connCounts = 0; //Ongoing total connection counter.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000080"&gt;public MockServer(String name, boolean isSSL, int port, int sotimeout){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.name = name;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.bSSL = isSSL;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.port = port;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.sotimeout = sotimeout;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getName(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return name;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getPort(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return port;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public boolean isSSL(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return bSSL;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getSotimeout(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return sotimeout;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public boolean isStopped(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return bStop;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void stop(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bStop = true;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listeningSocket.close();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (IOException e) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void createListeningSocket() throws IOException {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServerSocketFactory factory = (bSSL? SSLServerSocketFactory.getDefault():ServerSocketFactory.getDefault());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listeningSocket = (ServerSocket) factory.createServerSocket(port);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void run(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("Server: "+getName()+" started.");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; createListeningSocket();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!isStopped()){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Socket worker = listeningSocket.accept();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Spawn a thread to handle the request.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fork(worker);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }catch (Exception e){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }finally {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (null!=listeningSocket){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listeningSocket.close();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (IOException e) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("Server: "+getName()+" stopped.");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void fork(Socket worker){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread wt = new Thread(new Worker(worker));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wt.start();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public long getConnCounts(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return connCounts;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected synchronized void addCount(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.connCounts++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected synchronized void minusCount(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.connCounts--;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected class Worker implements Runnable {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Socket socket=null; &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected Worker(Socket socket){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.socket = socket;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void run() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; addCount();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] buf = new byte[1024*10];//10K buffer&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InputStream is;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OutputStream os;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Read request from socket input stream.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; is = socket.getInputStream();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int size = is.read(buf);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; is.close();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Process the request.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] resp = processRequest(buf, size); &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Write back the response to socket output stream.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os = socket.getOutputStream();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.write(resp);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.flush();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.close();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (IOException e) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }finally{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(null != socket){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.close();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (IOException e) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; minusCount();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Subclasses to override it.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected byte[] processRequest(byte[] buf, int size){&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return buf;//echo it.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="641"&gt; &lt;p&gt;&lt;font color="#000080"&gt;/**&lt;br&gt;&amp;nbsp;* A mock server services to manage the mock servers.&lt;br&gt;&amp;nbsp;*/&lt;br&gt;public class MockServerService {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Set&amp;lt;MockServer&amp;gt; servers = null; &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setServers(Set&amp;lt;MockServer&amp;gt; servers){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.servers = servers;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void init(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(null != servers){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(MockServer server: servers){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Thread(server).start();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("Service initialized.");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Set&amp;lt;MockServer&amp;gt; getServers(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return servers;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void stop(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(null != servers){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(Server server: servers){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server.stop();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("Service stopped.");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="641"&gt;&lt;font color="#000080"&gt;Then we need an application entry point and integrate with Spring.&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="641"&gt; &lt;p&gt;&lt;font color="#000080"&gt;public class MockServer {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main(String[] args){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AbstractApplicationContext ctxt = new ClassPathXmlApplicationContext("context-mockserver.xml");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctxt.registerShutdownHook();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MockServerService service = (MockServerService) ctxt.getBean("mockServerService");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; service.init();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="641"&gt;&lt;font color="#000080"&gt;the context file for Sring defining the beans.&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="641"&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br&gt;&amp;lt;beans xmlns="&lt;/font&gt;&lt;a href="http://www.springframework.org/schema/beans&amp;quot;"&gt;&lt;font color="#000080"&gt;http://www.springframework.org/schema/beans"&lt;/font&gt;&lt;/a&gt;&lt;br&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi="&lt;/font&gt;&lt;a href="http://www.w3.org/2001/XMLSchema-instance&amp;quot;"&gt;&lt;font color="#000080"&gt;http://www.w3.org/2001/XMLSchema-instance"&lt;/font&gt;&lt;/a&gt;&lt;br&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation="&lt;/font&gt;&lt;a href="http://www.springframework.org/schema/beans"&gt;&lt;font color="#000080"&gt;http://www.springframework.org/schema/beans&lt;/font&gt;&lt;/a&gt;&lt;font color="#000080"&gt; &lt;/font&gt;&lt;a href="http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&amp;quot;"&gt;&lt;font color="#000080"&gt;http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&lt;/font&gt;&lt;/a&gt;&lt;font color="#000080"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="mockProcessor0" class="MockServer" &amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg index="0" value="Server1"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg index="1" value="false"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg index="2" value="80"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg index="3" value="120000"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="mockProcessor1" class="MockServer" &amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg index="0" value="Server2"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg index="1" value="false"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg index="2" value="90"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg index="3" value="120000"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="mockProcessor2" class="MockServer" &amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg index="0" value="Server3"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg index="1" value="false"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg index="2" value="100"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg index="3" value="120000"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt; &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="mockServerService" class="MockServerService"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="servers"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;set&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref local="mockProcessor0"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref local="mockProcessor1"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref local="mockProcessor2"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/set&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br&gt;&amp;lt;/beans&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Until now, nothing to do with JMX. You can run it as a normal Spring application. You can use JConsole to connect with it locally, if you run the application in this command line:&lt;/p&gt; &lt;p&gt;java -cp . -D-Dcom.sun.management.jmxremote MockServer&lt;/p&gt; &lt;p&gt;This is the snapshot of JConsole MBeans tab. Besides the default threads, memory etc. JVM MXBeans, you can't do anything else to this application.&lt;/p&gt; &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_C5USrHsffkE/RzIPFAyJBUI/AAAAAAAADYg/9rqMhv3gLD4/s1600-h/JConsoleSna1.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5130179504312485186" style="display: block; margin: 0px auto 10px; cursor: pointer; text-align: center" alt="" src="http://2.bp.blogspot.com/_C5USrHsffkE/RzIPFAyJBUI/AAAAAAAADYg/9rqMhv3gLD4/s320/JConsoleSna1.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Now, let's just simply tweak the context file, then see what happens. Add this extra block just at the end of the context file.&lt;/p&gt; &lt;p&gt;&lt;font color="#000080"&gt;... &lt;/font&gt; &lt;p&gt;&lt;font color="#000080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="mockServerService" class="MockServerService"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="servers"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;set&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref local="mockProcessor0"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref local="mockProcessor1"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref local="mockProcessor2"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/set&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="beans"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;map&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;entry key="bean:name=MockProcessor0" value-ref="mockProcessor0"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;entry key="bean:name=MockProcessor1" value-ref="mockProcessor1"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;entry key="bean:name=MockProcessor2" value-ref="mockProcessor2"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;entry key="bean:name=MockServerService" value-ref="mockServerService"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/map&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br&gt;...&lt;/font&gt;  &lt;p&gt;Here it is! The new JConsole MBeans tab populated with your beans. Now you can see the name of each bean and stop it just by invoking the corresponding stop() method of that bean. Done! You can manage your Spring application now!&lt;/p&gt; &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_C5USrHsffkE/RzIP-wyJBVI/AAAAAAAADYo/VQFgYOnN8E4/s1600-h/JConsoleSna2.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5130180496449930578" style="display: block; margin: 0px auto 10px; cursor: pointer; text-align: center" alt="" src="http://1.bp.blogspot.com/_C5USrHsffkE/RzIP-wyJBVI/AAAAAAAADYo/VQFgYOnN8E4/s400/JConsoleSna2.jpg" border="0"&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_C5USrHsffkE/RzIP_wyJBWI/AAAAAAAADYw/oKtJx8ApiT0/s1600-h/JConsoleSna3.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5130180513629799778" style="display: block; margin: 0px auto 10px; cursor: pointer; text-align: center" alt="" src="http://1.bp.blogspot.com/_C5USrHsffkE/RzIP_wyJBWI/AAAAAAAADYw/oKtJx8ApiT0/s400/JConsoleSna3.jpg" border="0"&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_C5USrHsffkE/RzIQAgyJBXI/AAAAAAAADY4/bnGsg0hfYi8/s1600-h/JConsoleSna4.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5130180526514701682" style="display: block; margin: 0px auto 10px; cursor: pointer; text-align: center" alt="" src="http://4.bp.blogspot.com/_C5USrHsffkE/RzIQAgyJBXI/AAAAAAAADY4/bnGsg0hfYi8/s400/JConsoleSna4.jpg" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;In a nutshell, following this pattern, you can tweak any of your applications to be manageable in minutes:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Define the management interfaces for your Object.  &lt;li&gt;Spring your application and expose the object as MBean you want control. Nevertheless, Spring is a extremely noninvasive container, don't be afraid. The things need you Springlize is just make a context file for beans, add less than 5 lines of code to create the application context and put the spring.jar in your classpath. Everything is so familiar to you in a POJO world.  &lt;li&gt;Enable the JVM JMX platform MBean server in command line with -Dcom.sun.management.jmxremote and run it.  &lt;li&gt;Launch the JConsole and connect to the application then control it in your hands. &lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5385959266567928702-8463214476261109256?l=bluesjava.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluesjava.blogspot.com/feeds/8463214476261109256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5385959266567928702&amp;postID=8463214476261109256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5385959266567928702/posts/default/8463214476261109256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5385959266567928702/posts/default/8463214476261109256'/><link rel='alternate' type='text/html' href='http://bluesjava.blogspot.com/2007/11/manageable-spring-application-enable.html' title='Manageable Spring Application - enable JMX in minutes'/><author><name>Java Blues</name><uri>http://www.blogger.com/profile/02681848616646299865</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17257251674584604362'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_C5USrHsffkE/RzIPFAyJBUI/AAAAAAAADYg/9rqMhv3gLD4/s72-c/JConsoleSna1.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5385959266567928702.post-4039031116670841131</id><published>2007-10-24T15:04:00.001-07:00</published><updated>2007-10-24T15:04:56.803-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Circular Reference'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='Bean'/><title type='text'>Bean Definition Tip1: Avoid Circular Reference</title><content type='html'>&lt;p&gt;Spring is a really powerful framework, which is not only providing the JEE similar or much better and lighter container services, but also providing a straightforward declarative and configuration driven bean definition model. With the flexibility and capability of bean definition mechanism, especially when you unleashing the power of XML schema based context file introduced since Spring 2.0, you can almost do any sorts of bean wiring, parameter configuration, application assembling tasks. After you use it, I bet you will forget all the unpleasant and cumbersome JEE configuration files and the coarse grained Enterprise Beans. However, when dealing with bean definitions, it's still very tricky and the similar problems probably happen as in your traditional programmatic approach.&lt;/p&gt;  &lt;p&gt;One typical problem is that the bean definition circular referencing. This is the circumstance under which there are beans relying on each others instance before they could be instantiated by Spring container. &lt;/p&gt;  &lt;p&gt;For below example:&lt;/p&gt;  &lt;table border="0" cellpadding="2" cellspacing="0" width="683"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="681"&gt;         &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;public class BeanA {               &lt;br /&gt;    BeanB b;                &lt;br /&gt;    public BeanA(BeanB beanB){                &lt;br /&gt;        b = beanB;                &lt;br /&gt;    }                &lt;br /&gt;    public void print(String s) {                &lt;br /&gt;        System.out.print(s);                &lt;br /&gt;    }                &lt;br /&gt;    public void foo(){                &lt;br /&gt;        b.foo();                &lt;br /&gt;    }                &lt;br /&gt;}&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;public class BeanB {               &lt;br /&gt;    private BeanA a;                &lt;br /&gt;    public BeanB(BeanA beanA){                &lt;br /&gt;        a = beanA;                &lt;br /&gt;    } &lt;/em&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;    public void print(String s){               &lt;br /&gt;        a.print(s);                &lt;br /&gt;    } &lt;/em&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;    public void foo() {               &lt;br /&gt;        System.out.print("foo!");                &lt;br /&gt;    }                &lt;br /&gt;}&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;public class TestStub {               &lt;br /&gt;    public static void main(String[] args){                &lt;br /&gt;        AbstractApplicationContext ctxt= new ClassPathXmlApplicationContext("beandef.xml");                &lt;br /&gt;    }                &lt;br /&gt;}&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;...bean definitions in beandef.xml ...&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="color:#000080;"&gt;&lt;span style="font-size:85%;"&gt;&lt;em&gt;    &amp;lt;bean id="beanA" class="BeanA"&amp;gt;                 &lt;br /&gt;        &amp;lt;constructor-arg ref="beanB" /&amp;gt;                  &lt;br /&gt;    &amp;lt;/bean&amp;gt;                  &lt;br /&gt;    &amp;lt;bean id="beanB" class="BeanB"&amp;gt;                  &lt;br /&gt;        &amp;lt;constructor-arg ref="beanA"/&amp;gt;                  &lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;/em&gt;&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;When you run TestStub, it will show following exception (pay attention to the underline):&lt;/p&gt;  &lt;table border="0" cellpadding="2" cellspacing="0" width="683"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="681"&gt;         &lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;em&gt;Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'beanA' defined in class path resource [beandef.xml]: Cannot resolve reference to bean 'beanB' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'beanB' defined in class path resource [beandef.xml]: Cannot resolve reference to bean 'beanA' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'beanA':&lt;/em&gt; &lt;em&gt;&lt;u&gt;&lt;span style="color:#000080;"&gt;Requested bean is currently in creation:&lt;/span&gt;&lt;/u&gt;&lt;/em&gt; &lt;em&gt;&lt;span style="color:#000080;"&gt;&lt;u&gt;Is there an unresolvable circular reference&lt;/u&gt;&lt;/span&gt;?                &lt;br /&gt;Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'beanB' defined in class path resource [beandef.xml]: Cannot resolve reference to bean 'beanA' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'beanA': Requested bean is currently in creation: Is there an unresolvable circular reference?&lt;br /&gt;Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'beanA': &lt;u&gt;&lt;span style="color:#000080;"&gt;Requested bean is currently in creation:&lt;/span&gt;&lt;/u&gt; &lt;span style="color:#000080;"&gt;Is there an unresolvable circular reference?&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;It's a simple sample of bean circular reference. Specifically, the container tried to instantiate "beanA" first, then it found "beanA" need a reference of "beanB" as constructor argument; subsequently, it tried to create an instance of "BeanB" as "beanB", but this time the "beanB" need a "beanA" instance as a constructor reference argument that is still creation pending waiting for "beanB". This situation confused the container and it can not resolve all the bean references. Then it came the complains of exception. This circular reference problem was caused by circular references of bean by means of &lt;u&gt;Constructor Injection&lt;/u&gt;.&lt;/p&gt;  &lt;p&gt;To solve this issue, one option is that replace constructor reference to "beanA" of "beanB" with a setter injection.  Then the container will not try to create the "beanB" with the "beanB" reference at same time. Instead, it will defer this by injecting the "beanA" reference latter on via "setter" method of "BeanB" after the "beanA" has been created. The same changes happen to "BeanA". It needs some tweaks to the code and bean definitions as well.&lt;/p&gt;  &lt;table border="0" cellpadding="2" cellspacing="0" width="690"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="688"&gt;         &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;public class BeanA {              &lt;br /&gt;    BeanB b;               &lt;br /&gt;    public BeanA(){               &lt;br /&gt;    }               &lt;br /&gt;    public void setBeanB(BeanB b){               &lt;br /&gt;        this.b = b;               &lt;br /&gt;    }               &lt;br /&gt;    public void print(String s) {               &lt;br /&gt;        System.out.print(s);               &lt;br /&gt;    }               &lt;br /&gt;    public void foo(){               &lt;br /&gt;        b.foo();               &lt;br /&gt;    }               &lt;br /&gt;}&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;         &lt;br /&gt;         &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;public class BeanB {              &lt;br /&gt;    private BeanA a;               &lt;br /&gt;    public BeanB(){               &lt;br /&gt;    } &lt;/em&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;    public void setBeanA(BeanA a){              &lt;br /&gt;        this.a = a;               &lt;br /&gt;    }               &lt;br /&gt;    public void print(String s){               &lt;br /&gt;        a.print(s);               &lt;br /&gt;    } &lt;/em&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;    public void foo() {              &lt;br /&gt;        System.out.print("foo!");               &lt;br /&gt;    }               &lt;br /&gt;}&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;         &lt;br /&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;...            &lt;br /&gt;&lt;/em&gt;&lt;/span&gt;          &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;&amp;lt;bean id="beanA" class="BeanA"&amp;gt;              &lt;br /&gt;    &amp;lt;property name="beanB" ref="beanB"/&amp;gt;               &lt;br /&gt;&amp;lt;/bean&amp;gt;               &lt;br /&gt;&amp;lt;bean id="beanB" class="BeanB"&amp;gt;               &lt;br /&gt;    &amp;lt;property name="beanA" ref="beanA"/&amp;gt;               &lt;br /&gt;&amp;lt;/bean&amp;gt; &lt;/em&gt;&lt;/span&gt;&lt;/p&gt;         &lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;...&lt;/em&gt;&lt;/span&gt;         &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;This time, the Sping was very happy to create all the beans. &lt;/p&gt;  &lt;p&gt;An alternative option is still workable for this case but a lit bit tricky related with bean instantiating order. We can ask "beanA" injected "beanB" by setter, whereas "beanB" can still use the constructor injection. But wait, the order of bean definition is very important. You can not let constructor injected "beanB" defined before setter injected "beanA".&lt;/p&gt;  &lt;table border="0" cellpadding="2" cellspacing="0" width="692"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="690"&gt;         &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;public class BeanA {              &lt;br /&gt;    BeanB b;               &lt;br /&gt;    public BeanA(){               &lt;br /&gt;    }               &lt;br /&gt;    public void setBeanB(BeanB b){               &lt;br /&gt;        this.b = b;               &lt;br /&gt;    }               &lt;br /&gt;    public void print(String s) {               &lt;br /&gt;        System.out.print(s);               &lt;br /&gt;    }               &lt;br /&gt;    public void foo(){               &lt;br /&gt;        b.foo();               &lt;br /&gt;    }               &lt;br /&gt;}&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;public class BeanB {              &lt;br /&gt;    private BeanA a;               &lt;br /&gt;   public BeanB(BeanA a){               &lt;br /&gt;        this.a = a;               &lt;br /&gt;    } &lt;/em&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;    public void print(String s){              &lt;br /&gt;        a.print(s);               &lt;br /&gt;    } &lt;/em&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;    public void foo() {              &lt;br /&gt;        System.out.print("foo!");               &lt;br /&gt;    }               &lt;br /&gt;}&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&lt;em&gt;...&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000080;"&gt;&lt;em&gt;&lt;span style="font-size:85%;color:#000080;"&gt;&amp;lt;bean id="beanA" class="BeanA"&amp;gt;                  &lt;br /&gt;    &amp;lt;property name="beanB" ref="beanB"/&amp;gt;                   &lt;br /&gt;&amp;lt;/bean&amp;gt;                   &lt;br /&gt;&lt;/span&gt;&amp;lt;bean id="beanB" class="BeanB"&amp;gt;                 &lt;br /&gt;    &amp;lt;constructor-arg ref="beanA"/&amp;gt;                 &lt;br /&gt;&amp;lt;/bean&amp;gt; &lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000080;"&gt;&lt;em&gt;...                &lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;This works very well. If you move the "beanB" definition before "beanA", it will not work because the "beanA" will need a creating "beanB".&lt;/p&gt;  &lt;p&gt;In a nutshell, the circular reference problem is very typical for a sophisticated "Spring" application if you did not cook it very well. It will cost you time to debug and fix it. But not just that. Because the nature of configuration driven of "Spring", the same bean definition file itself could have huge chances to be manipulated by different personnel, thus, more chances of introducing new errors regarding the "Spring" competency level. I will talk about in future sessions how to address this issue by establishing your project or organization level bean definition schema extended from "Spring" base schema. In this way, it mandates some of important project wise constraints for bean definition, such as available tags, bean types, data types etc. Thus, it could reduce some errors caused by arbitrary string parameters or typos in bean definition files for your project.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;It's strongly recommended to use setter injection for bean wiring and bean reference injection&lt;/strong&gt;. If it's very necessary to do constructor based reference injection, and unfortunately involved with circular reference, please well comment or document the bean definition and put notices for future maintaining people. You don't just want someone else happened to ruin your whole fragile bean constructor injection hierarchy someday, do you?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5385959266567928702-4039031116670841131?l=bluesjava.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluesjava.blogspot.com/feeds/4039031116670841131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5385959266567928702&amp;postID=4039031116670841131' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5385959266567928702/posts/default/4039031116670841131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5385959266567928702/posts/default/4039031116670841131'/><link rel='alternate' type='text/html' href='http://bluesjava.blogspot.com/2007/10/bean-definition-tip1-avoid-circular.html' title='Bean Definition Tip1: Avoid Circular Reference'/><author><name>Java Blues</name><uri>http://www.blogger.com/profile/02681848616646299865</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17257251674584604362'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>