- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的代码:
Spring 配置:
package biz.tugay;
/* User: koray@tugay.biz Date: 25/12/15 Time: 19:30 */
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "biz.tugay")
public class SpringConfiguration {
}
富:
package biz.tugay;
/* User: koray@tugay.biz Date: 25/12/15 Time: 19:36 */
public interface Foo {
String getState();
}
FooImpl:
package biz.tugay;
/* User: koray@tugay.biz Date: 25/12/15 Time: 19:31 */
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;
import java.util.UUID;
@Component
@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class FooImpl implements Foo {
private final String state = UUID.randomUUID().toString();
public String getState() {
return state;
}
}
酒吧:
package biz.tugay;
/* User: koray@tugay.biz Date: 25/12/15 Time: 19:35 */
public interface Bar {
Foo getFoo();
}
BarImpl:
package biz.tugay;
/* User: koray@tugay.biz Date: 25/12/15 Time: 19:33 */
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope(value = "singleton")
public class BarImpl implements Bar {
private Foo foo;
@Autowired
public void setFoo(Foo foo) {
this.foo = foo;
}
public Foo getFoo() {
return foo;
}
}
和测试类:
package biz.tugay;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import static java.lang.System.out;
public class TestClass {
final static Class<SpringConfiguration> SPRING_CONFIGURATION_CLASS = SpringConfiguration.class;
public static void main(String[] args) {
final ApplicationContext applicationContext;
applicationContext = new AnnotationConfigApplicationContext(SPRING_CONFIGURATION_CLASS);
final Bar barOne = applicationContext.getBean(BarImpl.class);
final Bar barTwo = applicationContext.getBean(BarImpl.class);
out.println("barOne == barTwo: " + (barOne == barTwo));
out.println("barOne.getFoo == barTwo.getFoo: " + (barOne.getFoo() == barTwo.getFoo()));
out.println(barOne.getFoo().getState());
out.println(barTwo.getFoo().getState());
}
}
输出将是:
barOne == barTwo: true
barOne.getFoo == barTwo.getFoo: true
064bdb74-cad7-4d13-86fe-a4fc0021e5a0
c6f2d9be-09b4-456d-9414-8ece2f2acc9e
我的问题是,
我知道 064bdb74-cad7-4d13-86fe-a4fc0021e5a0 不等于 c6f2d9be-09b4-456d-9414-8ece2f2acc9e 因为 FooImpl 实际上是 ScopedProxy。
我不明白的是,为什么barOne.getFoo可以等于barTwo.getFoo?
这怎么可能:
barOne.getFoo() == barTwo.getFoo()
barOne.getFoo().getState() != barTwo().getFoo().getState()
???
最佳答案
要首先理解输出,您需要了解 Spring Framework 的工作方式和内容。让我们从以下想法开始:当您将“短期”作用域 bean 注入(inject)“长期”作用域 bean(在您的例子中,原型(prototype) bean 注入(inject)单例 bean)时,Spring 会注入(inject)一个 AOP 代理来代替作用域 bean。
That is, you need to inject a proxy object that exposes the same public interface as the scoped object but that can also retrieve the real target object from the relevant scope (such as an HTTP request) and delegate method calls onto the real object.
基本上有两种主要类型的代理,JDK 代理和 CGLIB 代理(默认)。
所以让我们回到示例代码并尝试理解发生了什么......当您的应用程序启动时,Spring Framework 会创建两个 bean Foo
和 Bar
,但这两个 bean 不仅仅是一个简单的实现(FooImpl 和 BarImpl),而是代理(CglibAopProxy 的)。因此,在您的 TestClass
类中,您有 2 个对 BarImpl
barOne 和 barTwo 的相同 AopProxy 的引用。由于 Bar
的作用域为单例,因此 AopProxy 的底层目标类是相同的对象 (BarImpl),它已预先初始化。而这个 Bar
AopProxy 有一个 Foo
类型的注入(inject) AopPorxy,所以当你执行下面的代码时 barOne.getFoo() == barTwo.getFoo()
它的计算结果为真,因为 barOne
和 barTwo
具有相同的 AopProxy 实例(不是目标类),但是当您调用 barTwo( ).getFoo().getState()
AopProxy 正在创建目标类 (FooImpl) 的新实例并在其上执行 getState()
方法。所以每次调用 bar.getFoo().getState()
都会创建一个新的 FooImpl
实例,然后执行它的 getState()
方法.
关于java - Spring Scoped Proxy 适用于 Scoped Proxy Beans 字段的字段而不是 beans 本身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34469967/
有什么区别 和 您能解释一下这两者之间有什么区别吗? 最佳答案 它是一个 XML 命名空间,用于分隔可能存在冲突的元素名称,因此没有真正的区别。 XML Namespaces 关于java -
我刚刚浏览了两个 Web 应用程序,在两个项目的“applicationContext.xml”文件中都有一个标记 ... 另一个是 ... 谁能给我解释一下有什么区别吗? 最佳答案 没有语
我一直在尝试了解 WebSphere Commerce 中的 Java bean,但我真的很困惑。请帮帮我。我需要知道: What is the difference between EntityBe
自从我们更新到 grails 2.0.1(从 2.0.0 开始)以来,通过 bean 字段显示的所有 bean 都错误地显示为“withBean”字段的第一个属性。在我下面发布的示例中,所有 [fir
我有一个 bean,我将另一个 beanlist 放入其中,并且我想访问该内部 bean。 我的第一个 Bean 是: public class FirstDTO { private String F
我正在尝试将 CSS 和 JS 添加到 spring MVC 项目中的 JSP 页面,以便我在 dispatcher-servlet.xml 中包含了 js/css 文件夹的引用,如下所示:
当我将请求传递给 RestController 时,出现以下错误。 org.springframework.beans.factory.xml.XmlBeanDefinitionStoreExcept
我看到很多示例将 bean 标记为实体 bean (@Entity) 和命名 bean (CDI),以避免创建 2 个类(托管 bean 和实体 bean)并利用 Bean 验证以便可以执行验证在客户
在我的理解中, session 总是意味着有状态。考虑 servlet session 对象, 想想 cookie。如果 session 是无状态的,我认为我们根本不需要 session 。 在jee
我完全是Spring框架的初学者。我当时正在玩一个创建对象实例的示例。因此需要您的帮助! 看看这个例子: MainApp.java: import org.springframework.contex
这个问题在这里已经有了答案: What is a JavaBean exactly? (23 个回答) 关闭 7 年前。 我已经阅读了有关 EJB、Java Beans 的内容,但是我仍然对“bea
我刚开始使用 Spring-Framework,实际上我正在使用 spring-boot 库。我有以下问题: 我知道在 @Configuration 类中使用 @Bean 注册的 bean 默认是单例
我对下面提到的场景中使用Spring Framework时会创建的实例数量有疑问: bean配置是这样的 or 默认情况下,bean "a"有 singleton scope .所以
在我的 Spring-Module.xml 中,我有两个 bean: ... ... 我像这样实例化我的类: Applicat
@Autowired private Map departments; 我的 spring 配置文件 只要使用 @Autowired 需要日期,它就可以正常工作 同样, 如何使用没有属性
我已经为 ComboBox 设置了 ContainerDataSource this.comboBox.setContainerDataSource(container)。这个容器是一个 BeanIt
为了支持流畅的编程风格,我最近修改了我们的 Java Beans setter 方法以返回 Bean 类。但是现在 Java Beans Activation Framework (rel 1.1)
有人可以告诉我在我的 ApplicationContext 中我必须使用 beans:bean 而不是 bean 的什么以及如何修复它。
我有如下配置: batch:job id="reconciliationJob" job-repository="jobRepository" restartable="true" 在应用程序上下文启
我已经为 Test_flow 创建了简单的测试套件,但是当我尝试运行该流程时出现错误。 java.lang.RuntimeException: org.mule.api.config.Configur
我是一名优秀的程序员,十分优秀!