Ответ 1
Пожалуйста, посмотрите Инъекция конструктора.
Кроме того, посмотрите IntializingBean и BeanPostProcessor для другого перехвата жизненного цикла весны.
Я новичок в Spring.
Это код для bean регистрации:
<bean id="user" class="User_Imple"> </bean>
<bean id="userdeff" class="User"> </bean>
и это мой класс bean:
public class User_Imple implements Master_interface {
private int id;
private User user; // here user is another class
public User_Imple() {
super();
}
public User_Imple(int id, User user) {
super();
this.id = id;
this.user = user;
}
// some extra functions here....
}
и это мой основной метод для выполнения действий:
public static void main(String arg[]) {
ApplicationContext context = new ClassPathXmlApplicationContext("/bean.xml");
Master_interface master = (Master_interface)context.getBean("user");
// here is my some operations..
int id = ...
User user = ...
// here is where i want to get a Spring bean
User_Imple userImpl; //want Spring-managed bean created with above params
}
Теперь я хочу вызвать этот конструктор с параметрами, и эти параметры генерируются динамически в моих основных методах. Это то, что я имею в виду, потому что хочу передать динамически - не статически, как объявлено в моем файле bean.config
.
Пожалуйста, посмотрите Инъекция конструктора.
Кроме того, посмотрите IntializingBean и BeanPostProcessor для другого перехвата жизненного цикла весны.
Если вы правильно поняли, правильный ответ - использовать #getBean (String beanName, Object... args), который передаст аргументы bean. Я могу показать вам, как это делается для конфигурации на основе Java, но вам нужно будет найти, как это делается для конфигурации на основе xml.
@Configuration
public class ApplicationConfiguration {
@Bean
@Scope("prototype") //As we want to create several beans with different args, right?
String hello(String name) {
return "Hello, " + name;
}
}
//and later in your application
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfiguration.class);
String helloCat = (String) context.getBean("hello", "Cat");
String helloDog = (String) context.getBean("hello", "Dog");
Это то, что вы ищете?
Обновление. Этот ответ получает слишком много оборотов, и никто не смотрит на мои комментарии. Несмотря на то, что это решение проблемы, оно считается spring анти-шаблоном, и вы не должны его использовать! Существует несколько способов сделать все правильно, используя factory, lookup-метод и т.д.
Пожалуйста, используйте следующую ссылку SO в качестве ориентира: создать beans во время выполнения
Инъекция конструктора может вам помочь. В этом случае вам может понадобиться генерировать POJO с идентификатором и пользователем в качестве его атрибутов и передать POJO в конструктор. В инсталляции конструктора в файле конфигурации вы можете ссылаться на этот конструктор с pojo как ссылкой. Таким образом, вы будете обрабатывать динамическое значение данных в ID и User.
Надеюсь, это поможет!
Я думаю, что ответы, предложенные выше для использования инъекции инжектора конструктора или установки, не работают отлично для используемого варианта, который вы ищете. Spring более или менее принимает значения статических аргументов для конструкторов/сеттеров. Я не вижу возможности динамически передавать значения, чтобы получить Bean из Spring Container. Однако, если вы хотите динамически отображать экземпляры User_Imple, я бы рекомендовал использовать класс factory User_Imple_Factory
public class User_Imple_factory {
private static ApplicationContext context =new ClassPathXmlApplicationContext("/bean.xml");
public User_Imple createUserImple(int id) {
User user = context.getBean("User");
return new User_Imple(id, user);
}
}
Возможно ли позволить User_Imple
быть обычным Pojo (вместо Spring bean) решить вашу проблему?
<!-- Only use User as a Spring Bean -->
<bean id="userdeff" class="User"></bean>
Java:
public static void main(String arg[])
{
ApplicationContext context =new ClassPathXmlApplicationContext("/bean.xml");
User user = context.getBean(User.class);
int id = // dynamic id
Master_interface master = new User_Imple(id, user);
}