2015-12-31 101 views
2
Project X 
--------- 
public class A {} 

Public class B{ 
    @Autowire 
    private A a; 

    @Autowire 
    private D d; 
} 


Project Y 
--------- 
Public class C{ 
    public static void main(String[] args) throws Exception { 
     ApplicationContext context = new ClassPathXmlApplicationContext("spring/application-Context.xml"); 
     B b = context.getBean("b", B.class); 
    } 
} 

application-Context.xml 
<bean id="a" class="A" /> 
<bean id="b" class="B" /> 

问: 我有安装上面的一样,在那里我有项目X的二进制文件,目前我的工作项目Y.我想没有项目创建d创建B类对象Y.做这件事的最好方法是什么?忽略春天依赖注入:XML

+0

你不能改变的B类?你只有二进制? –

+0

是的,没有触摸项目X – Nihanth

回答

1

您可以在自动布线注释中使用此字段。

@Autowired(required=false) 
private D d; 

如果您无法访问项目X,则必须进行某种破解。

在您的项目上创建标记为服务的类并扩展D类,因此在这种情况下,spring会注入您的类。

@Component 
@Primary 
public class MockD extends D { 

} 

在这种情况下@Primary会说春天要优先考虑这个,而不是其他实施。所以你的班级将被注入B级

+0

问题是我没有访问项目X – Nihanth

+0

编辑我的评论,这是一个黑客,但你没有任何其他选择,如果你不能在我的应用程序上下文中访问项目x – Aviad

0

依赖注入从来不是强制性的。这取决于他/她想要注入或不注入bean的程序员。

application-Context.xml 
<bean id="a" class="A" /> 
<bean id="b" class="B" > 
    <property name="a" ref="a" /> 
</bean> 

只有当B类扩展InitializingBean和覆盖afterPropertiesSet方法,并检查是否d注入,那么只有可能会导致:

所以在这里B的定义,下面给出你可以简单地注入只是豆一问题,否则你会对上述注射有好处。不需要创建并注入bean D。

+0

。 xml文件我有 它抛出: 引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到匹配的类型为[xyzD]的bean:期望至少有1个bean符合此依赖关系的自动导向候选人的资格。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)} – Nihanth

0
<!--<context:annotation-config/>--> 
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"> 
<property name="requiredParameterValue" value="false" /> 

而不是添加注释的配置,必须添加上述一个