---
# System prepended metadata

title: Spring配置注解
tags: [Spring-bean的自動裝配]

---

# 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等注入注解只会被注入一次！