Solon

@Inject 用法说明

属性说明
value
required必需的(配置注入时有效) //v1.10.7 开始启用
autoRefreshed自动刷新(配置注入时有效,且单例才有自动刷新的必要)

1、注入Bean

注入Bean时,仅能用到 value 属性

根据类型注入 bean

@Service
public class UserService{
}

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

根据名字注入 bean

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

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

2、注入配置

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

  • ${xxx} 注入属性
  • ${xxx:def} 注入属性,如果没有提供 def 默认值
  • ${classpath:xxx.yml} 注入资源目录下的配置文件 xxx.xml

为字段注入

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

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

为结构体注入。仅对 @Configuration 注解的类有效

@Inject("${user.config}")  
@Configuration
public class UserConfig{
    ...
}

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

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

3、提示:不支持构造函数注入与属性设置注入

  • 不支持的:
@Component
public class Demo{
    private A a;
    private B b;
    
    public Demo(@Inject A a){
        this.a = a;
    } 
    
    public void setB(@Inject B b){
        this.b = b;
    }
}
  • 支持的:
@Component
public class Demo{
    @Inject
    private A a;
    
    @Inject
    private B b;
    
    //@Init
    //public void initDo(){
    //    //Solon 的注入是异步的。想要对注入的 bean 进行实始化,需要借用 @Init 函数
    //}
}