Spring bean没有使用@Component注释进行自动装配

时间:2014-05-13 05:25:59

标签: java spring spring-mvc annotations

我不确定我做错了什么,但我有一个在单元测试中工作的webapp配置,但在生产中死于Component bean。

bean扩展WebServiceGatewaySupport并扩展了接口。

我在java中定义它:

@Component("myShippingImplementation")
public class MyShippingImplemenation extends WebServiceGatewaySupport implements ShippingImplementation {
    private String addressValidationUri;

    public String getAddressValidationUri() {
        return addressValidationUri;
    }

    public void setAddressValidationUri(String addressValidationUri) {
        this.addressValidationUri = addressValidationUri;
    }   
}

,XML bean配置为:

<bean id="myShippingImplementation" class="com.cerp.service.shipping.MyShippingImplemenation" autowire="byType">
    <property name="addressValidationUri" value="https://www.testurl.com" />
    <property name="defaultUri"           value="https://www.alturl.com" />
    <property name="marshaller" ref="marshaller"/>
    <property name="unmarshaller" ref="marshaller"/>
</bean>

如果我在单元测试中连接它,它可以工作:

public class MyServiceClientTest extends BaseWebServiceTest {
    @Autowired MyShippingImplemenation c;

(BaseWebServiceTest使用SpringJUnit4ClassRunner)

但如果我在控制器中连接它并使用以下命令将其从Tomcat运行:

@Controller
@RequestMapping(value="/work/settings")
public class SettingsController {
    @Autowired
    SignupServiceI signupService;

    @Autowired
    ShippingImplementation myShipImplementation;
它死了。问题是我在XML中定义的字段似乎不是自动装入Controller的bean的一部分。例如,我在setAddressValidationUri中放置了一个断点,我可以看到它在具有适当属性的应用程序启动时被调用。但是,在控制器中自动装配之后,bean的实例对于这些值为null。

您还会注意到有一个SignupServiceI引用...这是一个成功自动装配的Service bean。它是由使用@Service标记注释的类实现的接口。

1 个答案:

答案 0 :(得分:10)

删除@Component

添加此注释与组件扫描相结合会导致同一个bean的两个实例(实际上在您的情况下,由于相同的bean名称/ id,一个bean会覆盖另一个bean)。您还使用XML定义了它。 XML中的那个是您要使用的那个。