1、如何注入Bean?

先了解一下Bean生命周期的简化版:

  1. 运行构建函数
  2. 尝试字段注入(有时同步注入,没时订阅注入。不会有相互依赖而卡住的问题)
  3. @Init 函数(是在容器初始化完成后才执行)
  4. ...
  5. 释放(基本不会发生)

了解这个生命过程后,可以知道注入的内容,在构建函数里是不可用的:

@Service
public class DemoService{ //通过bean type注入(注入是异步的,不能在构造函数里使用)
@Inject
private TrackService trackService; //通过bean name注入
@Inject("userService")
private UserService userService; public DemoService(){
//注入的Bean,不能在构造函数里使用。在生命周期时,构建先于注入
} @Init
public void init(){
//注入的Bean,需要进一步做初始化,请在处理
}
}

引用已有 Bean 构建新的 Bean:

@Configuration
public class DemoConfig{
//提示:@Bean 只能与 @Configuration 配合
@Bean("ds3")
public DataSource init(@Inject("ds1") DataSource ds1, @Inject("ds2") DataSource ds2){
Map<String, DataSource> dsMap = new HashMap<>();
dsMap.put("ds1", ds1);
dsMap.put("ds2", ds2); DynamicDataSource tmp = new DynamicDataSource();
tmp.setStrict(true);
tmp.setTargetDataSources(dsMap);
tmp.setDefaultTargetDataSource(ds1); return tmp;
}
}

2、如何手动获取Bean?

  • 同步获取
public class DemoService{
private TrackService trackService;
private UserService userService; public DemoService(){
//同步方式,根据bean type获取Bean(如果此时不存在,则返回null。需要注意时机)
trackService = Solon.context().getBean(TrackService.class); //同步方式,根据bean type获取Bean(如果此时不存在,自动生成一个Bean并注册+返回)
trackService = Solon.context().getBeanOrNew(TrackService.class); //同步方式,根据bean name获取Bean(如果此时不存在,则返回null)
userService = Solon.context().getBean("userService");
}
}
  • 异步获取(如果存在,会直接回调;如果没有,目标产生时会通知回调)
public class DemoService{
private TrackService trackService;
private UserService userService; public DemoService(){
//异步订阅方式,根据bean type获取Bean(已存在或产生时,会通知回调;否则,一直不回调)
Solon.context().getBeanAsync(TrackService.class, bean-> {
trackService = bean; //bean 获取后,可以做些后续处理。。。
}); //异步订阅方式,根据bean name获取Bean
Solon.context().getBeanAsync("userService", bean-> {
userService = bean;
});
}
}

注入模式是必须要被扫描到的。有时候不方便扫描,或者不必扫描,那手动模式就是很大的一种自由。

3、获取一批有特征的Bean?

  • 通过订阅接口
context.subBeansOfType(DataSource, bean->{
//获取所有 DataSource Bean
//一般由:@Component 产生 或者 @Configuration + @Bean 产生
}); context.subWarpsOfType(DataSource, bw->{
// bw.name() 获取 bean name
// bw.get() 获取 bean
//一般由:@Component 产生 或者 @Configuration + @Bean 产生
});
  • 通过容器加载完成事件 beanOnloaded ,遍历已注册的 Bean
//在 beanOnloaded 事件进进行遍历,确保所有 Bean 已处理完成

//a. 获取 name "share:" 开头的 bean  //context:AopContext
context.beanOnloaded((ctx) -> {
ctx.beanForeach((k, v) -> {
if (k.startsWith("share:")) {
render.putVariable(k.split(":")[1], v.raw());
}
});
}); //b. 获取 IJob 类型的 bean //context:AopContext
context.beanOnloaded((ctx) -> {
ctx.beanForeach((v) -> {
if (v.raw() instanceof IJob) {
JobManager.register(new JobEntity(v.name(), v.raw()));
}
});
});

Solon2 开发之IoC,三、注入或手动获取 Bean的更多相关文章

  1. Solon 开发,二、注入或手动获取Bean

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  2. Solon 开发,一、注入或手动获取配置

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  3. Spring注解驱动开发之Ioc容器篇

    前言:现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解.原理,比如@Conditional.@Import.@Ena ...

  4. Solon Aop 特色开发(1)注入或手动获取配置

    常规操作,先启动 Solon public class App{ public void main(String[] args){ Solon.start(App.class, args); } } ...

  5. web开发之Servlet 三

    昨天我们学习了Servlet的运行过程和生命周期,那么今天我们学习下Servlet中非常重要的两个类:ServletConfig  ServletContext 我们可以看到,与顶层Servlet主动 ...

  6. Spring_手动获取Bean

    1.SpringContextHolder.java package com.lkb.util; import org.springframework.context.ApplicationConte ...

  7. springmvc手动获取bean

    @Service @Lazy(false) public class SpringContextHolder implements ApplicationContextAware, Disposabl ...

  8. 使用spring手动获取Bean的时候,不能强转回它自己。

    这个问题好像有点长,描述一下: 就是通过类名的方式获取Bean后,得到一个Object对象,但是这个Object不能再强转回Bean了.抛出的异常时类型转换异常.  java.lang.ClassCa ...

  9. Springboot手动获取bean

    使用如下工具类即可 package com.rio.ums.spa.commons.utils; import org.springframework.beans.BeansException; im ...

  10. spring ioc三种注入方式

    spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...

随机推荐

  1. Java之对象内存分析

    相信大家有时候在读代码的时候应该都会有以下情况: 这个对象本定义在上面,乱跑什么?怎么又到下面去了? 欸?我明明改变了这个对象的值,怎么没变呢? 要想搞清楚某一对象在程序中是怎样活蹦乱跳的,首先我们要 ...

  2. RLHF · PBRL | RUNE:鼓励 agent 探索 reward model 更不确定的 (s,a)

    论文题目: Reward uncertainty for exploration in preference-based reinforcement learning,是 ICLR 2022 的文章, ...

  3. Python根据输入的公司编号、名称、网址,格式化输出公司信息。其中1)冒号统一为英文冒号,编号占6位,不足6位的前面补0。编号后面是制表符。

    根据输入的公司编号.名称.网址,格式化输出公司信息.其中 1)冒号统一为英文冒号,编号占6位,不足6位的前面补0.编号后面是制表符. 2)"公司名称:" 后面输出字符串占8位,左对 ...

  4. python列表之部分列表——切片

    目录 切片 全索引 半索引 负数索引 遍历切片 复制列表 切片 全索引 我们平常可能需要使用一个列表中的子列表,也就是部分元素,这个时候我们就需要用到切片这个功能啦 要创建切片,就如同range()函 ...

  5. Mysql不同数据库之间表结构同步

    开发环境的Mysql表结构做了修改,要同步到其他环境数据库中使用数据库管理工具JookDB的表结构同步功能就很方便.虽然Navicat也有这个功能但是有免费的当然是用免费的. 用JookDB添加数据库 ...

  6. 可视化学习:WebGL的基础使用

    引言 继续复习可视化的学习.WebGL和其他Web端的图形系统存在很大的不同,是OpenGL ES规范在浏览器的实现,它最大的不同就在于它更接近底层,可以由开发者直接操作GPU来实现绘图,性能很好,可 ...

  7. python3使用pandas备份mysql数据表

    操作系统 :CentOS 7.6_x64 Python版本:3.9.12 MySQL版本:5.7.38 日常开发过程中,会遇到mysql数据表的备份需求,需要针对单独的数据表进行备份并定时清理数据. ...

  8. mysql的begin end嵌套

    这个教程基本很少,因为这个很简单,但又会让(新手)人难以完成这嵌套. 为了方便读者理解,我把不需要嵌套的也嵌套起来了.(就比如下面这几行代码) delimiter $$ drop procedure ...

  9. Linux下^m符号删除

    Linux下^m符号删除 从Windows上复制的代码到Linux尾会有M字符,通过下命令可以删除. :%s/\r//

  10. Using PostMessage/SendMessage to send keys to c# IE WebBrowser

    [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool PostM ...