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

Converting spring xml to java configuration with implicit setter autowiring

我想将 spring xml 转换为 java 配置。

<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-4.1.xsd
   default-autowire="byName">

  <bean name="car" type="Car" />
  <bean name="tire" type="Tire" />

</beans>

我有两个类:汽车和轮胎。

public class Tire {
    private String age;
}

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

没有使用@Inject 和@Autowired 注释,但是springautowires并且它有效。 如何将 xml 更改为 java 配置 而无需 修改汽车和轮胎 类?

提前致谢。

这是psuedo/sample代码(可能有语法错误)。

import org.springframework.context.annotation.*;
import Car;
import Tire;

@Configuration
public class MyAppConfig {
  @Bean 
  public Car car() {
    Car car =new Car();
    car.setTire(tire());
    return car;
  }
  @Bean
  public Tire tire() {
    return new Tire();
  }
}

访问上下文的方法如下:

public static void main(String[] args) {
   ApplicationContext ctx = 
   new AnnotationConfigApplicationContext(MyAppConfig.class);
   Car car = ctx.getBean(Car.class);
}

参考:spring_java_based_configuration

这主要是对 Salman 的回答的修正。

您确实可以使用配置 class 来实现您的要求,但是您 必须 car bean 中注入 tire bean 而不是任意 Tire。您可以使用这样一个事实,即配置 class 将自己的 bean 注入自身是合法的:

@Configuration
public class MyAppConfig {
    @Autowired
    Tire tire;

    @Bean 
    public Car car() {
        Car car =new Car();
        car.setTire(tire);
        return car;
    }
    @Bean
    public Tire tire() {
        return new Tire();
    }
}

这样,您可以保持 Car.javaTire.java 不变(那里没有注释)并且仍然有 tire bean 注入 car bean。

在这里,car() 方法要求将 Tire 作为参数。当 Spring 调用 car() 来创建 Car bean,它将 Tire 自动装配到 配置方法。然后该方法的主体可以使用它认为合适的方式。使用这种技术,car() 方法仍然可以将 Tire 注入到 Car setTire 方法没有显式引用 Tire @Bean 方法。

@Configuration
public class MyAppConfig {

@Bean
public Car car(Tire tire) {
    Car car=new Car();
    car.setTire(tire);
    return car;
}
@Bean
public Tire tire() {
    return new Tire();
}

}