在Spring的applicationContext.xml中配置
<jee:jndi-lookup id="main_mysql_no_ax" jndi-name="java:comp/env/jdbc/main_mysql_no_ax" />
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="main_mysql_no_ax" />
</bean>
web.xml配置
<resource-ref>
<description>main_mysql_no_ax</description>
<res-ref-name>jdbc/main_mysql_no_ax</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
当Web服务器启动时会去检索Web容器总的JNDI资源名,正常情况下资源会被配置在服务器下的server.xml或者context.xml中
<Resource name="jdbc/main_mysql_no_ax"
auth="Container"
type="javax.sql.DataSource"
testOnBorrow="true"
validationQuery="select 1"
poolSize="10"
minPoolSize="0"
maxPoolSize="100"
maxIdleTime="120"
maxActive="100"
maxIdle="5"
maxWait="10000"
username="jtuser"
password="one&Zero.2012"
driverClassName="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"
url="jdbc:mysql://192.168.2.27:3306/jingtiao2?noAccessToProcedureBodies=true&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull"/>
<Context docBase="D:\Company Item\jt-search-product\WebRoot" path="/search" reloadable="false"
workDir="D:\apache-tomcat-7.0.22\work\Catalina\localhost\search">
<ResourceLink name="jdbc/main_mysql_no_ax" global="jdbc/main_mysql_no_ax" type="javax.sql.DataSource" />
</Context>
该资源会被加载放入到Web容器中,在项目配置文件中声明数据源Bean时,采用jee:jndi-lookup会在Web容器中查找该资源名称,并转化为数据源bean
采用JNDI配置是全局数据源配置方式,适用于一个服务器下的多个web项目共同使用此数据源配置,而配置在单独的某个Web工程中时,则只能被此Web工程独自享用,
不具有共享性。
在传统的J2EE应用中,JNDI用来访问一系列不同的资源,例如EJB和JMS的链接工厂,Spring使用JndiTemplate提供了一个框架来简化进行JNDI查找所需的代码,而Spring还提
供使用JndiObjectFactoryBean来自动执行依赖注入,这是一个FactoryBean的实现。他允许资源利用依赖注入来绑定到JNDI。
访问JNDI中资源的三种方式:第一种不使用任何spring提供的类,仅仅是一个传统的查找,第二种通过手动查找使用JndiTemplate类,最后一种采用JndiObjectFactoryBean
来自动执行依赖注入。
第一种:创建一个InitialContext的实例,通过lookup()方法查找那个资源,当在应用服务器中执行操作不需要InitialContext设置任何参数环境,但是在应用服务器之外使用
JNDI的时候,这个就是必须的。
第二种:JndiTemplate和第一种差不多,创建一个JndiTemplate的实例,调用它的lookup()方法,JndiTemplate有一个获取回调(callback)功能上的好处,JndiTemplate
定义一个execute()方法来接收一个JndiCallback的实例,例如lookup实际上就是使用execute()方法,
第三种:JndiObjectFactoryBean,它扮演了JNDI查找和Spring依赖注入之间的适配器,借助Spring的配置文件将需要的属性信息进行注入。
区别,前两者需要编写代码去JNDI查找,而后者则是通过Spring的JndiObjectFactoryBean将结果通过配置文件注入到需要的代码中。