2015-07-02 3 views
0

Я хочу преобразовать Spring xml в java-конфигурацию.Преобразование весны 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 аннотаций, но весной autowires и она работает. Как изменить xml на java-конфигурацию без Изменить классы автомобилей и шин?

Заранее спасибо.

ответ

0

В основном это исправление для ответа Салмана.

Вы можете действительно использовать класс конфигурации для достижения ваших требований, но вы должны впрыснуть tire фасоли в car фасоли, а не произвольное Tire. Вы можете использовать тот факт, что он является законным для класса конфигурации, чтобы иметь свои собственные бобы впрыскиваются в себя:

@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 боба вводится в car bean.

0

Это код psuedo/sample code (может иметь синтаксические ошибки).

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

+0

Это неправильно: '@ Bean' аннотаций не хватает магии, чтобы сломать то, что кодируется. Вы ** явно ** пишите 'car.setTire (tire())'. Поскольку шина возвращает ** новый шину ** при каждом вызове, тот, который вы вводите в «автомобиль», является ** не ** ** шиной. –

+0

Возможно, вам придется искать весенние концепции [prototype и singleton] (http://stackoverflow.com/questions/16058365/what-is-difference-between-singleton-and-prototype-bean). Вы можете использовать ответ Сержа, если он лучше соответствует вашим требованиям. – Salman

+0

Спасибо за ваш ответ, @ Салман. Действительно, мой конкретный вопрос здесь: [link] (http://stackoverflow.com/questions/31192940/converting-spring-xml-to-java-configuration-with-implicit-setter-autowiring-and) –

0

Здесь метод car() запрашивает шину в качестве параметра. Когда Spring вызывает автомобиль(), чтобы создать фасоль для автомобиля, он автоматически проецирует шину в конфигурационный метод . Тогда тело метода может использовать его, однако оно считает нужным. С помощью этой технологии метод car() может все еще вводить Tire в метод setTireCar, без прямого упоминания метода 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(); 
} 

}

+0

Спасибо за ваш ответ, @ricardo. В самом деле, мой конкретный вопрос здесь: [link] (http://stackoverflow.com/questions/31192940/converting-spring-xml-to-java-configuration-with-implicit-setter-autowiring-and) –