@Component public class MyBeanFactory implements BeanFactoryAware { private static MyBeanFactory myBeanFactory; private static BeanFactory beanFactory; //回调方法 public void setBeanFactory(BeanFactory factory) throws BeansException { // TODO Auto-generated method stub this.beanFactory = factory; System.out.println("==>>>>setBeanFactory<<<<<<=="); } public BeanFactory getBeanFactory() { return beanFactory; } public static MyBeanFactory getInstance(){ if(myBeanFactory==null){ myBeanFactory = (MyBeanFactory) beanFactory.getBean("myBeanFactory"); } return myBeanFactory; } public static Object getBean(String beanName){ return beanFactory.getBean(beanName); } public static Object getBean(String beanName, Class clazz){ return beanFactory.getBean(beanName, clazz); } }
<!-- 属性文件读入 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath*:jdbc.properties</value> </list> </property> </bean> <!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入。此处应该缩小范围,以加快速度。 --> <context:component-scan base-package="com.perlin" /> <!-- dsPrototype只是作为一个原型或模板,不要在配置文件或Annotation中引用它! --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" lazy-init="true" scope="prototype"> <property name="driverClass"><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> <!-- 事务管理器配置,单数据源事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="myBeanFactory" class="com.perlin.dao.MyBeanFactory"></bean>
以上是我自定义Bean实现BeanFactoryAware接口,以及applicationContext.xml的配置,但是ioc容器启动之后,我调用MyBeanFactory的getInstance()方法,发现beanFactory为空,直接调用getBean(String beanName)方法也是一样。不知为何?哪位高手给我解答下,我纠结了好几天了。。。