2016-04-16 9 views
0
manuell in xml erstellt

Ich habe folgende Bohnen:Frühling Injektion funktioniert nicht, wenn Bean

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

Hier ist, wie ich die Dinge instanziiert:

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> 

Aber wenn ich schaffen den Kontext und schauen, was in Service Instanz ist:

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

die zweite System.out gibt mir null.

Warum Bean Instanz wurde nicht injiziert?

Antwort

1

Ich bin mir nicht sicher über Ihren Ansatz zum Mischen und Anpassen von XML-Konfiguration mit Anmerkungen, erfordert <context:annotation-config/>. Ich würde sagen, dass es sicherer wäre, es auf die eine oder andere Art zu tun. Wenn Sie auf die Verwendung von XML dann darauf bestehen, die Abhängigkeit in der Definition von XML injizieren

<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> 

Alternativ tun es alle mit Anmerkungen

@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

Ich habe den Grund gefunden, ich habe gerade <context:annotation-config/> vergessen, um @Inject Annotation zu arbeiten.

Verwandte Themen