上下文依赖注入 CDI 教程

fmms 12年前
     <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>