# Spring配置注解 ###### tags: `Spring-bean的自動裝配` ## context:annotation-config和context:component-scan的區別 在使用Spring時,可以在實體類上方以註解的方式來添加,就能省去在xml文件中配置的麻煩 ```java= //等價於<bean id = "user" class="com.kuang.pojo.User"/> //@Component 組件 @Component public class User { public String name = "秦心"; } ``` 但在使用@Component註解前,需要在applicationContext.xml先添加context約束,才能讓註解作用 而context約束又分成**context:annotation-config **和**context:component-scan** ***************** ### context:annotation-config ```xml= <context:annotation-config/> ``` <context:annotation-config> 是用于激活那些已经在spring容器里注册过的bean上面的注解,也就是显示的向Spring注册 ``` AutowiredAnnotationBeanPostProcessor CommonAnnotationBeanPostProcessor PersistenceAnnotationBeanPostProcessor RequiredAnnotationBeanPostProcessor ``` 思考1:假如我们要使用如@Component、@Controller、@Service等这些注解,使用能否激活这些注解呢? **答案:单纯使用< context:annotation-config/>对上面这些注解无效,不能激活!** ### context:component-scan 指定要掃描的包,這個包下的注解就會生效 ```xml= <context:component-scan base-package=”XX.XX”/> ``` 该配置项其实也包含了自动注入上述 四个processor 的功能,因此当使用 < context:component-scan/> 后,就可以将 < context:annotation-config/> 移除了。 通过对base-package配置,就可以把controller包下 service包下 dao包下的注解全部扫描到了! ### 總結 (1)< context:annotation-config />:仅能够在已经在已经注册过的bean上面起作用。对于没有在spring容器中注册的bean,它并不能执行任何操作。 (2)< context:component-scan base-package="XX.XX"/> :除了具有上面的功能之外,还具有自动将带有@component,@service,@Repository等注解的对象注册到spring容器中的功能。 ### 思考2: 如果同时使用这两个配置会不会出现重复注入的情况呢? ### 答案: 因为< context:annotation-config />和 < context:component-scan>同时存在的时候,前者会被忽略。如@autowire,@resource等注入注解只会被注入一次!