Spring autowiring alt paketleri hariç tutulsun mu?


83

İlkbahar 3.1'de bir paketi / alt paketi otomatik kablolamadan hariç tutmanın basit bir yolu var mı?

Örneğin, temel paketi içeren bir bileşen taraması eklemek istersem com.example, hariç tutmanın basit bir yolu var com.example.ignoremı?

(Neden? Entegrasyon testlerimden bazı bileşenleri çıkarmak istiyorum)

Yanıtlar:


85

Paketleri bir <hariç tut-filtresi> ile açıkça hariç tutabileceğinizden emin değilim, ancak eminim bir normal ifade filtresi kullanmak sizi oraya etkili bir şekilde götürür:

 <context:component-scan base-package="com.example">
    <context:exclude-filter type="regex" expression="com\.example\.ignore\..*"/>
 </context:component-scan>

Ek açıklama tabanlı hale getirmek için, entegrasyon testleri için hariç tutulmasını istediğiniz her sınıfa @ com.example.annotation.ExcludedFromITests gibi bir şey ekleyeceksiniz. Daha sonra bileşen taraması şöyle görünecektir:

 <context:component-scan base-package="com.example">
    <context:exclude-filter type="annotation" expression="com.example.annotation.ExcludedFromITests"/>
 </context:component-scan>

Bu daha açık, çünkü artık kaynak kodda, sınıfın entegrasyon testleri için bir uygulama bağlamına dahil edilmesinin amaçlanmadığını belgelediniz.


Dışlama filtresini kullanmak işe yarıyor, ancak "" kaçmam gerekmedi.
Amin

2
@Amin Bu muhtemelen "." "." harfi dahil herhangi bir karakteri açıklar.
aksh1618

54

Ben kullanıyorum @ComponentScanaynı kullanım örneği için aşağıdaki gibi. Bu, BenSchro10'un XML cevabı ile aynıdır, ancak bu ek açıklamaları kullanır. Her ikisi de bir filtre kullanırtype=AspectJ

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration;
import org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration;
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.example" },
    excludeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, pattern = "com.example.ignore.*"))
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Belki tamamen nostaljidir, ama aslında hala XML'i tercih ederim
Kirby

10
ben olabilirim, ancak Bahar 4.2 ile FilterType.REGEXbu yaklaşımı kullanmam gerekiyor
ThanksForAllTheFish

İstediğim buydu ama kullanmak zorundaydım FilterType.REGEX. Belki cevap bunu yansıtacak şekilde güncellenebilir?
Adam

1
Yeni bir cevap vermekten çekinmeyin
Kirby

38

İçin Bahar 4 ben aşağıdakileri kullanın
(soru 4 yaşında ve daha fazla kişi Bahar 3.1 den Bahar 4 kullandıkça ben ilanıyla):

@Configuration
@ComponentScan(basePackages = "com.example", 
  excludeFilters = @Filter(type=FilterType.REGEX,pattern="com\\.example\\.ignore\\..*")) 
public class RootConfig {
    // ...
}

13

Görünüşe göre bunu XML aracılığıyla yapmışsınız, ancak yeni Bahar en iyi uygulamasında çalışıyorsanız, yapılandırmanız Java'da olacaktır ve bunları şu şekilde hariç tutabilirsiniz:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "net.example.tool",
  excludeFilters = {@ComponentScan.Filter(
    type = FilterType.ASSIGNABLE_TYPE,
    value = {JPAConfiguration.class, SecurityConfig.class})
  })

9
@JonathanW Ancak yine de, bu sayfaya bir google aramasından gelen insanlar için gerçekten yararlı bir cevap
Stewart

12

Bu, Bahar 3.0.5'te çalışır. Yani, 3.1'de çalışacağını düşünürdüm

<context:component-scan base-package="com.example">  
    <context:exclude-filter type="aspectj" expression="com.example.dontscanme.*" />  
</context:component-scan> 

1
Sınıf yolunda sinifj'nin olmaması durumunda dışlamayı sessizce görmezden geldiğine dikkat edin.
Vadzim

7

Bence paketlerinizi daha uygun bir hiyerarşi içinde yeniden düzenlemelisiniz, böylece temel paketin dışında kalırlar.

Ancak bunu yapamazsanız şunu deneyin:

<context:component-scan base-package="com.example">
    ...
    <context:exclude-filter type="regex" expression="com\.example\.ignore.*"/>
</context:component-scan>

Burada daha fazla örnek bulabilirsiniz: Taramayı özelleştirmek için filtreleri kullanma


Teşekkürler, prensip olarak yeniden düzenleme fikrine katılıyorum - bu benim ilk düşüncemdi. Ne yazık ki, benim özel durumum için pek iyi bir seçenek değil.
HolySamosa

İyi ambalaj tasarımı bu durumların önüne geçebilir, ancak yapamazsanız ... hahaha yapamazsınız :)
richarbernal

4

Benim için işe yarayan bir şey şudur:

@ComponentScan(basePackageClasses = {SomeTypeInYourPackage.class}, resourcePattern = "*.class")

Veya XML'de:

<context:component-scan base-package="com.example" resource-pattern="*.class"/>

Bu, varsayılan resourcePatternolanı geçersiz kılar "**/*.class".

Bu, YALNIZCA temel paketinizi dahil etmenin en güvenli yol gibi görünebilir, çünkü bu resourcePattern her zaman aynı ve temel paketinize göre olacaktır.


2

Ayrıca kullanabilirsin @SpringBootApplication : Bahar belgelerine göre aşağıdaki üç ek açıklamalar da aynı özelliğe yapar @Configuration , @EnableAutoConfiguration @ComponentScan bir göstermeyiz.

@SpringBootApplication(exclude= {Foo.class})
public class MySpringConfiguration {}

Javadoc göre excludeolan belirli bir otomatik yapılandırma sınıfları hariç bileşen tarama, tüm sınıfları. Denerseniz, " Aşağıdaki sınıflar, otomatik yapılandırma sınıfları olmadıkları için hariç tutulamaz " hatası alırsınız .
Abhijit Sarkar

1

Ayrıca belirli bir paketi dahil edebilir ve bunları aşağıdaki gibi hariç tutabilirsiniz:

Dahil et ve hariç tut (her ikisi)

 @SpringBootApplication
        (
                scanBasePackages = {
                        "com.package1",
                        "com.package2"
                },
                exclude = {org.springframework.boot.sample.class}
        )

SADECE Hariç Tut

@SpringBootApplication(exclude= {com.package1.class})
public class MySpringConfiguration {}

Javadoc göre excludeolan belirli bir otomatik yapılandırma sınıfları hariç bileşen tarama, tüm sınıfları. Denerseniz, " Aşağıdaki sınıflar, otomatik yapılandırma sınıfları olmadıkları için hariç tutulamaz " hatası alırsınız .
Abhijit Sarkar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.