上下文依赖注入 CDI 教程
fmms
13年前
<div class="BlogContent TextContent"> <div> 1、简介 </div> <div> <br /> </div> <div> CDI - Context Dependency Injection 上下文依赖注入:Java EE 6中定义的规范标准,编号: <a href="/misc/goto?guid=4959500165916592732" target="_blank">JSR-299</a>。定义了一系列简化Java开发的功能。CDI已经超出一个框架的定义,升华到一种开发模型。这个开发模型不会去限制你必须将代码分为几层,不限制你必须写ORM、持久化、业务代码等,甚至不限制你到底是开发WEB程序还是客户端程序。 </div> <div> <br /> </div> <div> CDI的思想来源于几个开源项目:Seam、Guice、Spring However。不过CDI在集合了这几个框架的有点之外,克服了各自的缺点。 </div> <div> <br /> </div> <div> CDI只是一个标准( <a href="/misc/goto?guid=4959500166008338067" target="_blank">Java Community Process - JCP</a>),不是一个具体的框架,不同的应用服务器有其自己的实现,比如JBoss AS的CDI名叫Weld。 </div> <div> <br /> </div> <div> 2、注入 </div> <div> <br /> </div> <div> 既然名称叫做上下文依赖注入,那么首先看看到底是怎么注入的。 </div> <div> <br /> </div> <div> · 往哪里注入(3种) </div> <div> <pre class="brush:java; toolbar: true; auto-links: false;">public class Checkout { private final ShoppingCart cart; @Inject public Checkout(ShoppingCart cart) { this.cart = cart; } }</pre> <p></p> ↑ 注入到构造方法。一个类只能有一个注入的构造方法 </div> <div> <pre class="brush:java; toolbar: true; auto-links: false;">public class Checkout { private ShoppingCart cart; @Inject void setShoppingCart(ShoppingCart cart) { this.cart = cart; } }</pre> <p></p> <pre class="brush:java; toolbar: true; auto-links: false;">public class Checkout { private @Inject ShoppingCart cart; }</pre> <p></p> ↑ 注入到类属性。不需要getter与setter! </div> <div> <br /> </div> <div> · 注入的顺序: </div> <div> 1)构造方法 </div> <div> 2)类属性 </div> <div> 3)方法注入 </div> <div> 4)@PostConstruct </div> <div> <br /> </div> <div> 3、会话范围 </div> <div> 1)@RequestScoped </div> <div> 2)@SessionScoped </div> <div> 3)@ApplicationScoped </div> <div> 4)@ConversationScoped </div> <div> 前三种可以在任何servlet中使用,conversation只能在JSF中使用。 </div> </div>