2016-12-29 2 views
0

У меня ниже класса Spring, который я хочу загрузить с помощью Spring DI. С конструктором по умолчанию он работает как ожидалось, но может ли кто-нибудь рассказать мне подробности аннотации и синтаксис с конструктором со строковыми аргументами. Эти строковые аргументы - это время выполнения.Весна Зависимость Инъекция с анотацией в конструкторе с параметром

Я пробовал с конфигурацией XML «constrctor args» и работал как ожидалось.

public someclass(String hostName, int port, String user, String password) { 
     this.user = user; 
     this.password = password; 
    } 

ответ

1

Я предполагаю, что ваши поля (hastName, port, user и password) поступают из файла свойств, например, для конфигурации сервера.

@Component 
public class SomeClass { 

    @Autowired 
    public someclass(@Value("${server.hostName}") String hostName, @Value("${server.port}") int port, @Value("${server.user}") String user, @Value("${server.passowrd}") String password) { 
     this.user = user; 
     this.password = password; 
    } 
} 

Если ваши параметры не являются статическими значениями, вы будете использовать программный путь. Перед созданием экземпляра вашего компонента необходимо автоподключить контекст приложения.

@Autowired 
private ApplicationContext ctx; 

Затем создайте экземпляр боб и зарегистрировать его в контексте приложения,

BeanDefinitionRegistry registry = ((BeanDefinitionRegistry) ctx.getFactory()); 

GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); 
beanDefinition.setBeanClass(SomeClass.class); 
beanDefinition.setLazyInit(false); 
beanDefinition.setAbstract(false); 
beanDefinition.setAutowireCandidate(true); 
beanDefinition.setScope("singleton"); // you should deal your scope. 
ConstructorArgumentValues constructor = beanDefinition.getConstructorArgumentValues(); 
constructor.addIndexedArgumentValue(0, hostName); 
constructor.addIndexedArgumentValue(1, port); 
constructor.addIndexedArgumentValue(3, user); 
constructor.addIndexedArgumentValue(4, password); 

String beanName = "someclass"; // give a name to your bean 

BeanComponentDefinition definition = new BeanComponentDefinition(beanDefinition, beanName); 
BeanDefinitionReaderUtils.registerBeanDefinition(definition, registry); 

Будьте осторожны при работе вашей сферы боба. Вы можете использовать запрос или область сеанса согласно вашей структуре.

Наконец, вы можете autowire SomeClass в других классах;

@Autowired 
public SomeClass someClass; 
+0

Nope. Это не происходит из файла свойств, так как это не связано с базой данных. Итак, эти вещи динамичны по своей природе и будут переданы с Java. – Souvik

+0

Humm это означает, что вы не можете создать этот весенний боб при запуске своего сервера. Вы не можете использовать проверку компонентов. Следовательно, вы должны создать экземпляр этого класса во время выполнения и зарегистрировать его в контексте весеннего приложения с программным обеспечением. Я могу дать больше информации об этом, если хотите. Но я считаю, что вы не можете сделать это по аннотации. – nsylmz

+0

Я думаю, что больше информации будет очень полезно для меня. Таким образом, согласно комментарию только вариант, который у меня есть, это сделать это вручную с помощью «нового» оператора. – Souvik

Смежные вопросы