Estoy usando Spring 3.1 y arrancando una aplicación usando los atributos @Configuration
y @ComponentScan
.
El inicio real se realiza con
new AnnotationConfigApplicationContext(MyRootConfigurationClass.class);
Esta clase de configuración está anotada con
@Configuration
@ComponentScan("com.my.package")
public class MyRootConfigurationClass
y esto funciona bien. Sin embargo, me gustaría ser más específico sobre los paquetes que escaneo, así que lo intenté.
@Configuration
@ComponentScan("com.my.package.first,com.my.package.second")
public class MyRootConfigurationClass
Sin embargo, esto falla con errores que me dicen que no puede encontrar los componentes especificados usando la @Component
anotación.
¿Cuál es la forma correcta de hacer lo que busco?
Gracias
java
spring
annotations
Chico de programación
fuente
fuente
Respuestas:
@ComponentScan usa una matriz de cadenas, como esta:
@ComponentScan({"com.my.package.first","com.my.package.second"})
Cuando proporciona varios nombres de paquetes en una sola cadena, Spring lo interpreta como un nombre de paquete y, por lo tanto, no puede encontrarlo.
fuente
Existe otra alternativa de tipo seguro para especificar la ubicación de un paquete base como String. Vea la API aquí , pero también he ilustrado a continuación:
@ComponentScan(basePackageClasses = {ExampleController.class, ExampleModel.class, ExmapleView.class})
El uso del especificador basePackageClasses con las referencias de su clase le dirá a Spring que escanee esos paquetes (al igual que las alternativas mencionadas ), pero este método es seguro para los tipos y agrega soporte IDE para refactorizaciones futuras, una gran ventaja en mi libro.
Al leer de la API, Spring sugiere crear una clase o interfaz de marcador no operativo en cada paquete que desea escanear que no tenga otro propósito que ser utilizado como referencia para este atributo.
En mi opinión, no me gustan las clases de marcadores (pero, de nuevo, son casi como las clases de información de paquetes), sino la seguridad de tipos, el soporte IDE y la reducción drástica de la cantidad de paquetes básicos necesarios para incluir en este escaneo. es, sin lugar a dudas, una opción mucho mejor.
fuente
Proporcione el nombre de su paquete por separado, requiere un
String[]
nombre de paquete.En lugar de esto:
@ComponentScan("com.my.package.first,com.my.package.second")
Utilizar esta:
@ComponentScan({"com.my.package.first","com.my.package.second"})
fuente
Otra forma de hacer esto es usando el
basePackages
campo; que es un campo dentro de la anotación ComponentScan.@ComponentScan(basePackages={"com.firstpackage","com.secondpackage"})
Si observa el .class de anotación ComponentScan del archivo jar, verá un campo basePackages que incluye una matriz de cadenas
public @interface ComponentScan { String[] basePackages() default {}; }
O puede mencionar las clases explícitamente. Que toma una variedad de clases
fuente
Utiliza ComponentScan para escanear múltiples paquetes usando
@ComponentScan({"com.my.package.first","com.my.package.second"})
fuente
asegúrese de haber agregado esta dependencia en su pom.xml
fuente
Yo suelo:
@ComponentScan(basePackages = {"com.package1","com.package2","com.package3", "com.packagen"})
fuente
También puede usar la anotación @ComponentScans:
@ComponentScans(value = { @ComponentScan("com.my.package.first"), @ComponentScan("com.my.package.second") })
fuente