724 Stimmen

Unterschied zwischen <context:annotation-config> und <context:component-scan>

Ich lerne gerade Spring 3 und scheine die Funktionalität dahinter nicht zu verstehen <context:annotation-config> y <context:component-scan> .

Nach dem, was ich gelesen habe, scheinen sie unterschiedlich zu handeln Anmerkungen ( @Required , @Autowired usw. gegen @Component , @Repository , @Service usw.), aber auch von dem, was ich gelesen habe, registrieren sie die gleichen Bohnen-Postprozessor Klassen.

Um mich noch mehr zu verwirren, gibt es eine annotation-config Attribut auf <context:component-scan> .

Kann jemand etwas Licht auf diese Tags werfen? Was ist ähnlich, was ist anders, wird das eine durch das andere ersetzt, ergänzen sie sich gegenseitig, brauche ich eines davon, beide?

31voto

Sparticles Punkte 608

Der Unterschied zwischen den beiden ist ganz einfach!

<context:annotation-config /> 

Ermöglicht die Verwendung von Annotationen, die sich auf die Verdrahtung von Eigenschaften und Konstruktoren von Beans beschränken!

Wo als

<context:component-scan base-package="org.package"/> 

Ermöglicht alles, was <context:annotation-config /> tun können, mit dem Zusatz der Verwendung von Stereotypen z. B.. @Component , @Service , @Repository . Sie können also ganze Beans verkabeln und sind nicht nur auf Konstruktoren oder Eigenschaften beschränkt!

19voto

Manuel Jordan Punkte 13519
<context:annotation-config>

Nur löst die @Autowired y @Qualifer Anmerkungen, das ist alles, es geht um die Injektion von Abhängigkeiten Es gibt noch andere Anmerkungen, die die gleiche Aufgabe erfüllen, ich denke, wie @Inject sondern alles über die Auflösung von DI durch Anmerkungen.

Beachten Sie, dass Sie, auch wenn Sie die <context:annotation-config> Element, müssen Sie erklären, dass Ihre Klasse, wie eine Bohne sowieso, denken Sie daran, wir haben drei Optionen zur Verfügung

  • XML: <bean>
  • @Anmerkungen: @Komponente, @Dienst, @Repository, @Controller
  • JavaConfig: @Konfiguration, @Bean

Jetzt mit

<context:component-scan>

Sie erfüllt zwei Aufgaben:

  • Es durchsucht alle Klassen, die mit @Component, @Service, @Repository, @Controller und @Configuration annotiert sind und erstellt eine Bean
  • Sie erfüllt dieselbe Aufgabe wie <context:annotation-config> tut.

Wenn Sie also erklären, dass <context:component-scan> nicht mehr notwendig ist, zu erklären <context:annotation-config> auch.

Das ist alles

Ein häufiges Szenario war zum Beispiel die Deklaration einer Bean über XML und die Auflösung der DI über Annotationen, zum Beispiel

<bean id="serviceBeanA" class="com.something.CarServiceImpl" />
<bean id="serviceBeanB" class="com.something.PersonServiceImpl" />
<bean id="repositoryBeanA" class="com.something.CarRepository" />
<bean id="repositoryBeanB" class="com.something.PersonRepository" />

Wir haben nur die Bohnen deklariert, nichts über <constructor-arg> y <property> wird die DI in ihren eigenen Klassen durch @Autowired konfiguriert. Das bedeutet, dass die Dienste @Autowired für ihre Repositories-Komponenten verwenden und die Repositories @Autowired für die Komponenten JdbcTemplate, DataSource usw. verwenden.

15voto

Sachin Sharma Punkte 585

El <context:annotation-config> Tag weist Spring an, die Codebasis nach automatisch aufzulösenden Abhängigkeitsanforderungen der Klassen zu durchsuchen, die die @Autowired-Annotation enthalten.

Spring 2.5 unterstützt auch JSR-250-Annotationen wie @Resource, @PostConstruct und @PreDestroy. Die Verwendung dieser Annotationen erfordert auch, dass bestimmte BeanPostProcessors im Spring-Container registriert werden. Wie immer können diese als individuelle Bean-Definitionen registriert werden, aber sie können auch implizit registriert werden, indem man <context:annotation-config> Tag in der Federkonfiguration.

Entnommen aus der Frühjahrsdokumentation von Anmerkungsbasierte Konfiguration


Spring bietet die Möglichkeit, "stereotypisierte" Klassen automatisch zu erkennen und entsprechende BeanDefinitionen im ApplicationContext zu registrieren.

Nach der Javadoc von org.springframework.stereotype :

Stereotypen sind Anmerkungen, die die Rollen von Typen oder Methoden in der Gesamtarchitektur bezeichnen (auf konzeptioneller und nicht auf Implementierungsebene). Beispiel: @Controller @Service @Repository usw. Diese sind für die Verwendung durch Tools und Aspekte gedacht (und damit ein ideales Ziel für Pointcuts).

Zur automatischen Erkennung solcher "Stereotyp"-Klassen, <context:component-scan> Tag erforderlich ist.

El <context:component-scan> Tag weist Spring auch an, den Code nach injizierbaren Beans unter dem angegebenen Paket (und allen Unterpaketen) zu durchsuchen.

7voto

Lovababu Padala Punkte 2331
<context:component-scan /> implicitly enables <context:annotation-config/>

versuchen mit <context:component-scan base-package="..." annotation-config="false"/> in Ihrer Konfiguration @Dienst, @Repository, @Komponente funktioniert gut, aber @Autowired,@Ressource y @Inject funktioniert nicht.

Dies bedeutet AutowiredAnnotationBeanPostProcessor wird nicht aktiviert und der Spring-Container verarbeitet die Autowiring-Annotationen nicht.

5voto

Abdullah Khan Punkte 10576
<context:annotation-config/> <!-- is used to activate the annotation for beans -->
<context:component-scan base-package="x.y.MyClass" /> <!-- is for the Spring IOC container to look for the beans in the base package. -->

Ein weiterer wichtiger Punkt ist, dass context:component-scan ruft implizit die context:annotation-config um die Anmerkungen zu Beans zu aktivieren. Nun, wenn Sie nicht wollen context:component-scan um implizit Anmerkungen für Sie zu aktivieren, können Sie weiterhin das annotation-config-Element der context:component-scan à false .

Zusammengefasst:

<context:annotation-config/> <!-- activates the annotations --> 
<context:component-scan base-package="x.y.MyClass" /> <!-- activates the annotations + register the beans by looking inside the base-package -->

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X