Bean 在容器里是有两层信息：

* 自身包装器的“元信息”
* 包装后，在容器里的“注册信息”（一个包装，可以有多条注册记录）



### 1、剖析 Bean 的装包与注册过程

比如，用配置器装配一个 Solon Bean (本质是装配出一个 BeanWrap，并自动注册到容器）：

```java
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration;

@Configuration
public class Config{
    //同时以名字和类型进行注册 //支持类型或名字注入
    @Bean(name="demo", typed=true) 
    public DemoService demo(){
        return new DemoServiceImpl();
    }
}
```

以上代码。转成全手动操控的完整过程如下（内部差不多就这么处理，<mark>不要把它用于日常开发</mark>）：

```java
import org.noear.solon.Solon;
import org.noear.solon.core.BeanWrap;

DemoService bean = new DemoServiceImpl();

//::自身包装器的元信息::
BeanWrap bw = new BeanWrap(Solon.context(), DemoServiceImpl.class, bean, "demo", true);

//::在容器里的注册信息::
Solon.context().putWrap("demo", bw); //实现上面配置器的效果，需要四行代码
Solon.context().putWrap("org.demo.DemoServiceImpl", bw);
Solon.context().putWrap(DemoServiceImpl.class, bw);
Solon.context().putWrap(DemoService.class, bw);
Solon.context().putWrap("org.demo.DemoServiceImpl<D>", bw); //如果是泛型还会这两条
Solon.context().putWrap("org.demo.DemoService<T,Y>", bw);

Solon.context().beanDeliver(bw); //交付特殊接口
Solon.context().beanPublish(bw); //对外发布（广播订阅）
```

### 2、可以这样获取刚才的 BeanWrap<mark>（内部基于 hashCode 快速查找）</mark>

```java
import org.noear.solon.Solon;

//这是常用的获取方式
Solon.context().getWrap("demo");
Solon.context().getWrap(DemoService.class);

//也可以
Solon.context().getWrap("org.demo.DemoServiceImpl"); //获取的 BeanWrap::name() 是 "demo"
Solon.context().getWrap(DemoServiceImpl.class);
```

基于 hashCode 查找及注入，可以支持容器更快启动。




### 3、注解 @Bean 与 @Component 的注册，会同时注册"一级"实现接口


* 同时注册"一级"实现接口
* 但，不注册“深度”实现的接口

组件定义示例：

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

@Component
public class UserServiceImpl implements UserService {}
public interface UserService extends ServiceBase {}
public interface ServiceBase {}
```

对应的注册：

```java
import org.noear.solon.Solon;

Solon.context().putWrap(UserServiceImpl.class, bw);
Solon.context().putWrap(UserService.class, bw); //ServiceBase 则不会注册
```




