gpt4 book ai didi

java - 如何在 spring 中仅使用 @scope("prototype) 注释制作 bean 原型(prototype)?

转载 作者:行者123 更新时间:2023-11-30 10:14:41 27 4
gpt4 key购买 nike

我有这个主课

public class Draw {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

Triangle t = (Triangle) context.getBean("triangle");
Triangle t1 = (Triangle) context.getBean("triangle");

t.show();

System.out.println(t == t1);

}
}

三角类

@Service
@Scope("prototype")
public class Triangle {
private Point pointa;

public Point getPointa() {
return pointa;
}

public Triangle(Point pointa) {
this.pointa = pointa;
}

public void show() {
System.out.println("POINT A (" + pointa.getX() + "," + pointa.getY() + ")");

}

@Override
public String toString() {
return "Triangle [pointa=" + pointa + "]";
}
}

和 SPRING.XML

<context:component-scan base-package="com.spring.demo" />
<mvc:annotation-driven />
<context:component-scan base-package="com.spring.demo" />
<bean id="triangle" class="com.spring.demo.Triangle" autowire="constructor">
</bean>

<bean id="pointabc" class="com.spring.demo.Point">
<property name="x" value="0" />
<property name="y" value="0" />
</bean>

<context:annotation-config />

我知道要制作一个 bean 原型(prototype),我们在 spring.xml 中使用 scope="prototype"。但我只想使用 @scope("prototype") 制作 bean 原型(prototype)。我不知道为什么上面的代码不能正常工作。我已经研究了很多,但找不到任何答案

System.out.println(t == t1); this gives me true while ideally it should be false.

最佳答案

声明Triangle作为prototype没有效果,因为它在您的 spring.xml 中实例化了作为单例。

关键是每次需要时都要请求一个新的原型(prototype) bean。

这可以通过使用配置类(并从 <bean id="triangle" ... 中删除 spring.xml 来实现:

package com.spring.demo;

@Configuration
public class MyProvider {

@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Triangle create() {
return new Triangle();
}

}

用法如下:

package com.spring.demo;

@Component
public class MySingleton {

@Autowired
private MyProvider myProvider;

@PostConstruct // will execute this method once app context loaded
public void doStuffThatNeedsAPrototypeBeanInstance() {
Triangle t1 = myProvider.create();
Triangle t2 = myProvider.create();
...
}
}

添加 @PostConstruct 的效果是,一旦应用程序上下文已初始化,该方法就会被调用,作为在 main 方法中运行的替代方法。这样,执行在 spring bean 内部进行,好处是可以通过注释轻松访问其他 spring bean。

关于java - 如何在 spring 中仅使用 @scope("prototype) 注释制作 bean 原型(prototype)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50784972/

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