| 属性 | 说明 | 
| -------- | -------- | 
| value     |      | 
| required     | 必需的       | 
| autoRefreshed     | 自动刷新（配置注入时有效，且单例才有自动刷新的必要）     | 

* 可注入到 “类字段”、“静态字段”、“组件构造参数”、“@Bean 方法参数”（不支持属性注入）
* 可支持 “Bean”、“配置”、“环境变量” 注入


### 1、注入Bean

注入时，如果目标 bean 已存于容器中，则直接注入。如果未存在则进行订阅注入，即当目标 bean 注册时，会自动完成注入；否则字段保持初始值不变。

根据类型注入 bean

```java
@Component
public class UserService{
}

@Controller
public class Demo{
    @Inject
    UserService userService;
}
```

根据名字注入 bean

```java
@Component("userService")
public class UserService{
}

@Controller
public class Demo{
    @Inject("userService")
    UserService userService;
}
```

注入一批 Bean

```java
@Component
public class DemoService{
    @Inject
    private List<EventService> eventServices;
    
    @Inject
    private Map<String, EventService> eventServiceMap;
}

@Configuration
public class DemoConfig{
    @Bean
    public void demo1(@Inject List<EventService> eventServices){ }
    
    @Bean
    public void demo2(@Inject Map<String, EventService> eventServiceMap){ }
}
```

### 2、注入配置

配置注入时，没有找到相应的属性时会报异常（可通过 required = false 关掉），如果后期会动态修改属性且需要自动刷新时（可通过 autoRefreshed = true 开启）。主要配置格式有：

* `${xxx}` 注入属性
* `${xxx:def}` 注入属性，如果没有提供 def 默认值。 //只支持单值接收（不支持集合或实体）
* `${classpath:xxx.yml}` 注入资源目录下的配置文件 xxx.xml

为字段注入

```java
@Component
public class Demo{
    @Inject(value = "${user.name}", autoRefreshed=true) //可以注入单个值，顺带演示自动刷新（非单例，不要启用）
    String userName;

    @Inject("${user.config}") //可以注入结构体
    UserConfig userConfig;
}
```


为参数注入。仅对 @Bean 注解的函数有效


```java
@Configuration
public class Config{
    @Bean
    public UserConfig config(@Inject("${user.config}") UserConfig uc){
        return uc;
    }
}
```


<mark>为结构体注入，并交由容器托管。仅对 @Configuration 注解的类有效</mark>


```java
//@Inject("${classpath:user.config.yml}")  //也可以注入一个配置文件 
@Inject("${user.config}")  
@Configuration
public class UserConfig{
    public String name;
    public List<String> tags;
    ...
}

//别处可以注入复用
@Inject
UserConfig userConfig;
```


### 3、注入环境变量

当使用如此注入配置时，不存在配置，且名字全为大写时。则尝试获取环境变量并注入

* `${XXX}` 注入属性
* `${XXX:def}` 注入属性，如果没有提供 def 默认值。 //只支持单值接收（不支持集合或实体）


```java
@Configuration
public class Config{
    @Bean
    public void test(@Inject("${JAVA_HOME}") String javaHome){
        
    }
}
```

### 4、将配置转为 Bean 注入时的处理说明



* 如果有 Properties 入参的构造函数，会执行这个构建函数 new(Properties)
* 如果没有，new() 之后按字段名分别注入配置


### 5、关于 Bean 以接口形式注入的说明

* 组件的一级实现接口，可以被注入

案例分析：

```java
public interface DemoService{}
public class BaseDemoService : DemoService{}
@Component
public class DemoServiceImpl extends BaseDemoService{}
```

此时 “DemoService” 是不能注入的

```java
@Component
public class DemoTest{
    @Inject 
    DemoService demoService;
}
```

需要调整一下，增加实现 “DemoService” 接口

```java
@Component
public class DemoServiceImpl extends BaseDemoService implements DemoService{}
```

* 或者以接口返回构建的 Bean

```java
public class DemoConfig{
    @Bean
    public DemoService demo1(){
        return new DemoServiceImpl();
    }
    
    @Bean
    publi DataSource demo2(){
        return new ...;
    }
}
```
