>>>>
JdbcDAO是遵循J2EE设计模式的DAO模式,参考Petstored的Category DAO模式,DAO调用方式是: EJB(SKSB) + DAO + JDBC/Hibernate
所以jdbcDAO是被EJB调用的,注意jdbcDAO这段代码中的servicelocator是从哪里导入的,如果我没有记错,应该是 xxx.xxx.xx.ejb.servicelocator。
也就是说,Datasource的Name是EJB的reference name,而reference name是指向数据源的JNDI,JNDI再指向具体数据库。
J2EE就是通过这样的松耦合来实现了解耦。
<<<<
前面关于相机的那段比喻,我确实存在误解。
至于你说得
JdbcDAO是遵循J2EE设计模式的DAO模式,参考Petstored的Category DAO模式,DAO调用方式是: EJB(SKSB) + DAO + JDBC/Hibernate
所以jdbcDAO是被EJB调用的,注意jdbcDAO这段代码中的servicelocator是从哪里导入的,如果我没有记错,应该是 xxx.xxx.xx.ejb.servicelocator。
也就是说,Datasource的Name是EJB的reference name,而reference name是指向数据源的JNDI,JNDI再指向具体数据库。
J2EE就是通过这样的松耦合来实现了解耦。
我还是存有异议,既然你使用了PicoContainer,为何不将解耦进行到底呢?
既然你的JDon 框架很大一部分为了EJB而建立,为何不将PicoContainer作为彻底将你的业务逻辑层 和 EJB/别的J2EE容器解耦的中间层呢? 这样的话,无论对于测试还是部署都有巨大的好处。
针对你说的JDBC DAO,因为在你的源代码中,我找不到你的这些类,我只能就着我的思维发表一点拙见:
可以参考Spring,用一个JndiObjectFactoryBean专门处理JNDI类的引用,下面给出一个转贴以示说明:
<!-- 通过jndi的方式来调用datasource,即使不一定是在j2ee环境中也可以正常使用
默认情况下,如果没有指定,"java:comp/env/"将放在后面jndi名称前面 -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"><value>jdbc/myDatasource</value></property>
<!-- 如果你不想使用 'java:comp/env/'前缀的话请设置下面的值为true, 默认值为false -->
<property name="resourceRef"><value>true</value></property>
<property name="jndiEnvironment">
<props>
<!-- The value of Context.PROVIDER_URL -->
<prop key="java.naming.provider.url">t3://localhost:7001</prop>
<prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
</props>
</property>
</bean>
而你 的 jdbcDAO可以这样写:
public JdbcDAO() {
}
public void setDataSource(DataSource ds){
dataSource=ds;
}
public DataSource getDataSource(){
return dataSource;
}
...
}
你的JDon 配置文件中可以类似这样定义:
<jdbcDAO>
<dataSource ref="dataSource" />
....
</jdbcDAO>
如果datasource是自定义的,则只需要这样配置:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"><value>org.hsqldb.jdbcDriver</value></property>
<property name="url"><value>jdbc:hsqldb:data/jert_web_test</value></property>
<property name="username"><value>sa</value></property>
<property name="password"><value></value></property>
</bean>
既然你的设计使用了IOC的概念,并且采用了PicoContainer为微核心,那么有什么理由不使用IOC呢?