好吧,这个问题会得到很多反对...
我刚刚看到这个问题,其中一个人面临一些关于 spring xml beanfactory 的问题。
我想了解为什么会这样:
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="namingStrategy">
<ref bean="namingStrategy"/>
</property>
<property name="mappingResources">
<list>
<!--<value>genericdaotest/domain/Person.hbm.xml</value>-->
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
</props>
</property>
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
无论如何应该比这更好:
public class BeanFactory {
public LocalSessionFactoryBean getSessionFactory() {
LocalSessionFactoryBean bean = new LocalSessionFactoryBean();
bean.setNamingStrategy(getNamingStrategy());
bean.setMappingResources(Arrays.asList(getPerson());
bean.setHibernateProperties(new Properties() {{
setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
setProperty("hibernate.show_sql", "true")
setProperty("hibernate.hbm2ddl.auto", "create");
}});
bean.setDataSource(getDataSource());
return bean;
}
}
它更短,更容易理解,它没有 Spring 怪癖,它不需要运行外部库(可能会与其他库发生冲突),它是可逐步调试的,它是“可单元测试的,它没有”不需要反射,它具有 OOP 的潜在好处,从 IDE 中重构更容易,它在编译时进行类型检查,它是 Java - 而不是 xml - 并且不需要在运行时解析,当它编译时你已经知道它形式上是正确的(并且不会在运行时发现异常),如果您需要外部化某些配置参数,则使用属性文件(将包含真实配置)。
最重要的是:我的代码中不需要一个名为“BeanFactory”的巨大单例类,它的职责是实例化各种对象(例如与 IoC 原则无关的巨大而丑陋的服务定位器)。
所以,问题是:
为什么我应该更喜欢创建一个巨大的 XML 而不是创建我的对象来用 Java 组合和聚合它们?