java - tipos - Primavera: asegúrese de que un grano en particular se inicialice primero
placer al reventar granos (4)
Tengo una biblioteca que realiza la configuración y el tiempo de ejecución de log4j (sin log4j.properties o log4j.xml). He definido un bean con una clase llamada MyLoggerFactory y quiero que este sea el primer bean que se inicialice con la primavera. He visto que un problema ya se ha presentado en la primavera para tener soporte para el orden de inicialización, pero me preguntaba si había una manera de marcar un frijol como el primer frijol que se inicializaría en un contenedor de primavera.
Esta es una función solicitada pero no resuelta. Puede usar depende de, pero es demasiado detallado. Siga este enlace para obtener más información: https://jira.springsource.org/browse/SPR-3948
Puede @Autowired una @Configuration en la configuración @ principal
@Configuration
@Import(BusinessConfig.class, EarlyBeans.class)
public class MainConfiguration {
// The bean defined in EarlyBean will be loaded before
// most beans references by MainConfiguration,
// including those coming from BusinessConfig
@Autowired
EarlyBean earlyBean;
}
@Configuration
public class EarlyBeans {
@Bean
public Void earlyBean(ApplicationContext appContext) {
// .getBeansOfType allows to call for beans which might not exist
appContext.getBeansOfType(TechnicalBean.class);
return null;
}
}
Puede dividir el contexto de la aplicación como múltiple y usar la importación en el contexto de la aplicación principal. Puede poner la configuración principal del entorno primero en el orden de importación y luego continuar agregando otros archivos.
Podría ser como a continuación.
<!-- Import environment properties settings. -->
<import resource="Spring-Env.xml"/>
<!-- Import All the other Application contexts. -->
<import resource="Spring-MainApplicationContext.xml"/>
Tus opciones son:
- Use la anotación
@DependsOn
(disponible después de la primavera 3.0.x) odepends-on
atributo xml y haga que todas las clases que usan los registradores configurados dependan de la fábrica del registrador - Convierta la fábrica en una fábrica real para los leñadores, e inyecte los registradores en los granos en lugar de llamar directamente a la fábrica; esto es esencialmente lo mismo que la opción 1, excepto que la dependencia es implícita. Esta es la opción que recomendaría.
- Mueva el código de inicialización a una parte de su código donde se especifica el orden de la llamada: el método
main()
o unServletContextListener
registrado antes del que inicializa Spring.
No hay forma de definir explícitamente el orden de inicialización en Spring y probablemente nunca lo será; no hay forma de definir una semántica útil para él, ya que puede cargar muchos archivos de configuración de contexto de aplicación que pueden tener ordenados conflictivos. Aún no he visto un caso en el que no se haya podido realizar el pedido deseado refacturando su código para que se ajuste mejor al patrón de inyección de dependencia.