Estou usando o Spring 3.1 e inicializando um aplicativo usando os atributos @Configuration
e @ComponentScan
.
O início real é feito com
new AnnotationConfigApplicationContext(MyRootConfigurationClass.class);
Esta classe de configuração é anotada com
@Configuration
@ComponentScan("com.my.package")
public class MyRootConfigurationClass
e isso funciona bem. No entanto, gostaria de ser mais específico sobre os pacotes que escaneio e tentei.
@Configuration
@ComponentScan("com.my.package.first,com.my.package.second")
public class MyRootConfigurationClass
No entanto, isso falha com erros informando que não é possível encontrar os componentes especificados usando a @Component
anotação.
Qual é a maneira correta de fazer o que procuro?
obrigado
java
spring
annotations
Cara de programação
fonte
fonte
Respostas:
@ComponentScan usa array de string, como este:
@ComponentScan({"com.my.package.first","com.my.package.second"})
Quando você fornece vários nomes de pacote em apenas uma string, o Spring interpreta isso como um nome de pacote e, portanto, não pode encontrá-lo.
fonte
Há outra alternativa segura de tipo para especificar um local de pacote básico como uma String. Veja a API aqui , mas também ilustrei abaixo:
@ComponentScan(basePackageClasses = {ExampleController.class, ExampleModel.class, ExmapleView.class})
Usar o especificador basePackageClasses com suas referências de classe dirá ao Spring para escanear esses pacotes (assim como as alternativas mencionadas ), mas este método é seguro para tipos e adiciona suporte IDE para refatoração futura - uma grande vantagem em meu livro.
Lendo a partir da API, Spring sugere a criação de uma classe de marcador no-op ou interface em cada pacote que você deseja verificar, que não serve a nenhum outro propósito além de ser usada como uma referência para / por este atributo.
IMO, eu não gosto das classes de marcador (mas, novamente, elas são muito parecidas com as classes de informações do pacote), mas o tipo de segurança, suporte a IDE e redução drástica do número de pacotes básicos necessários para incluir nesta varredura é, sem dúvida, uma opção muito melhor.
fonte
Forneça o nome do seu pacote separadamente, ele requer um
String[]
para os nomes dos pacotes.Em vez disso:
@ComponentScan("com.my.package.first,com.my.package.second")
Usa isto:
@ComponentScan({"com.my.package.first","com.my.package.second"})
fonte
Outra maneira de fazer isso é usando o
basePackages
campo; que é um campo dentro da anotação ComponentScan.@ComponentScan(basePackages={"com.firstpackage","com.secondpackage"})
Se você olhar para a anotação ComponentScan .class do arquivo jar, você verá um campo basePackages que leva em uma matriz de Strings
public @interface ComponentScan { String[] basePackages() default {}; }
Ou você pode mencionar as classes explicitamente. Que tem uma variedade de classes
fonte
Você usa o ComponentScan para digitalizar vários pacotes usando
@ComponentScan({"com.my.package.first","com.my.package.second"})
fonte
certifique-se de ter adicionado esta dependência em seu pom.xml
fonte
Você também pode usar a anotação @ComponentScans:
@ComponentScans(value = { @ComponentScan("com.my.package.first"), @ComponentScan("com.my.package.second") })
fonte
Eu uso:
@ComponentScan(basePackages = {"com.package1","com.package2","com.package3", "com.packagen"})
fonte