关于spring + ejb进行组合的一些疑问
最近一个项目需要将spring与EJB结合,这种行为在一些人的眼里看来是不够地道的做法,不过我目前的确是需要spring这样一种支持。先讲讲我的理解吧。
要对stateless session bean进行很好的封装,在创建这个session bena的时候就不是以往继承SessionBean,而是必须继承AbstractEnterpriseBean,并实现onCreate方法,为什么要继承这个bean呢?
通过查看源代码我们可以得知,该abstract类主要做了一件事情,就是是加载ear-jar.xml中的环境变量参数:
<env-entry>
<env-entry-name>ejb/BeanFactoryPath</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>myComponent-ejb-beans.xml</env-entry-value>
</env-entry>
这个参数是一个jndi的设置,告诉客户端的spring framework,必须加载myComponent-ejb-beans.xml这样的一个xml配置文件来生产我们所需要的bean实例。
从而我们可以得出这样一个结论:spring framework所需要的ApplicationContext配置信息是放在将要发布到应用服务器上的EJB组件描述符中的。这是不是spring所谓的侵入性呢?我不知道,希望spring高手能给我答案^_^。从这里我似乎得出了一个答案,spring 在解除业务逻辑层与表现层之间的耦合,对外尽可能封装复杂实现的时候,在渐渐的加强了spring framework与ejb之间的耦合性,比如实现spring封装的抽象类,在部署描述符中附带配置信息。我不知道这个是不是可以避免呢?
这样做还有一个不好的地方就是,如果某人要用这个EJB组件,并且中间使用spring作为控制层。就必须做一个该EJB部署描述符中指定的文件路径名,比如上面的myComponent-ejb-beans.xml,否则没法用。同时也强制部署描述符必须带有一个环境变量来指明客户端bean factory的application context配置文件路径,由此我们可以看出spring在与ejb结合的时候不仅是在充当控制层的角色,而是在强制ejb必须按照他的要求来做某些事情。这里表现出来的就是两点,一个是继承spring提供的抽象类,另一个就是在部署描述符中设置spring控制层的bean factory配置文件路径名。