CDI是JavaEE 6的一部分,这是一个巨大的进步。 现在,有一个标准告诉供应商和开发人员如何进行DI。 它可以完善,但是仍然在这里。 恕我直言,规范和标准在任何行业都是一件好事。 但是,我不同意某些人的观点,这意味着春天的终结。 这里有多个DI框架,Spring是第一名。
这是为什么? 因为是第一个? 不是(看看阿瓦隆 )。 我认为这是因为Spring的DI机制只是其功能的一部分。 当然,这很好,但Guice和现在的CDI提供了相同的功能。 Spring真正与众不同的地方是它的JavaEE API和基于DI的市场上最好的组件的集成。
这个附加值的一个很好的例子是JMS:如果您曾经尝试过将其发布到队列中,那么您就会明白我的意思。 这是您需要编写的代码类型:
Contextcontext=newInitialContext();
QueueConnectionFactoryqueueConnectionFactory=(QueueConnectionFactory)context.lookup("myQConnectionFactory");
Queuequeue=(Queue)context.lookup("myQueue");
QueueConnectionqueueConnection=queueConnectionFactory.createQueueConnection();
QueueSessionqueueSession=queueConnection.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
QueueSenderqueueSender=queueSession.createSender(queue);
TextMessagemessage=queueSession.createTextMessage();
message.setText("Hello world!");
queueSender.send(message);
现在在Spring中,其配置如下:
<jee:jndi-lookupid="queueConnectionFactory"jndi-name="myQConnectionFactory"/>
<jee:jndi-lookupid="q"jndi-name="myQueue"/>
<beanid="jmsTemplate">
<propertyname="connectionFactory"ref="jmsQueueConnectionFactory"/>
<propertyname="defaultDestination"ref="q"/>
</bean>
我不在乎它是否是较短的事件(但是它缺少发送文本的代码)。 我也不在乎XML。 我的真正兴趣是减少代码编写:减少错误,减少错误,减少测试代码。 我不必编写样板代码,因为Spring已经处理了它。 当然,我必须进行配置,但是与代码相比,这很容易。
对于JMS来说确实如此,但是对于Hibernate,EclipseLink,iBatis,JPA,JDO,Quartz,Groovy,JRuby,JUnit,TestNG,JasperReports,Velocity,FreeMarker,JSF而言,这都是最好的(或者至少是同类产品)在其类别的顶部)。 Morevover,如果没有合适的解决方案,Spring会提供:在Spring Batch中查看一个很好的框架示例,该框架处理无聊和重复的代码,让您专注于业务代码。
Guice或其他框架是否包含此类集成功能? 不,它们是纯的,“无污染的” DI框架。 这样,它们可以很容易地被CDI取代,Spring不需要太多。