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

Ice*_*nte 5 java spring annotations spring-mvc

不确定我做错了什么,但我有一个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;
    }   
}
Run Code Online (Sandbox Code Playgroud)

并且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>
Run Code Online (Sandbox Code Playgroud)

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

public class MyServiceClientTest extends BaseWebServiceTest {
    @Autowired MyShippingImplemenation c;
Run Code Online (Sandbox Code Playgroud)

(BaseWebServiceTest使用SpringJUnit4ClassRunner)

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

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

    @Autowired
    ShippingImplementation myShipImplementation;
Run Code Online (Sandbox Code Playgroud)

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

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

M. *_*num 11

删除@Component.

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