- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
正如其他 SO 答案所建议的那样,根据您的需要使用代理模式类型,我仍然感到困惑;
@Configuration
@ComponentScan
public class Application
{
public static void main( String[] args )
{
ApplicationContext context = new AnnotationConfigApplicationContext(Application.class);
PrototypeBeanFactory factoryBean = context.getBean(PrototypeBeanFactory.class);
System.out.println("Let's start");
SomeInterface b1 = factoryBean.getPrototypeBeanInstance();
SomeInterface b2 = factoryBean.getPrototypeBeanInstance();
System.out.println(b1.hashCode());
System.out.println(b2.hashCode());
b1.sayHello();
b2.sayHello();
b1.sayHello();
b2.sayHello();
}
}
@Component
public class PrototypeBeanFactory {
@Lookup
public PrototypeBean getPrototypeBeanInstance(){
System.out.println("It'll be ignored");
return null;
}
}
@Component
@Scope(value="prototype", proxyMode = ScopedProxyMode.INTERFACES)
public class PrototypeBean {
public PrototypeBean() {
System.out.println("I am created");
}
public void sayHello() {
System.out.println("Hello from " + this.hashCode());
}
}
输出
Let's start
I am created
I am created
1849201180
1691875296
Hello from 1849201180
Hello from 1691875296
Hello from 1849201180
Hello from 1691875296
现在,如果我将代理模式更改为 TARGET_CLASS
输出
Let's start
-721204056
-721204056
I am created
Hello from 172032696
I am created
Hello from 299644693
I am created
Hello from 1771243284
I am created
Hello from 2052256418
为什么在基于类的代理的情况下,它会在每次方法调用时创建不同的对象?
最佳答案
@Component
@Scope(value="prototype", proxyMode = ScopedProxyMode.INTERFACES)
public class PrototypeBean { ... }
在您的情况下,这将导致每次调用 getBean
bean,因为您的 PrototypeBean
没有实现接口(interface),因此范围代理不能创建。在您的情况下,您两次调用查找方法,因此您将获得 2 个实例。这实际上是 prototype
作用域 bean 的正常行为。
Component
@Scope(value="prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class PrototypeBean { ... }
这将导致创建代理。该代理只创建一次,每次调用 getBean
时都会返回。一旦您在代理上调用一个方法,它就会根据范围创建一个新方法或重用现有方法。由于您已将范围指定为 prototype
,每个方法调用都将导致一个新对象。
注意:如果您的类将实现一个公开适当方法的接口(interface),则 proxyMode = ScopedProxyMode.INTERFACES
和 的行为没有区别proxyMode = ScopedProxyMode.TARGET_CLASS
在这两种情况下都会创建作用域代理。
关于java - proxyMode ScopedProxyMode.TARGET_CLASS 与 ScopedProxyMode.INTERFACE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39945163/
正如其他 SO 答案所建议的那样,根据您的需要使用代理模式类型,我仍然感到困惑; @Configuration @ComponentScan public class Application {
在某些情况下,我们需要在 ApplicationListener 中的 Spring 应用程序中写入数据库,因此我们需要使用 @Transactional 注释在监听器中进行事务处理。这些监听器是从抽
请看下面的代码: @Component @Scope(value= ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMo
我在 java web 应用程序中使用 Spring 3.1 现在,根据此网站--> http://tedyoung.me/2011/10/19/practi...rt-5-sessions/我可以对
我正在尝试使用 spring 社交通信 Controller 实现与服务提供商的连接,如 Spring Social reference doc here 中所述. 初始化时,以下服务找不到 curr
我是一名优秀的程序员,十分优秀!