2016-04-16 1 views
0

У меня есть следующие бобы:Spring инъекции не работает, если боб создан вручную в 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 дает мне нулю.

Почему Bean экземпляра не вводили?

ответ

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; 
    } 
} 
2

Я нашел причину, я только что забыл <context:annotation-config/>, чтобы сделать @Inject аннотация для работы.

Смежные вопросы