关于Spring Ioc的一个有趣实现

在Spring集成Hibernate的时候,发现一个有趣的现象:

在书写的配置文件中,有:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
	<property name="dataSource" ref="dataSource" />
	<property name="hibernateProperties">
		<props>
			<prop key="hibernate.dialect">${hibernate.dialect}</prop>
			<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
			<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
		</props>
	</property>
	<property name="configLocation" value="classpath:config/hibernate.cfg.xml" />
</bean>

但是在LocalSessionFactoryBean中并没有configLocation的属性,反倒有一个configLocations的文件,属性类型为Array,

private Resource[] configLocations;

在好奇Spring如何注入的时候,发现在configLocationsset方法有两个:

    public void setConfigLocation(Resource configLocation) {
        this.configLocations = new Resource[]{configLocation};
    }

    public void setConfigLocations(Resource[] configLocations) {
        this.configLocations = configLocations;
    }

对比源码和IDEA生成的UML图可以得知,编译器默认也有一个configLocation属性:

关于Spring Ioc的一个有趣实现_第1张图片

关于Spring Ioc的一个有趣实现_第2张图片


总结:Spring的Ioc机制构建bean的时候,Spring也先并不知道LocalSessionFactoryBean类中有configLocation属性;通过反射,拿到configLocation属性名称,拼接该属性的set方法为setConfigLocation(),正好,有此方法,所以调用该方法,正好赋值给了configLocations。

所以造成了有LocalSessionFactoryBean类中有configLocation的错觉。

你可能感兴趣的:(关于Spring Ioc的一个有趣实现)