gpt4 book ai didi

java - proxyMode ScopedProxyMode.TARGET_CLASS 与 ScopedProxyMode.INTERFACE

转载 作者:搜寻专家 更新时间:2023-11-01 01:50:01 25 4
gpt4 key购买 nike

正如其他 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com