使用隐式 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);
}
这主要是对 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.java
和 Tire.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();
}
}
我想将 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);
}
这主要是对 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.java
和 Tire.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();
}
}