Как вставить Spring Bean для метода factory, требующего параметр MyClass.class
Я пытаюсь ввести java.util.prefs.Preferences bean в мой главный контроллер. Контроллер выглядит так:
@Controller
class MyController {
@Autowired
private Preferences preferences;
}
Файл application-context.xml создает bean для java.util.prefs.Preferences. Он использует метод factory, поэтому у меня есть следующая запись для создания bean:
<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage" />
Preferences.userNodeForPackage(param) принимает для параметра класс, относящийся к Предпочтению. В этом случае Spring необходимо создать bean, выполнив вызов:
Preferences.userNodeForPackage(MyController.class);
Как можно передать класс в Spring bean, созданный с помощью метода factory?
Благодаря
Информация о среде:
Java 7
Spring 3.1
Ответы
Ответ 1
Вы можете указать элемент constructor-arg
<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage">
<constructor-arg type="java.lang.Class" value="com.path.MyController" />
</bean>
Это объясняется в официальной документации здесь, раздел 5.4.1.
Аргументы статического метода factory предоставляются через элементов, точно так же, как если бы конструктор фактически были использованы. Тип класса, возвращаемого factory метод не должен быть того же типа, что и класс, который содержит статический метод factory, хотя в этом примере он есть. экземпляр (нестатический) factory будет использоваться по существу (кроме использования атрибута factory - beanвместо атрибута класса), поэтому детали не будут обсуждаться здесь.
Ответ 2
Ну, я не знаю способ настройки на основе xml, но могу рассказать вам, как вы можете создать его через класс Configuration
.
@Configuration
public class Config {
@Bean(name="preferences")
public java.util.prefs.Preferences preferences() {
// init
return java.util.prefs.Preferences.userNodeForPackage(YourExpectedClass.class);
}
}
P.S.
Вам нужно будет добавить свой класс/пакет конфигурации для сканирования в web.xml, если вы используете полный подход на основе аннотации [contextClass=org.springframework.web.context.support.AnnotationConfigWebApplicationContext]
или в своем файле конфигурации, как показано ниже:
<context:component-scan base-package="com.comp.prod.conf" />
Ответ 3
public class Preferences
{
SomeBean someBean;
public void setSomeBean(SomeBean someBean){
this.someBean = someBean;
}
public static Preferences createSampleBeanWithIntValue(SomeBean someBean)
{
Preferences preferences= new Preferences();
preferences.setSomeBean(someBean);
return preferences;
}
}
<bean id="someBean" class="java.util.prefs.SomeBean"/>
<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage" >
<constructor-arg ref="someBean "/>
</bean>
См. ссылку
http://www.skorks.com/2008/10/are-you-using-the-full-power-of-spring-when-injecting-your-dependencies/
Ответ 4
сначала создайте bean класса "Предпочтения" либо с помощью файла xml, либо с помощью аннотации.
тогда
вы можете использовать этот <context:annotation-config>
, если вы создали bean, используя конфигурацию xml для активации функции @Autowired annotation
(или)
<context:component-scan base-package="com.estudo.controller" />
если вы создали bean с помощью аннотаций.
Примечание. Определите теги выше в файле spring сервлета xml
Ответ 5
Spring framework обеспечивает возможность ввода bean с использованием метода factory. Для этого мы можем использовать два атрибута элемента bean.
factory -method: представляет метод factory, который будет вызываться для ввода bean.
factory - bean: представляет ссылку bean, с помощью которой будет вызываться метод factory. Он используется, если метод factory нестационар.
Метод, возвращающий экземпляр класса, называется методом factory.
public class A {
public static A getA(){//factory method
return new A();
}
}
Ответ 6
Можете ли вы попробовать сделать "предпочтения" собственностью "MyController".
Что-то вроде
<bean id="MyController" class="com.your.package.MyController">
<property name="preferences" ref="preferences" />
</bean>
а затем метод Getter и setter для настроек в MyController.
Я думаю, что это должно сработать.