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

Spring injection is not working if bean created manually in xml

我有以下豆类:

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 实例没有被注入?

我找到原因了,我只是忘记了 <context:annotation-config/> 以便使 @Inject 注释起作用。

我不确定您使用注释混合和匹配 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;
    }
}