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. redis 怎么样查看key的大小,多大的key才算大key?

    查看key大小的命令 # 格式memory usage [key-name]# 例如:我要查 yino_hash_key 这个key的大小,就在命令行中输入 memory usage yino_has ...

  2. Kubernetes:kube-apiserver 之准入

    kubernetes:kube-apiserver 系列文章: Kubernetes:kube-apiserver 之 scheme(一) Kubernetes:kube-apiserver 之 sc ...

  3. 计算机网络之防火墙和Wlan配置

    一.防火墙 防火墙(firewall)是一种安全设备,它的位置一般处于企业网络边界与外网交界的地方,用于隔离不信任的数据包 准确点讲,它就是隔离外网和内网的一道屏障,用于保护内部资源信息安全的一种策略 ...

  4. 本地MinIO存储服务Java远程调用上传文件

    MinIO是一款高性能.分布式的对象存储系统,它可以100%的运行在标准硬件上,即X86等低成本机器也能够很好的运行MinIO.它的优点包括高性能.高可用性.易于部署和管理.支持多租户等. Cpola ...

  5. C/C++ 开发SCM服务管理组件

    SCM(Service Control Manager)服务管理器是 Windows 操作系统中的一个关键组件,负责管理系统服务的启动.停止和配置.服务是一种在后台运行的应用程序,可以在系统启动时自动 ...

  6. 通过Spring MVC 实现 Restful 风格请求⽀持

    通过Spring MVC可以很方便地实现Restful风格的请求支持.Restful风格的请求是一种基于HTTP协议的轻量级的Web服务架构风格,它通过HTTP的GET.POST.PUT.DELETE ...

  7. Android 输入系统介绍

    目录 一.目的 二.环境 三.相关概念 3.1 输入设备 3.2 UEVENT机制 3.3 JNI 3.4 EPOLL机制 3.5 INotify 四.详细设计 4.1 结构图 4.2 代码结构 4. ...

  8. 线性代数导论MIT第二章知识点上

    线性代数导论MIT第二章求解线性方程组 2.1--2.2知识点 1.向量与线性方程组 2.不同角度看方程式 也就是矩阵的乘法原型: 以行来看方程式就是原式 以列来看方程式 以矩阵来看方程式 3.消元法 ...

  9. 本地数据备份与FTP远程数据迁移

    数据是电脑中最重要的东西.为了保证数据安全,我们经常会对数据进行备份.之前一直采用将重要数据拷贝至移动硬盘的方式实现备份,实现简单但每次都需要把所有文件拷贝一次,当文件很大时效率较低. 因此,考虑使用 ...

  10. Netty源码学习8——从ThreadLocal到FastThreadLocal(如何让FastThreadLocal内存泄漏doge)

    系列文章目录和关于我 一丶引入 在前面的netty源码学习中经常看到FastThreadLocal的身影,这一篇我们将从ThreadLocal说起,来学习FastThreadLocal的设计(< ...