java spring class preferences factory

java - Cómo inyectar Spring Bean para el método de fábrica que requiere el parámetro MyClass.class



preferences factory (6)

Estoy tratando de inyectar un bean java.util.prefs.Preferences en mi controlador maestro. El controlador se ve como:

@Controller class MyController { @Autowired private Preferences preferences; }

El archivo application-context.xml crea el bean para java.util.prefs.Preferences. Utiliza un método de fábrica, así que tengo la siguiente entrada para crear el bean:

<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage" />

Preferences.userNodeForPackage (param) toma para un parámetro la clase relacionada con la Preferencia. En este caso, Spring necesita crear el bean realizando la llamada:

Preferences.userNodeForPackage(MyController.class);

¿Cómo se puede pasar una clase a un bean de primavera instanciado con un método de fábrica? Gracias

Información del entorno:

Java 7 Spring 3.1


¿Puedes intentar hacer de las "preferencias" una propiedad de "MyController"? Algo como

<bean id="MyController" class="com.your.package.MyController"> <property name="preferences" ref="preferences" /> </bean>

y luego tener el método de obtención y configuración para las preferencias en MyController.

Creo que esto debería funcionar.


Bueno, no conozco la forma de configuración basada en XML, pero puedo decirle cómo puede crear una instancia a través de la clase de Configuration .

@Configuration public class Config { @Bean(name="preferences") public java.util.prefs.Preferences preferences() { // init return java.util.prefs.Preferences.userNodeForPackage(YourExpectedClass.class); } }

PS:

Deberá agregar su clase de configuración / paquete para escanear en web.xml si está utilizando el enfoque basado en anotaciones completas [contextClass=org.springframework.web.context.support.AnnotationConfigWebApplicationContext] o en su archivo de configuración como se muestra a continuación:

<context:component-scan base-package="com.comp.prod.conf" />


El marco de resorte proporciona facilidad para inyectar frijol usando el método de fábrica. Para hacerlo, podemos usar dos atributos del elemento bean.

método de fábrica: representa el método de fábrica que se invocará para inyectar el frijol. factory-bean: representa la referencia del bean mediante el cual se invocará el método de fábrica. Se usa si el método de fábrica no es estático. Un método que devuelve la instancia de una clase se llama método de fábrica.

public class A { public static A getA(){//factory method return new A(); } }


Puede especificar el elemento constructor-arg

<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage"> <constructor-arg type="java.lang.Class" value="com.path.MyController" /> </bean>

Esto se explica en la documentación oficial here , sección 5.4.1.

Los argumentos sobre el método de fábrica estático se suministran a través de elementos, exactamente igual que si se hubiera utilizado un constructor. El tipo de clase que devuelve el método de fábrica no tiene que ser del mismo tipo que la clase que contiene el método de fábrica estático, aunque en este ejemplo sí lo es. Un método de fábrica de instancia (no estático) se usaría de una manera esencialmente idéntica (aparte del uso del atributo de bean de fábrica en lugar del atributo de clase), por lo que los detalles no se tratarán aquí.


primero cree el bean de la clase ''Preferencias'' usando un archivo xml o usando una anotación.
luego puede usar este <context:annotation-config> si creó un bean usando la configuración xml para activar la funcionalidad de anotación @Autowired
(o)

<context:component-scan base-package="com.estudo.controller" />
Si creaste bean usando anotaciones.
Nota: defina las etiquetas anteriores en el archivo xml del servlet de spring


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>

Por favor vea la referencia

http://www.skorks.com/2008/10/are-you-using-the-full-power-of-spring-when-injecting-your-dependencies/