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:你如何避免使用注射?提前致谢。
答案 0 :(得分:5)
我认为你可以通过使用@Factory实现“outjection”的最佳方式。它的优点:
因此,如果您有一个需要多次访问@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所做的事情。