我能够测试在单个bean中自动生成一个原型bean只会创建一个原型bean。
作为一个解决方案,我读到可以为原型bean定义AOP范围的代理,或者使用Spring的查找方法注入。
这是我试过的-
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.INTERFACES)
public class PrototypeBean implements Prototype {
private String welcomeMessage;
public String getWelcomeMessage() {
return welcomeMessage;
}
public void setWelcomeMessage(final String welcomeMessage) {
this.welcomeMessage = welcomeMessage;
}
}
@Component
public class SingletonBean implements Singleton{
@Autowired private Prototype prototype;
public Prototype getPrototype() {
return prototype;
}
public void greet() {
System.out.println(prototype.getWelcomeMessage());
}
}
测试类
public class AutowiredDependenciesDemo {
@Autowired private Singleton autowiredSingleton;
@Autowired ConfigurableApplicationContext context;
@Test
public void testPrototypeBeanWithAopScopedProxy(){
Assert.assertNotNull(autowiredSingleton);
Prototype prototypeBean = (Prototype) ((SingletonBean) autowiredSingleton).getPrototype();
prototypeBean.setWelcomeMessage("hello world");
autowiredSingleton.greet();
Singleton contextSingleton = (Singleton) context.getBean("singletonBean");
Assert.assertSame(autowiredSingleton, contextSingleton);
Prototype anotherPrototypeBean = (Prototype) ((SingletonBean)contextSingleton).getPrototype();
anotherPrototypeBean.setWelcomeMessage("hello india");
contextSingleton.greet();
autowiredSingleton.greet();
// i expected both the prototype instances to be different. in the debugger, it does show two different 'proxied' instances. however the test fails.
Assert.assertNotSame(prototypeBean, anotherPrototypeBean);
}
我是不是漏了什么?此外,对greet()方法的调用返回null。
在您关于代理和原型bean的思考中混合了一些东西。
当Spring Framework将原型作用域bean注入到单个作用域bean中时,它会创建一个代理对象(实现所有必需的接口)并注入它,而不是原型bean的实例。然后,每当在这个原型代理上调用method时,Spring就会创建一个新实例,并在这个新实例上调用该方法。
在您的案例中--在测试中--您只比较注入的代理,它们是相同的,因为原型Bean只有一个代理,并且这个代理负责在需要时创建原型Bean的新实例。
这里是我的例子:我有一个接口原型及其实现PrototypeImpl。在我的测试中,我直接从ApplicationContext获得Prototype类型的bean,并且我还使用@AutoWired注入它。然后在调试器中看到:
注意,只有一个相同的代理(看看它的地址),但是在这个代理上调用“to string()”会显示PrototypeImpl对象的两个不同地址。这正好显示了我上面所写的内容。
编辑:关于取消代理的信息
Prototype extracted = null;
if(AopUtils.isAopProxy(a) && a instanceof Advised) {
Object target = ((Advised)a).getTargetSource().getTarget();
extracted = (Prototype) target;
}
如何在原型范围bean上应用spring aop方面 但令人惊讶的是,在调用原型bean的joinpoint方法时,方面并没有执行。我确信我创建的切入点是正确的,因为在eclipse中,aspectJ插件在joinPoint方法上显示了aspectJ引用的可视化标记,这表明切入点是正确的,但不确定为什么在运行时调用PrototypeBean的joinPoint方法时没有执行它。 我是以不正确的方式
我使用Spring AOP在我们的应用程序中触发指标。我已经创建了一个注释,其中有一个与之关联的建议。除了在原型bean上调用方法的情况之外,所有标记为的方法都可以很好地调用该建议。 注释具有 PointCut表达式: 原型bean创建 DummyService有一个方法,叫做Dummymethod(String DummyString) 当是从其他服务调用的,不调用建议。 配置类 单例注册类 对
output.java
我正在学习Spring,我只是在玩豆子范围。 我将附上代码,然后描述我想做的事情。 到目前为止,我已经创建了一个 点类别: 我创建了一个三角形类,其中有3个Point类的实例: 以下是spring.xml: 这是主类: 所以,你会看到三个豆子的豆范围,,和是,但它们是的成员,其范围默认为Spring 因此,我的假设是,这应该不起作用,除非我能以某种方式在我的< code>Triangle类中获取<
问题内容: 有人可以解释spring 注释的用法吗?我 以为 这与会话范围的Bean有关,但是我不太确定是什么。 在作用域的使用中,我使用了没有注解(或没有aop作用域代理)的会话作用域bean ,所以我真的确定如何正确使用它。 问题答案: spring文档的3.4.4.5节对此进行了很好的解释: (请注意,以下“ userPreferences” Bean定义不完整): 从上面的配置中可以明显看
本文向大家介绍单例和原型bean范围之间的区别。,包括了单例和原型bean范围之间的区别。的使用技巧和注意事项,需要的朋友参考一下 Spring框架支持五种类型的bean作用域- 辛格尔顿 原型 请求 届会 全球会议 根据春季文件- Singleton-每个Spring IoC容器返回一个bean实例。该单个实例存储在此类单例bean的高速缓存中,并且对该命名bean的所有后续请求和引用都返回该高