### 1、配置注入

配置的注入：要么注入，要么忽略，要么异常。这个过程是同步的。

```java
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;

@Component
public class DemoCom {
    @Inject("${user.name}") //注入配置
    String userName;
}
```

<img src="/img/86b982415ecb4c8bb966f6624bdfb8fa.png" width="600" />

### 2、Bean 注入

因为扫描的顺序关系是不可预期的，在做 Bean 字段的注入处理时，目标可能“已”存在、也可能“未”存在。当未存在时，框架会进行订阅处理，“等到”目标 Bean 注册时会进行通知回调并注入。所以，这个过程可能是同步的，也可能是异步的（也可能就没有）。

```java
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;

@Component
public class DemoCom {
    @Inject("${user.name}")
    String userName;
    
    @Inject
    UserService userService; //注入Bean
}
```

<img src="/img/b33801d089c9492dabac0e3d371d943e.png" width="700" />

图中的 Bean2 有2个特点，需要注意：

* 有可能永远不会产生（比如用户没写）
* 在注册时，有些字段也可能在订阅中（注册，不会等待所有字段注入完成）


### 3、Bean 生命周期回顾

```java
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;
import org.noear.solon.core.bean.LifecycleBean;

@Component
public class DemoCom implements LifecycleBean {
    @Inject("${user.name}")
    String userName;
    
    @Inject
    UserService userService; //注入Bean
    
    public DemoCom(){
       //构建函数时，注入是不能用的
    }
    
    @Override
    public void start(){
        //所有 bean 都构建完成了（包括所有注入）//可以做些像数据初始化之类的活
    }
    
    @Override
    public void stop(){
        //一般做些释放或停止类的工作
    }
}
```
