﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-yuyee-随笔分类-IOC</title><link>http://www.blogjava.net/yuyee/category/46859.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 06 Dec 2010 13:47:07 GMT</lastBuildDate><pubDate>Mon, 06 Dec 2010 13:47:07 GMT</pubDate><ttl>60</ttl><item><title>IOC初始化和互相引用解决</title><link>http://www.blogjava.net/yuyee/archive/2010/11/10/337731.html</link><dc:creator>羔羊</dc:creator><author>羔羊</author><pubDate>Wed, 10 Nov 2010 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/yuyee/archive/2010/11/10/337731.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 观察IOC中容器初始化某个Bean顺序，现先一个JAVABean类，看看控制台输出：package&nbsp;com.google.aop.exception.ioc;import&nbsp;org.springframework.beans.BeansException;import&nbsp;org.springframework.beans.factory.BeanFactory...&nbsp;&nbsp;<a href='http://www.blogjava.net/yuyee/archive/2010/11/10/337731.html'>阅读全文</a><img src ="http://www.blogjava.net/yuyee/aggbug/337731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuyee/" target="_blank">羔羊</a> 2010-11-10 16:27 <a href="http://www.blogjava.net/yuyee/archive/2010/11/10/337731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IOC监管Bean</title><link>http://www.blogjava.net/yuyee/archive/2010/11/03/337154.html</link><dc:creator>羔羊</dc:creator><author>羔羊</author><pubDate>Wed, 03 Nov 2010 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/yuyee/archive/2010/11/03/337154.html</guid><description><![CDATA[<div>
<p style="line-height: 25px; text-indent: 0em; color: #008800; font-family: Georgia; font-size: 14px; letter-spacing: 1px; ">1.<font face="Courier New" style="line-height: normal; ">InitializingBean接口，在初始化Bean时容器会调用前者的<tt class="methodname" style="line-height: normal; "><font face="新宋体" style="line-height: normal; ">afterPropertiesSet()</font></tt>方法</font></p>
<p style="line-height: 25px; text-indent: 0em; color: #008800; font-family: Georgia; font-size: 14px; letter-spacing: 1px; ">2.<font face="Courier New" style="line-height: normal; ">DisposableBean接口，在析构Bean时容器会调用destroy()方法</font></p>
<p style="line-height: 25px; text-indent: 0em; color: #008800; font-family: Georgia; font-size: 14px; letter-spacing: 1px; ">3.<font face="Courier New" style="line-height: normal; ">BeanFactoryAware接口，当它被BeanFactory创建后，它会拥有一个指向创建它的BeanFactory的引用</font></p>
<p style="line-height: 25px; text-indent: 0em; color: #008800; font-family: Georgia; font-size: 14px; letter-spacing: 1px; ">4.BeanPostProcessor接口，这个接口两个方法，postProcessBeforeInitialization(Object bean, String beanName)和postProcessAfterInitialization(Object bean, String beanName) 在其他Bean构造前后执行</p>
<p style="line-height: 25px; text-indent: 0em; color: #008800; font-family: Georgia; font-size: 14px; letter-spacing: 1px; ">5.BeanFactoryPostProcessor接口，Spring IoC容器允许BeanFactoryPostProcessor<font color="#ff6600" style="line-height: normal; ">在容器实际实例化任何其它的bean之前</font>读取配置元数据，并有可能修改它</p>
</div>
<div>
<div>package com.google.springioctest;</div>
<div><br />
</div>
<div>import org.springframework.beans.BeansException;</div>
<div>import org.springframework.beans.factory.BeanFactory;</div>
<div>import org.springframework.beans.factory.BeanFactoryAware;</div>
<div>import org.springframework.beans.factory.DisposableBean;</div>
<div>import org.springframework.beans.factory.InitializingBean;</div>
<div>import org.springframework.beans.factory.config.BeanFactoryPostProcessor;</div>
<div>import org.springframework.beans.factory.config.BeanPostProcessor;</div>
<div>import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;</div>
<div><br />
</div>
<div>public class A implements BeanPostProcessor, InitializingBean,</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>BeanFactoryAware, BeanFactoryPostProcessor,DisposableBean {</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public A() {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class A");</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>private void init(){</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class A init");</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>@Override</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public void afterPropertiesSet() throws Exception {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>// TODO Auto-generated method stub</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class A afterPropertiesSet()");</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>@Override</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public void destroy() throws Exception {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class A destroy()");</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>@Override</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public void setBeanFactory(BeanFactory beanFactory) throws BeansException {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>// TODO Auto-generated method stub</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class A setBeanFactory()");</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>@Override</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public Object postProcessAfterInitialization(Object bean, String beanName)</div>
<div><span class="Apple-tab-span" style="white-space:pre">			</span>throws BeansException {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class A postProcessAfterInitialization");</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>return null;</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>@Override</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public Object postProcessBeforeInitialization(Object bean, String beanName)</div>
<div><span class="Apple-tab-span" style="white-space:pre">			</span>throws BeansException {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>// TODO Auto-generated method stub</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class A postProcessBeforeInitialization");</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>return null;</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span></div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span> @Override</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span> public void postProcessBeanFactory(</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span> ConfigurableListableBeanFactory beanFactory) throws BeansException {</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span> // TODO Auto-generated method stub</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span> System.out.println("Class A postProcessBeanFactory");</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span> }</div>
<div><br />
</div>
<div>}</div>
</div>
<div>执行结果：</div>
<div>
<div>Class A</div>
<div>Class A setBeanFactory()</div>
<div>Class A afterPropertiesSet()</div>
<div>Class A init</div>
<div>Class A postProcessBeanFactory</div>
</div>
<div>创建一个B类，由A来监管B类，B实现&nbsp;InitializingBean,BeanFactoryAware,BeanFactoryPostProcessor</div>
<div>
<div>package com.google.springioctest;</div>
<div><br />
</div>
<div>import org.springframework.beans.BeansException;</div>
<div>import org.springframework.beans.factory.BeanFactory;</div>
<div>import org.springframework.beans.factory.BeanFactoryAware;</div>
<div>import org.springframework.beans.factory.DisposableBean;</div>
<div>import org.springframework.beans.factory.InitializingBean;</div>
<div>import org.springframework.beans.factory.config.BeanFactoryPostProcessor;</div>
<div>import org.springframework.beans.factory.config.BeanPostProcessor;</div>
<div>import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;</div>
<div><br />
</div>
<div>public class B implements InitializingBean, BeanFactoryAware,</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>BeanFactoryPostProcessor {</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public B() {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class B");</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public void init() {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class B init");</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>@Override</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public void afterPropertiesSet() throws Exception {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class B afterPropertiesSet");</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>@Override</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public void setBeanFactory(BeanFactory beanFactory) throws BeansException {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class B beanFactory");</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>@Override</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public void postProcessBeanFactory(</div>
<div><span class="Apple-tab-span" style="white-space:pre">			</span>ConfigurableListableBeanFactory beanFactory) throws BeansException {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>// TODO Auto-generated method stub</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class B postProcessBeanFactory");</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div>}</div>
</div>
<div>执行结果：</div>
<div>
<div>Class A</div>
<div>Class A setBeanFactory()</div>
<div>Class A afterPropertiesSet()</div>
<div>Class A init</div>
<div>Class B</div>
<div>Class B beanFactory</div>
<div>Class B afterPropertiesSet</div>
<div>Class B init</div>
<div>Class A postProcessBeanFactory</div>
<div>Class B postProcessBeanFactory</div>
</div>
<div><br />
</div>
<div>可以看出A并没有监管B类，也就是没调用BeanPostProcessor这个接口的2个方法</div>
<div>再来去掉B上的BeanFactoryPostProcessor接口</div>
<div>
<div>package com.google.springioctest;</div>
<div><br />
</div>
<div>import org.springframework.beans.BeansException;</div>
<div>import org.springframework.beans.factory.BeanFactory;</div>
<div>import org.springframework.beans.factory.BeanFactoryAware;</div>
<div>import org.springframework.beans.factory.DisposableBean;</div>
<div>import org.springframework.beans.factory.InitializingBean;</div>
<div>import org.springframework.beans.factory.config.BeanFactoryPostProcessor;</div>
<div>import org.springframework.beans.factory.config.BeanPostProcessor;</div>
<div>import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;</div>
<div><br />
</div>
<div>public class B implements InitializingBean,</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>BeanFactoryAware{</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public B() {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class B");</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public void init() {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class B init");</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>@Override</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public void afterPropertiesSet() throws Exception {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class B afterPropertiesSet");</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>@Override</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public void setBeanFactory(BeanFactory beanFactory) throws BeansException {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class B beanFactory");</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>public void postProcessBeanFactory(</div>
<div><span class="Apple-tab-span" style="white-space:pre">			</span>ConfigurableListableBeanFactory beanFactory) throws BeansException {</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>// TODO Auto-generated method stub</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>System.out.println("Class B postProcessBeanFactory");</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div>
<div><br />
</div>
<div><br />
</div>
<div>}</div>
</div>
<div>执行输出：Class A</div>
<div>Class A setBeanFactory()</div>
<div>Class A afterPropertiesSet()</div>
<div>Class A init</div>
<div>Class A postProcessBeanFactory</div>
<div>2010-11-3 21:33:31 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons</div>
<div>信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@8916a2: defining beans [A,B]; root of factory hierarchy</div>
<div>Class B</div>
<div>Class B beanFactory</div>
<div>Class A postProcessBeforeInitialization</div>
<div>2010-11-3 21:33:31 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons</div>
<div>信息: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@8916a2: defining beans [A,B]; root of factory hierarchy</div>
<div>Class A destroy()</div>
<div>Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'B' defined in class path resource [icoContext.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at java.security.AccessController.doPrivileged(Native Method)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.context.support.ClassPathXmlApplicationContext.&lt;init&gt;(ClassPathXmlApplicationContext.java:139)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.context.support.ClassPathXmlApplicationContext.&lt;init&gt;(ClassPathXmlApplicationContext.java:83)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at com.google.springioctest.Test.main(Test.java:8)</div>
<div>Caused by: java.lang.NullPointerException</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1393)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1375)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>... 15 more</div>
<div>抛异常了。。。。。</div>
<div>原因是A类里的postProcessBeforeInitialization，postProcessAfterInitialization2个方法没有返回bean,修改下</div>
<div>执行输出：</div>
<div>
<div>Class A</div>
<div>Class A setBeanFactory()</div>
<div>Class A afterPropertiesSet()</div>
<div>Class A init</div>
<div>Class A postProcessBeanFactory</div>
<div>2010-11-3 21:37:10 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons</div>
<div>信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1193779: defining beans [A,B]; root of factory hierarchy</div>
<div>Class B</div>
<div>Class B beanFactory</div>
<div>Class A postProcessBeforeInitialization</div>
<div>Class B afterPropertiesSet</div>
<div>Class B init</div>
<div>Class A postProcessAfterInitialization</div>
<div>在B类被初始化之后，也就是调用afterPropertiesSet之前那段时间，属性初始化完成后，进行了回调，控制B类</div>
</div>
<div><br />
</div>
<div>注意:在写被监控的Bean的时候，不能实现BeanFactoryPostProcessor这个接口,没看源码，其实也不知道是什么原因，哈哈，只能硬记了</div>
<div><br />
</div>
<div>
<div>
</div>
</div>
<img src ="http://www.blogjava.net/yuyee/aggbug/337154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuyee/" target="_blank">羔羊</a> 2010-11-03 17:04 <a href="http://www.blogjava.net/yuyee/archive/2010/11/03/337154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>