学习JNDI时的一点感受。

关于JNDI,较为学术向的解释:

1
2
3
4
J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。
JNDI 在 J2EE 中的角色就是“交换机” —— J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。
在多数情况下,提供 JNDI 供应者的容器可以充当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性。
在 J2EE 中,JNDI 是把 J2EE 应用程序合在一起的粘合剂,但还没有紧到无法让人很容易地把它们分开并重新装配。

在IBM DeveloperWork我看到了这样一个例子:
https://www.ibm.com/developerworks/cn/java/j-jndi/index.html

大致的内容就是,Dolly在编写JDBC程序时,将数据库驱动、连接池的数量等写死在程序中。
实际部署时,情况发生了变化,但是程序却很难修改。

文章中还提到,J2EE 规范把职责委托给多个开发角色:编写程序的人,打包为程序包的人,部署人员和运维人员。
(实际开发中,1、2的活经常一个人干,3、4则另一个人干, 就是我们熟悉的程序员和运维。)

J2EE中定义了JNDI规范,它的一个最简单的实例,上述例子中也有给出:

1
2
3
4
5
6
<resource-ref>
<description>Dollys DataSource</description>
<res-ref-name>jdbc/mydatasource</res-ref-name>
<res-ref-type>javax.sql.DataSource</res-ref-type>
<res-auth>Container</res-auth>
</resource-ref>

这是一段写在web.xml中的代码,它的作用是构建一个数据源:

1
java:comp/env/jdbc/mydatasource

以便在稍后的编码中使用它。

在查找参考资料时,我见到过一些早期的加载Spring框架的applicationcontext.xml的办法,就是在web.xml中用类似手段定义好一个资源,初始化Spring时,把它作为参数传入进去。

在培训班学习时,我一度认为J2EE是简陋的、原生的、被淘汰的技术。
在我的了解中,现在没有人直接用JSP、Servlet、JDBC开发Web应用,取而代之的是SpringMVC,分层开发,开源框架。
web.xml的作用仅仅是配置拦截器,以及初始化Spring容器,而JDBC和JPA早已不见踪影,EJB也仅仅存在于各种数年前的文档中。

在看完这篇文章后,我发现之前的认识过于浅薄。
J2EE并不是只有Servlet和JSP,EJB实际上是一套类似Spring的IOC/DI容器,它甚至也有AOP的功能。
JNDI接口就是一个用于解耦的规范,将部署人员和运维人员才需要配置的东西独立出去。上文中1和2只需要在程序内定义JNDI格式的数据源,而3和4根据文档配置这个数据源就能使用了。

那么问题来了,为什么Java会有同人逼死官方的现象出现呢……

学习JNDI时的一点感受。

http://blog.mothership.top/posts/3003bb92.html

作者

Mother Ship

发布于

2017-06-29

更新于

2023-02-13

许可协议

评论