使用隐式 setter 自动装配和 ComponentScan 将 spring xml 转换为 java 配置

Converting spring xml to java configuration with implicit setter autowiring and ComponentScan

我有两个 class:vehicle.Tire 和 vehicle.Car。

package vehicle;
@Named
public class Tire {
    private String age;
}

package vehicle;
@Named
public class Car {
    private Tire tire;

    // Spring calls this setter because default-autowire="byName" of xml configuration
    public void setTire(Tire newTire) {
        this.tire = newTire;
    }

    public Tire getTire() {
        return this.tire;
    }
}

以下 spring xml 工作正常。

<beans xmlns="http://www.springframework.org/schema/beans" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
                       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
   default-autowire="byName">

  <context:component-scan base-package="vehicle" />

</beans>

我尝试在上面创建一个 java 配置:

@Configuration
@ComponentScan(basePackages={"vehicle"})
public VehicleConfig {
}

没有在classes中使用@Inject和@Autowired注解,但是springautowires 并且它适用于 xml。 使用java配置,没有调用Car的setTire方法:(

缺少什么?如何更改 java 配置 使用 组件扫描 而无需 修改汽车和轮胎 classes? default-autowire="byName" xml 标签属性等同于 java 吗?

我使用上面的 class 来测试 java 配置

@Test
public class VehicleConfigTest  {    
    public void testTire() {
        AnnotationConfigApplicationContext applicationContext = 
            new AnnotationConfigApplicationContext();

        applicationContext.register(VehicleConfig.class);

        applicationContext.refresh();

        Car car = applicationContext.getBean(Car.class);
        Assert.assertNotNull(car.getTire());
    }

}

提前致谢。

在 sprig java 配置中没有等效于 default-autowire="byName" 全局 xml 标签属性。

此外,正确的注入方式是通过cdi使用@Inject注解或通过spring使用@Autowired注解。所以,class Car 应该修改:

package vehicle;

@Named
public class Car {

  @Inject
  private Tire tire;

  public Tire getTire() {
    return this.tire;
  }
}

现在,xml 或 java 配置都有效。