﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-血色浪漫-随笔分类-Weld</title><link>http://www.blogjava.net/FORRogue/category/50924.html</link><description>我会微笑着面对一切，但是与快乐无关！</description><language>zh-cn</language><lastBuildDate>Mon, 14 May 2012 18:57:00 GMT</lastBuildDate><pubDate>Mon, 14 May 2012 18:57:00 GMT</pubDate><ttl>60</ttl><item><title>JEE6 Weld Extension</title><link>http://www.blogjava.net/FORRogue/archive/2012/03/15/371984.html</link><dc:creator>Rogue</dc:creator><author>Rogue</author><pubDate>Thu, 15 Mar 2012 15:20:00 GMT</pubDate><guid>http://www.blogjava.net/FORRogue/archive/2012/03/15/371984.html</guid><wfw:comment>http://www.blogjava.net/FORRogue/comments/371984.html</wfw:comment><comments>http://www.blogjava.net/FORRogue/archive/2012/03/15/371984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/FORRogue/comments/commentRss/371984.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/FORRogue/services/trackbacks/371984.html</trackback:ping><description><![CDATA[<h2 style="background-color: #cccccc; "><span style="color: purple; ">Weld Extended 扩展接口</span></h2>
&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">Weld 为我们提供了一个接口 Extendsion 来方便我们对Weld进行扩展，比如来整合工作流，整合其他框架技术，或者实现一个基于weld新框架，就像Seam3.<br />
</span>&nbsp; &nbsp;&nbsp;<br />
&nbsp; &nbsp;&nbsp;<font size="2">我们利用 Extension 接口到底能做哪些事？</font><br />
<ul>
     <li><span style="font-size: 10pt; ">对注入某一个Bean时进行拦截，包括注入前、初始化话这个Bean之前之后、摧毁这个Bean之前</span></li>
     <li><span style="font-size: small; ">让一个不能注入的Bean，可以实现注入。（不过基本所有的Bean都是可以注入的）</span></li>
     <li><font size="2">动态添加、修改注解<br />
     </font></li>
     <li><font size="2">其他我还不知道的作用</font></li>
</ul>
<h2 style="background-color: #cccccc; "><span style="color: purple; ">实现一个Extension</span></h2>
&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">实现一个Extension是通过是对Weld 容器生命周期事件进行监听实现。Weld 中通过 Event + @Oberves 就可以实现对一个时间的监听。
<br />
</span>
&nbsp; &nbsp;&nbsp;<br />
&nbsp; &nbsp; <span style="font-family: 'Lucida Console'; color: #9900ff; ">Weld 生命周期事件：
</span><span style="font-family: 'Lucida Console'; color: #9999ff; ">
<ul>
     <li>BeforeBeanDiscovery
     </li>
     <li>ProcessAnnotatedType
     </li>
     <li>ProcessInjectionTarget and ProcessProducer
     </li>
     <li>ProcessBean and ProcessObserverMethod
     </li>
     <li>AfterBeanDiscovery
     </li>
     <li>AfterDeploymentValidation
     </li>
</ul>
</span>
&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">首先，我们需要写一个 Extension 的实现类。里面对某一个事件监听就可以了。<br />
</span>&nbsp; &nbsp;&nbsp;<span style="background-color: #eeeeee; font-size: 13px; color: #0000ff; ">class</span><span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;MyExtension&nbsp;</span><span style="background-color: #eeeeee; font-size: 13px; color: #0000ff; ">implements</span><span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;Extension&nbsp;{&nbsp;</span><img src="http://www.blogjava.net/Images/dot.gif" style="background-color: #eeeeee; font-size: 13px; " alt="" /><span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;}</span><br />
&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">然后，我们需要在META-INF/</span>services&nbsp;<span style="font-size: 10pt; ">目录下，建一个名叫</span><span style="font-size: 10pt; font-family: 'Lucida Console'; ">javax.enterprise.inject.spi.Extension 文件，在这里文件里面写上我们的实现类。<br />
</span><span style="font-family: 'Lucida Console'; font-size: 10pt; color: #cc6666; ">&nbsp; &nbsp;&nbsp;</span><span style="font-family: 'Lucida Console'; font-size: 10pt; color: #cc6666; ">org.mydomain.extension.MyExtension</span><br />
&nbsp; &nbsp;&nbsp;<br />
&nbsp; &nbsp; 下面给出一个对 CRUDService 接口的注入的监听：<br />
&nbsp; &nbsp;&nbsp;
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">
<div><span style="color: #0000ff; ">public</span>&nbsp;<span style="color: #0000ff; ">class</span>&nbsp;ExtensionTest&nbsp;<span style="color: #0000ff; ">implements</span>&nbsp;Extension&nbsp;{&nbsp;</div>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;processInjectionTarget(@Observes&nbsp;ProcessInjectionTarget&lt;CURDService&gt;&nbsp;pit)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;InjectionTarget&lt;CURDService&gt;&nbsp;it&nbsp;=&nbsp;pit.getInjectionTarget();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AnnotatedType&lt;CURDService&gt;&nbsp;at&nbsp;=&nbsp;pit.getAnnotatedType();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("processInjectionTarget");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InjectionTarget&lt;CURDService&gt;&nbsp;wrapped&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;InjectionTarget&lt;CURDService&gt;()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;inject(CURDService&nbsp;instance,&nbsp;CreationalContext&lt;CURDService&gt;&nbsp;ctx)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it.inject(instance,&nbsp;ctx);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("instance&nbsp;inject");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;dispose(CURDService&nbsp;x)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("instance&nbsp;dispose");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it.dispose(x);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Set&lt;InjectionPoint&gt;&nbsp;getInjectionPoints()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("get&nbsp;injectpoints");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;it.getInjectionPoints();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;CURDService&nbsp;produce(CreationalContext&lt;CURDService&gt;&nbsp;ctx)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("produce&nbsp;creationalcontext");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;it.produce(ctx);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;postConstruct(CURDService&nbsp;x)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("post&nbsp;instance&nbsp;construct");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it.postConstruct(x);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;preDestroy(CURDService&nbsp;x)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("pre&nbsp;instance&nbsp;destroy");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it.preDestroy(x);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pit.setInjectionTarget(wrapped);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</div>
<br />
<span style="font-size: 12pt; color: #cc6666; ">这样我们就可以对注入这个类的一些行为进行拦截。通过Extension，我们可以做很多很多事，实现AOP面向切面，这样自己可以实现安全机制，在Bean范围开启事务等等</span><span style="font-size: 12pt; ">
<br /></span><span style="font-size: 10pt; "><br /></span><span style="font-family: 'Lucida Console'; color: #cc99ff; ">看好JEE6 CDI，为JEE6 时代的到来做准备吧。。。</span><span style="font-size: 10pt; "><br />
<br /></span><img src ="http://www.blogjava.net/FORRogue/aggbug/371984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/FORRogue/" target="_blank">Rogue</a> 2012-03-15 23:20 <a href="http://www.blogjava.net/FORRogue/archive/2012/03/15/371984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java EE6 Weld(1): 上下文、依赖注入和限定词</title><link>http://www.blogjava.net/FORRogue/archive/2012/02/23/370600.html</link><dc:creator>Rogue</dc:creator><author>Rogue</author><pubDate>Thu, 23 Feb 2012 15:26:00 GMT</pubDate><guid>http://www.blogjava.net/FORRogue/archive/2012/02/23/370600.html</guid><wfw:comment>http://www.blogjava.net/FORRogue/comments/370600.html</wfw:comment><comments>http://www.blogjava.net/FORRogue/archive/2012/02/23/370600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/FORRogue/comments/commentRss/370600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/FORRogue/services/trackbacks/370600.html</trackback:ping><description><![CDATA[<h2><span style="font-size: 14pt; color: #993366; "><strong>&nbsp;一、Weld简介</strong></span></h2>&nbsp; &nbsp; <span style="font-size: 10pt; font-family: Tahoma; ">Java EE 6.0 的核心：JSR-299规范，</span><span style="background-color: #ffffff; color: #333333; line-height: 20px; text-align: left; font-size: 10pt; font-family: Tahoma; ">提供了如下功能：</span><br /><br /><div><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; text-align: left; background-color: #ffffff; "><font color="#333333" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; ">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><span style="font-size: 13px; line-height: 20px; color: #333333; font-family: Tahoma; ">1. 类型安全的依赖注入</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /><font color="#333333" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; ">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><span style="font-size: 13px; line-height: 20px; color: #333333; font-family: Tahoma; ">2. 注入对象的上下文生存周期管理</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /><font color="#333333" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; ">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><span style="font-size: 13px; line-height: 20px; color: #333333; font-family: Tahoma; ">3. 事件提醒模型</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /><font color="#333333" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; ">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><span style="font-size: 13px; line-height: 20px; color: #333333; font-family: Tahoma; ">4. 绑定拦截器通过用户自定义的注解（Annotation）</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /><font color="#333333" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; ">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><span style="font-size: 13px; line-height: 20px; color: #333333; font-family: Tahoma; ">5. 类型安全的装饰器</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /><font color="#333333" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; ">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><span style="font-size: 13px; line-height: 20px; color: #333333; font-family: Tahoma; ">6. 为整合第三方框架提供了完整的 SPI 支持</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /><font color="#333333" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; ">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><span style="font-size: 13px; line-height: 20px; color: #333333; font-family: Tahoma; ">7. 与 JSF，Servlet / JSP 进行了整合</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /><font color="#333333" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; ">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><span style="font-size: 13px; line-height: 20px; color: #333333; font-family: Tahoma; ">8. 对 JSF 提供长会话（Conversation）上下文支持<br /><br /></span><font color="#333333" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; ">&nbsp; &nbsp;&nbsp;Weld 是一个实现了 JSR-299 的框架。主要由JBoss完成其实现，项目主页：</font><a href="http://www.seamframework.org/Weld" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; color: #333333; ">http://www.seamframework.org/Weld</a><font color="#333333" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; ">&nbsp;。最新发布了 &nbsp;Weld 2.0.0.Alpha1 版本。</font><br /><br /><font color="#333333" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; ">&nbsp; &nbsp; Weld 工程的搭建是非常简单的, 这里介绍一下 Weld+JSF 在 Tomcat 7.x 中的工程搭建的方法：</font><br /><font color="#333333" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; ">&nbsp; &nbsp; 1）通过Eclipse 直接建立一个 Dynamic Web Project , Runtime 选择 tomcat7 , Servlet 版本选择3.0 。</font><br /><font color="#333333" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; ">&nbsp; &nbsp; 2）添加所需jar文件：由于 tomcat 是非 jee容器，所以要加入 &nbsp;weld-servlet.jar 。 &nbsp; 还有JSF 的 &nbsp;jsf-api.jar &nbsp;, jsf-imp.jar &nbsp;和 jstl-1.2.jar&nbsp;</font><br /><font color="#333333" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; "><span style="font-size: 10pt; ">&nbsp; &nbsp; 3）在web.xml 添加监听器来启动weld</span></font><br /><font color="#333333" style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; ">&nbsp; &nbsp;&nbsp;</font><span style="font-family: Verdana, sans-serif, 宋体; line-height: 20px; background-color: #eeeeee; font-size: 10pt; ">&lt;</span><span style="font-family: Verdana, sans-serif, 宋体; line-height: 20px; background-color: #eeeeee; font-size: 10pt; ">listener</span><span style="font-family: Verdana, sans-serif, 宋体; line-height: 20px; background-color: #eeeeee; font-size: 10pt; ">&gt;</span></p><div style="font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 20px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-size: 10pt; ">&lt;</span><span style="color: #000000; font-size: 10pt; ">listener</span><span style="color: #000000; font-size: 10pt; ">-</span><span style="color: #0000ff; font-size: 10pt; ">class</span><span style="color: #000000; font-size: 10pt; ">&gt;</span><span style="color: #000000; font-size: 10pt; ">org.jboss.weld.environment.servlet.Listener</span><span style="color: #000000; font-size: 10pt; ">&lt;/</span><span style="color: #000000; font-size: 10pt; ">listener</span><span style="color: #000000; font-size: 10pt; ">-</span><span style="color: #0000ff; font-size: 10pt; ">class</span><span style="color: #000000; font-size: 10pt; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-size: 10pt; ">&lt;/</span><span style="color: #000000; font-size: 10pt; ">listener</span><span style="color: #000000; font-size: 10pt; ">&gt;</span></div><font face="Verdana, sans-serif, 宋体" size="2"><span style="line-height: 20px; font-size: 10pt; ">&nbsp; &nbsp; 4）在META-INF下，添加context.xml 为tom</span><span style="line-height: 20px; font-family: Tahoma; font-size: 10pt; ">cat</span></font><span style="color: #333333; line-height: 26px; font-family: Tahoma; font-size: 10pt; ">容器JNDI绑定 BeanManager。</span>&nbsp;<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #0000ff; font-size: 10pt; ">&lt;</span><span style="color: #800000; font-size: 10pt; ">Context</span><span style="color: #0000ff; font-size: 10pt; ">&gt;</span>&nbsp;<br /><span style="color: #0000ff; font-size: 10pt; ">&nbsp; &nbsp;&lt;</span><span style="color: #800000; font-size: 10pt; ">Manager&nbsp;</span><span style="color: #ff0000; font-size: 10pt; ">pathname</span><span style="color: #0000ff; font-size: 10pt; ">=""</span><span style="color: #0000ff; font-size: 10pt; ">/&gt;</span>&nbsp;<span style="color: #008000; font-size: 10pt; ">&lt;!--</span><span style="color: #008000; font-size: 10pt; ">&nbsp;disables&nbsp;storage&nbsp;of&nbsp;sessions&nbsp;across&nbsp;restarts&nbsp;</span><span style="color: #008000; font-size: 10pt; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-size: 10pt; ">&lt;</span><span style="color: #800000; font-size: 10pt; ">Resource&nbsp;</span><span style="color: #ff0000; font-size: 10pt; ">name</span><span style="color: #0000ff; font-size: 10pt; ">="BeanManager"</span><span style="color: #FF0000; "><br /></span><span style="color: #ff0000; font-size: 10pt; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auth</span><span style="color: #0000ff; font-size: 10pt; ">="Container"</span><span style="color: #FF0000; "><br /></span><span style="color: #ff0000; font-size: 10pt; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #0000ff; font-size: 10pt; ">="javax.enterprise.inject.spi.BeanManager"</span><span style="color: #FF0000; "><br /></span><span style="color: #ff0000; font-size: 10pt; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory</span><span style="color: #0000ff; font-size: 10pt; ">="org.jboss.weld.resources.ManagerObjectFactory"</span><span style="color: #0000ff; font-size: 10pt; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;<span style="color: #008000; font-size: 10pt; ">&lt;!--</span><span style="color: #008000; font-size: 10pt; ">&nbsp;Uncomment&nbsp;to&nbsp;enable&nbsp;injection&nbsp;into&nbsp;Servlet&nbsp;</span><span style="color: #008000; font-size: 10pt; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;<span style="color: #008000; font-size: 10pt; ">&lt;!--</span><span style="color: #008000; font-size: 10pt; ">&nbsp;&lt;Listener&nbsp;className="org.jboss.weld.environment.tomcat.WeldLifecycleListener"/&gt;&nbsp;</span><span style="color: #008000; font-size: 10pt; ">--&gt;</span><br /><span style="color: #0000ff; font-size: 10pt; ">&lt;/</span><span style="color: #800000; font-size: 10pt; ">Context</span><span style="color: #0000ff; font-size: 10pt; ">&gt;</span></div><span style="font-size: 10pt; ">&nbsp; &nbsp; 5）在web.xml中，声明注册这个绑定<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp;<span style="color: #0000ff; font-size: 10pt; ">&lt;</span><span style="color: #800000; font-size: 10pt; ">resource-env-ref</span><span style="color: #0000ff; font-size: 10pt; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-size: 10pt; ">&lt;</span><span style="color: #800000; font-size: 10pt; ">description</span><span style="color: #0000ff; font-size: 10pt; ">&gt;</span><span style="font-size: 10pt; ">Object&nbsp;factory&nbsp;for&nbsp;the&nbsp;CDI&nbsp;Bean&nbsp;Manager</span><span style="color: #0000ff; font-size: 10pt; ">&lt;/</span><span style="color: #800000; font-size: 10pt; ">description</span><span style="color: #0000ff; font-size: 10pt; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-size: 10pt; ">&lt;</span><span style="color: #800000; font-size: 10pt; ">resource-env-ref-name</span><span style="color: #0000ff; font-size: 10pt; ">&gt;</span><span style="font-size: 10pt; ">BeanManager</span><span style="color: #0000ff; font-size: 10pt; ">&lt;/</span><span style="color: #800000; font-size: 10pt; ">resource-env-ref-name</span><span style="color: #0000ff; font-size: 10pt; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-size: 10pt; ">&lt;</span><span style="color: #800000; font-size: 10pt; ">resource-env-ref-type</span><span style="color: #0000ff; font-size: 10pt; ">&gt;</span><span style="font-size: 10pt; ">javax.enterprise.inject.spi.BeanManager</span><span style="color: #0000ff; font-size: 10pt; ">&lt;/</span><span style="color: #800000; font-size: 10pt; ">resource-env-ref-type</span><span style="color: #0000ff; font-size: 10pt; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-size: 10pt; ">&lt;/</span><span style="color: #800000; font-size: 10pt; ">resource-env-ref</span><span style="color: #0000ff; font-size: 10pt; ">&gt;</span></div><span style="font-size: 10pt; ">&nbsp; &nbsp; 6）在WEB-INF下面，放一个空的bean.xml</span><span style="font-size: 10pt; "><br /><br /></span>&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">在非jee6 或者 非servlet容器下，都需要这样配置的。在Jboss as7中就要简单的多，只需要加入 cdi-api.jar 跟一个 bean.xml &nbsp;其他的地方就是jsf的一些配置。</span><span style="font-size: 10pt; "><br /><br /></span>&nbsp; &nbsp;&nbsp;<p>&nbsp;</p><h2><span style="font-size: 18pt; font-family: Arial; color: #993366; "><strong>二、上下文(Context)</strong></span></h2>&nbsp; &nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 10pt; ">Weld 中有5个上下文范围的容器：Request、Session、Application、Dependent 和 Conversation。前面3个就不再介绍了，他们的注解分别为@RequestScoped @SessionScoped @ApplicationScoped 。JSR299中参照了Seam，加入了一个新的会话范围 Conversation<br /></span><span style="font-size: 18pt; font-family: Arial; color: #993366; "><strong>&nbsp; &nbsp;</strong><span style="font-size: 10pt; color: #000000; "><strong>@Dependent &nbsp;</strong>默认范围，所有没有定义的上下文范围的Class或者Interface 具有这个默认的注解。用EL表达式每次应用一个Dependent范围的bean容器都会重新实例化一个。所以不要用EL应用Dependent范围的bean。每次注入这个范围的bean的时候，容器都会new一个新的实例给注入点。<br /></span></span>&nbsp; &nbsp; <strong style="font-size: 10pt; ">@Conversation </strong><span style="font-size: 10pt; ">可以叫它对话范围，它的范围比Request大，一个Conversation里面可以包含多个Request，比Session范围小。 需要注意的一点，Conversation范围和Session范围的bean会被持久化到你的磁盘上，从而节省你的内存，所以在使用这两个范围的bean的时候需要实现序列化接口(Serializable)。<br /></span>&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">在实际应用中，Conversation一般用于使用多个页面来做一件事情，相关的对象不会丢失。但是，Conversation范围并不是它的对象放在Session中，只是在HttpSession这个对象中存放了一个id。<br /></span>&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">Conversation 可以分为短对话和长对话两种情况。对于一般的Conversation，它的持续时间是跟Request一样的，并没有太大的区别。下面的方式就可以把一个短对话变成长对话。<br /></span><p>&nbsp;</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;@Inject<br /><span style="color: #008080; ">2</span>&nbsp;Conversation&nbsp;conversation;<br /><span style="color: #008080; ">3</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;start(){<br /><span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conversation.start();<br /><span style="color: #008080; ">5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conversation.setTimeout(30000);<span style="color: #008000; ">//</span><span style="color: #008000; ">5分钟，默认10分钟</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">6</span>&nbsp;<span style="color: #008000; "></span>}</div>&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; "><br /><br /></span><h2><span style="color: #993366; font-size: 18pt; "><strong>三、依赖注入 @Inject</strong></span></h2>&nbsp; &nbsp;&nbsp;<span style="color: #000000; font-size: 10pt; ">JSR299 借鉴了现在很流行的依赖注入，自己通过注解也实现了依赖注入，无需像Spring那么多的配置文件。<br /><br /></span>&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; font-family: Tahoma; ">weld 的三个注入点：<br /></span>&nbsp; &nbsp; &nbsp; &nbsp; <span style="font-size: 10pt; ">1.&nbsp;</span><span style="font-family: Tahoma; font-size: 10pt; ">构造方法参数：如果在一个bean的构造函数上加上@Inject注解，那么它的参数都是通过依赖注入传入的。也可以把@Inject放在形参的前面。<br /></span>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">2. 初始化方法参数：如果一个方法上有@Inject注解，它不是构造函数的话，上面这中情况，那么这个方法就是 </span><span style="font-size: 10pt; "><strong><font color="#ff9900">初始化方法 </font>&nbsp;</strong>。初始化方法总是会在构造函数之后执行，注入他的参数。<br /></span>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">3. 类属性<span style="font-size: 10pt; ">: 这也是最常用的一种方法，类似与seam2中 @in 。<br /><br /></span></span>&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">下面分别给出这3中情况的例子<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Inject<br /><span style="color: #0000FF; ">public</span>&nbsp;HelloAction(CurrentUser&nbsp;user){<br />}</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Inject<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sayHello(CurrentUser&nbsp;user){<br />&nbsp;&nbsp;&nbsp;System.out.println("Hello,&nbsp;"+user.getName());<br />}</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Inject<br />Logger&nbsp;logger;</div><span style="font-size: 18pt; font-family: Arial; color: #993366; "><br /></span><h2><span style="font-size: 18pt; font-family: Arial; color: #993366; ">四、限定词 @Qualifier</span></h2>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp; &nbsp;&nbsp;&nbsp;<span style="font-size: 10pt; ">我们一般在注入service层的bean的时候，一般会直接注入一个接口，而不是它的实现类。</span><span style="font-size: 10pt; ">限定词的作用主要用于区分一个接口的不同实现。</span><br />&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">weld 中有两个默认的限定词 @Default 和 @Any： &nbsp;<br /></span>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">@Default &nbsp;： 默认限定词，如果一个注入点没指定特定的限定词，那么它就默认使用@Default这个限定词。<br /></span>&nbsp; &nbsp; &nbsp; &nbsp; <span style="font-size: 10pt; ">@Any： 如果你一个接口有多个实现类，不同的实现类你使用了不同的限定词来区分，那么 @Any 就可以修饰所有的实现。</span><span style="font-size: 18pt; font-family: Arial; color: #993366; "><br /></span>&nbsp; &nbsp;<span style="font-size: 10pt; ">一般情况，</span><span style="font-size: 10pt; ">需要我们自己定义个注解：<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Qualifier<br />@Retention(RetentionPolicy.RUNTIME)<br />@Target(ElementType.TYPE,Element.METHOD,ElementType.FIEID,ElementType.PARAMENTER)<br /><span style="color: #0000FF; ">public</span>&nbsp;@<span style="color: #0000FF; ">interface</span>&nbsp;Morning{}</div>&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">@Qualifier 说明这个新定义的注解是一个限定词。<br /></span>&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">@Retention 表明这个注解什么时候作用，一般都是写 RUNTIME<br /></span>&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">@Target 表明这个注解可以在什么地方使用，上面的定义分别是 类名上，方法上，属性，参数<br /></span>&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; "><br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Inject&nbsp;@Morning&nbsp;HelloAction&nbsp;helloAction;</div><span style="font-size: 10pt; "><br /></span>&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">如果一个接口有很多个实现类的话，我们也不需要为每个实现类定义一个注解。我们可以给一个注解加个参数，通过这个参数来指定注入哪个实现类。&nbsp;<br /></span><span style="font-size: 10pt; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 10pt; ">只需要在个实现类之前加上这个限定词，那么在注入这个接口的时候，就会自动注入这个实现类了。</span>&nbsp; &nbsp;<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><div>@Morning</div><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MorningHelloAction&nbsp;Implements&nbsp;HelloAction{<br />&nbsp; &nbsp; ...<br />}</div>&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">一个bean如果实现了多个接口，那么只要添加多个限定词就可以了。<br /></span>&nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">使用了限定词，这样在使用一个接口的时候，我现在不需要关心这个接口实现类的类名，只要你的实现类加了这个限定词，在注入的时候就会自动找到这个类注入进来。这样可以大大的降低了耦合性。</span><span style="font-size: 18pt; font-family: Arial; color: #993366; "><br /><br /><br /></span><p>&nbsp;</p></div><img src ="http://www.blogjava.net/FORRogue/aggbug/370600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/FORRogue/" target="_blank">Rogue</a> 2012-02-23 23:26 <a href="http://www.blogjava.net/FORRogue/archive/2012/02/23/370600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>