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;
}
}
我有以下豆类:
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;
}
}