2015-02-09 74 views
1

我有一个问题,关于春天的Autowire Annotation.The的情况是这样的:使用荫的@Autowire A类和使用它在两个地方-Class B和C类象下面这样:春@Autowire注释

public class B 
{ 

@Autowired 
private A a; 
...... 

Map<String, Map<String,String>> map1=a.getNameValues(); 
Map<String, Map<String, String>> map2 = a.get("key"); 
if (map2!=null) 
map1.putAll(map2); 

以及在其他C类,如下所示:从B级至C级

public class C 
{ 

@Autowired 
private A a; 
...... 

Map<String, Map<String,String>> map1=a.getNameValues(); 
Map<String, Map<String, String>> map2 = a.get("key"); 
if (map2!=null) 
map1.putAll(map2); 
} 

程序控制流动,从而由于类A在这两个地方自动装配。所以当控制首先到达B类时,map2被检索并放入map1中。当控件进入类C时,map1已经有了map2值。有什么方法可以控制这种情况?因为我希望这两个类独立工作并使用Autowired类。让我知道你的想法。

+0

有较好的一类设计/建筑。这个重复的逻辑可能属于A类,而不属于它。 – hofan41 2015-02-09 00:29:36

+0

重复逻辑在两个类中都有其自己的用法。你能告诉什么可以是其他的选择? – Bob 2015-02-09 00:48:24

回答

2

@Autowire将自动注入一个spring bean到给定的属性。

这听起来像你的问题实际上与被注入的bean的范围有关。因此,假如你A类看起来是这样的:

@Component 
public class A { 
    .... 
} 

那么会发生什么是春天将创建一个实例的A(又名一个Singleton)(在给定的应用上下文),并注入到两个BC

问题 - 这是你正试图解决的问题吗?当你说你想让两个班级独立行事时,你的意思是BC中的A对象是完全相同的对象吗?

为了让弹簧连线A的新实例,您可以简单地将A的范围更改为原型。

@Component 
@Scope(value = "prototype") 
public class A { 
    .... 
} 

或XML

<bean id="a" class="A" scope="prototype"/> 
+0

之前不知道此功能,谢谢。我相信你的意思是'scope ='prototype''in xml? – hsluo 2015-02-09 03:19:24

+0

是的,我做了,修正了它 – stringy05 2015-02-09 05:28:06