如果在xml中手动创建bean,则Spring注入不起作用

时间:2016-04-16 17:08:13

标签: java spring dependency-injection ioc-container

我有以下豆子:

Bean.java

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class Bean {

    private String arg;

}

Service.java

import lombok.Getter;
import javax.inject.Inject;

public class Service {

    @Inject @Getter
    private Bean bean;

    private String arg;

    public Service(String arg) {
        this.arg = arg;
    }
}

以下是我实例化这些内容的方法:

test-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

   <bean class="com.example.Bean">
          <constructor-arg value="bean param"/>
   </bean>

   <bean class="com.example.Service">
          <constructor-arg value="service param"/>
   </bean>

</beans>

但是当我创建上下文并查看Service实例中的内容时:

    ApplicationContext context = new ClassPathXmlApplicationContext("test-context.xml");
    System.out.println(context.getBean(Bean.class));
    System.out.println(context.getBean(Service.class).getBean());

第二个System.out给我null。

为什么Bean实例没有被注入?

2 个答案:

答案 0 :(得分:2)

我找到了原因,我刚忘了<context:annotation-config/>,以使@Inject注释发挥作用。

答案 1 :(得分:1)

我不确定您将XML配置与注释混合和匹配的方法,它需要<context:annotation-config/>。我说你以某种方式做得更安全。如果您坚持使用XML,那么在XML定义中注入依赖项

<bean id="foo" class="com.example.Bean">
    <constructor-arg value="bean param"/>
</bean>

<bean class="com.example.Service">
    <constructor-arg value="service param"/>
    <property name="bean" ref="foo" />
</bean>

或者使用注释完成所有操作

@Component
public class Bean {
    private String arg;

    public Bean(@Value("{constructorArg}") final String arg) {
        this.arg = arg;
    }
}

@Service
public class Service {

    @Autowired @Getter
    private Bean bean;

    private String arg;

    public Service(@Value("{constructorArg}") String arg) {
        this.arg = arg;
    }
}