我注意到有不同的bean范围,如:
@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped
Run Code Online (Sandbox Code Playgroud)
每个人的目的是什么?如何为我的bean选择合适的范围?
我是Spring Framework的新手,我一直在玩它并将一些示例应用程序放在一起,以便评估Spring MVC以用于即将到来的公司项目.到目前为止,我非常喜欢我在Spring MVC中看到的内容,看起来非常容易使用,并鼓励您编写非常适合单元测试的类.
就像练习一样,我正在为我的一个示例/测试项目编写一个主要方法.我不清楚的一件事是BeanFactory
和之间的确切差异ApplicationContext
- 适合在哪些条件下使用?
我理解ApplicationContext
扩展BeanFactory
,但如果我只是编写一个简单的主方法,我是否需要ApplicationContext
提供额外的功能?究竟是什么类型的额外功能ApplicationContext
提供了?
除了回答"我应该在main()方法中使用哪个"之外,对于在这种情况下我应该使用哪种实现,是否有任何标准或指南?我的main()方法是否应该依赖于bean /应用程序配置以XML格式编写 - 这是一个安全的假设,还是我将用户锁定为特定的东西?
这个答案是否会在网络环境中发生变化 - 如果我的任何课程需要了解Spring,他们是否更有可能需要ApplicationContext
?
谢谢你的帮助.我知道很多这些问题可能在参考手册中得到了解答,但是我很难找到这两个界面的明确细分以及每个界面的优点/缺点而不通过精细梳齿阅读手册.
当尝试在EL中引用托管bean时#{bean.entity.property}
,有时会javax.el.PropertyNotFoundException: Target Unreachable
抛出异常,通常是在设置bean属性时,或者要调用bean操作时.
似乎有五种不同的消息:
这些都意味着什么?它们是如何引起的,它们应该如何解决?
我正在尝试编写一个自定义servlet(用于AJAX/JSON),我想在其中引用我@ManagedBeans
的名字.我希望能够映射:
http://host/app/myBean/myProperty
至:
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
Run Code Online (Sandbox Code Playgroud)
是否可以从常规servlet中按名称加载bean?是否有我可以使用的JSF servlet或帮助程序?
我似乎被春天宠坏了,这一切都太明显了.
定义View Params之间有什么区别:
<f:metadata>
<f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
并在ManagedBean中定义属性,如下所示:
@ManagedProperty(value = "#{param.id}")
private Integer id;
Run Code Online (Sandbox Code Playgroud) 我在几个论坛中遇到了"托管bean"和"支持bean"的术语.很多人认为两者都是一样的.但是,似乎有一点点差异.任何人都可以帮助我理解这两个术语之间的确切区别吗?
在JSF 2.0应用程序中使会话无效的最佳方法是什么?我知道JSF本身不会处理会话.到目前为止我能找到
private void reset() {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
.getExternalContext().getSession(false);
session.invalidate();
}
Run Code Online (Sandbox Code Playgroud)
@SessionScoped
UserBean处理用户的登录注销.我在同一个bean中有这个方法.现在,当我reset()
完成必要的数据库更新后调用该方法时,我当前的会话作用域bean会发生什么?既然豆本身也存放在HttpSession
?有没有办法在加载页面时执行JSF托管bean操作?
如果那是相关的,我现在正在使用JSF 1.2.
我知道托管bean的工作方式类似于控制器,因为您唯一的任务是将视图层与模型"链接"起来.
要使用bean作为托管bean,我必须声明@ManagedBean
注释,这样做我可以直接与bean通信JSF.
如果我想在这个managedBean中注入一些组件(来自Spring),我有两种可能的方法:
在ManagedBean中选择属性(如"BasicDAO dao")并@ManagedProperty(#{"basicDAO"})
在属性上方声明.这样做,我"basicDAO"
在ManagedBean中从Spring 注入bean .
在ManagedBean Class中声明了@Controller,然后我将拥有@ManagedBean
和@Controller
注释一起.在物业中"BasicDAO dao"
我必须使用@Autowired
Spring.
我的理解是否正确?
我认为有两种通用方法可以获得一个自动创建的CDI托管bean实例BeanManager
,只需要一个Bean<T>
开始(基于它创建Class<T>
):
通过BeanManager#getReference()
,更经常以片段形式显示:
Bean<TestBean> bean = (Bean<TestBean>) beanManager.resolve(beanManager.getBeans(TestBean.class));
TestBean testBean1 = (TestBean) beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean));
Run Code Online (Sandbox Code Playgroud)通过Context#get()
,在片段中不常显示:
Bean<TestBean> bean = (Bean<TestBean>) beanManager.resolve(beanManager.getBeans(TestBean.class));
TestBean testBean2 = beanManager.getContext(bean.getScope()).get(bean, beanManager.createCreationalContext(bean));
Run Code Online (Sandbox Code Playgroud)实际上,它们最终完全相同:返回对当前CDI托管bean实例的代理引用,并自动创建bean实例(如果范围中尚不存在).
但是他们做的有点不同:BeanManager#getReference()
总是创建一个全新的代理实例,而Context#get()
如果之前已经创建过,则重用现有的代理实例.当在现有TestBean
实例的action方法中执行上述代码时,这是显而易见的:
System.out.println(testBean1 == testBean2); // false
System.out.println(testBean1 == this); // false
System.out.println(testBean2 == this); // true
Run Code Online (Sandbox Code Playgroud)
该的javadoc的Context#get()
是非常明确的在此:
返回某个上下文类型的现有实例,或通过调用Contextual.create(CreationalContext)创建一个新实例并返回新实例.
而javadoc中的BeanManager#getReference()
不够明确在此:
获得某个bean和bean的某个bean类型的上下文引用.
这让我感到困惑.你什么时候使用这一个?对于这两种方式,无论如何都需要一个Bean<T>
实例,bean类和bean范围随时可用,这是额外的参数.我无法想象为什么在这种特殊情况下他们需要外部供应.
我可以想象这Context#get()
是更高效的内存,因为它不会不必要地创建引用同一个底层bean实例的另一个代理实例,而只是查找并重用现有的代理实例.
这让我想到了以下问题:什么时候BeanManager#getReference() …
managed-bean ×10
jsf ×7
jsf-2 ×4
cdi ×2
spring ×2
action ×1
el ×1
httpsession ×1
integration ×1
java-ee ×1
javabeans ×1
onload ×1
scope ×1
servlets ×1
session ×1
viewparams ×1