煤层喷射将被删除?

时间:2010-01-18 12:00:12

标签: java jsf seam

Jacob Orshalick(Seam框架的作者:体验Java EE的演变)说:

  

Outjection允许您从当前上下文中获取变量,以便通过EL进行注入或访问。如果您想要松散地耦合注入相同上下文变量的几个组件(如当前用户,正在预订的酒店等),这将非常有用。如果你想避免注射,另一种方法是使用@Factory方法或通过以下方式将值直接设置到上下文中:Contexts.getConversationContext()。set(“myVarName”,myVar)

     

另一个好处是表现。通过向上下文中输出值,您可以绕过必须通过组件来获取该值。这特别适用于带有JSF的数据表(参见本讨论)。但是,正如您将在讨论中看到的那样,您还可以使用@BypassInterceptors来实现相同的好处。

     

出局确实是一种便利,但通过其他方式肯定可以实现同样的好处。请注意,Web Bean中不包含outjection,并且在Seam 3中将被弃用或完全删除,因此这是进一步的理由在可能的情况下避免使用。

我们有一个有大量注射的应用程序,我们已经开始摆脱它们。他说:

  但是,通过其他手段肯定可以获得同样的好处。

但这些是其他手段吗?如何删除注射?例如,在ASP.NET中,您有会话变量。在Seam中,您可以在会话中输出var(在某些情况下是一种好处)。

或页面范围:(例如在jsf循环中,多次调用辅助bean(有时)。你有一个从accountId页面参数加载的帐户。你可以加载帐户,用页面范围输出它你可以大大地使用它的属性。或者(为了避免被拒绝)是有一个loadAccount()方法,你可以在需要的时候从数据库中获取帐户......最糟糕的!)

我不这么认为:

Contexts.getConversationContext().set("myVarName", myVar)

是一种如何避免注射的方法。

这只会调用保存已截取变量的相同上下文,并以深刻的方式修改它(我认为这正是@Out在后台执行的操作)。

问题1:您认为他们的意图是什么?您是否有关于如何替换它的具体信息?

问题2:你如何避免使用注射?

提前致谢。

2 个答案:

答案 0 :(得分:5)

我认为你可以通过使用@Factory实现“outjection”的最佳方式。它的优点:

  • 可以@注入另一个组件
  • 它可以创建任何值,而不仅仅是组件实例
  • 计算一次,只计算一次
  • 它可以由JSF页面触发(我不确定您是否必须启用Seam Transaction Management才能获得此功能)

因此,如果您有一个需要多次访问@Factory的JSF页面,它只计算一次。如果每次请求时都需要计算一个值,那么您需要一个@Unwrap方法。例如,#{currentDate}内置组件实现如下

@Name("org.jboss.seam.faces.facesContext")
@Scope(ScopeType.STATELESS) // ScopeType.STATELESS is similar to Spring prototype scope
public class CurrentDate {
    @Unwrap
    public Date getCurrentDate() {
        return new java.sql.Date(System.currentTimeMillis());
    }
}

的问候,

答案 1 :(得分:3)

为避免被拒绝,只需在辅助bean中的字段中添加一个getter,而不是:

@Name("myBean")
public class MyBean{
    @Out
    private SomeBean someBean;

}

你将拥有:

@Name("myBean")
public class MyBean{
    private SomeBean someBean;

    public SomeBean getSomeBean(){
         return someBean;
    }
}

并且在你的xhtml / jsp文件中你将不得不调用getter但是这也有一些问题因为每次你调用getter时所有的Seam Intercept都会应用于那个调用,所以你可能需要添加@BypassInterceptors来防止这种情况发生。

是的,我也认为

Contexts.getConversationContext().set("myVarName", myVar)

只是手动执行outject所做的事情。