@Configuration 注解：

* 作用域为类，专门用于配置构造、初始化、组件组装。

@Bean （或 @Managed）注解：

* 只能在 @Configuration 类里使用，且只能加在函数上
* <mark>且，只支持注在 public 函数上</mark>
* 只是把对象注册到容器（<mark>对象身上有什么注解，不会做处理；也不会自动加代理</mark>）
* 可以返回 void 或 null（比如，做些初始化配置的活）

它们主要有三种使用场景： 

### 1、 绑定配置模型

```java
@BindProps(prefix="liteflow") //@BindProps 作用在类上，只与 @Configuration 配合才有效 
@Configuration
public class LiteflowProperty {
    private boolean enable;
    private String ruleSource;
    private String ruleSourceExtData;
    ...
}


@Configuration
public class LiteflowConfiguration {
    @BindProps(prefix="liteflow") //@BindProps 作用在方法上，只与 @Bean 配合才有效 
    @Bean // 或 @Managed （v3.5 后支持）
    public LiteflowProperty liteflowProperty(){
        return new LiteflowProperty();
    }
}
```

### 2、 构建或组装对象进入容器

尽量以参数形式注入，可形成依赖约束。可以返回 null，复杂的条件可以在函数内处理。

```java
@Configuration
public class DemoConfig {
   @Bean(value = "db1", typed = true) // 或 @Managed （v3.5 后支持）
   public DataSource db1(@Inject("${demo.db1}") HikariDataSource ds){
       return ds;
   }
   
   //可以返回 void
   @Bean // 或 @Managed （v3.5 后支持）
   public void db1_cfg(@Db("db1") MybatisConfiguration cfg) {
       MybatisPlusInterceptor plusInterceptor = new MybatisPlusInterceptor();
       plusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

       cfg.setCacheEnabled(false);
       cfg.addInterceptor(plusInterceptor);
   }
    
    //也可以带条件处理（可以返回 null）
    @Bean // 或 @Managed （v3.5 后支持）
    public CacheService cache(@Inject("${cache.enable}") boolean enable, 
                              @Inject("${cache.config}") CacheServiceSupplier supper){
        if(enable){
            return supper.get();
        }else{
            return null;
        }
    }
}
```

### 3、 初始化一些设置

```java
@Configuration
public class Config {
    @Bean // 或 @Managed （v3.5 后支持）
    public AuthAdapter adapter() {
        return new AuthAdapter()
                .loginUrl("/login") //设定登录地址，未登录时自动跳转
                .addRule(r -> r.include("**").verifyIp().failure((c, t) -> c.output("你的IP不在白名单"))) //添加规则
                .addRule(b -> b.exclude("/login**").exclude("/_run/**").verifyPath()) //添加规则
                .processor(new AuthProcessorImpl()) //设定认证处理器
                .failure((ctx, rst) -> { 
                    ctx.render(rst);  //设定默认的验证失败处理；也可以用过滤器捕促异常
                });
    }
}
```


