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. c#中适配器模式详解

    基础介绍:   想象这样一个场景,原项目中接口返回的数据是XML格式的数据,但现在来了一个新客户,它期望接口返回的数据类型为json格式的.   想要实现要么就是改原有接口,但这样就违反了开闭原则,容 ...

  2. 中兴GoldenDB(MYSQL)营运商SQL优化案例(超复杂SQL)

    陆老师好久没找我,今天他在营运商遇到2条性能慢的SQL,说找了好多专家老手看了都优化不了,然后就找到我打算给我玩玩. 第一次接触营运商行业的SQL,妈呦还真的复杂  SQL1: SELECT WORK ...

  3. Java Springbool敏感词过工具类滤

    Java Springbool敏感词过工具类滤 1. 功能描述利用前缀树这种数据结构,设计并开发出敏感词过滤工具. 2. 构建敏感词表resource/sensitive-words.txt 3. 敏 ...

  4. 🔥🔥面试官:你会如何设计QQ中的网络协议?

    引言 在设计QQ这道面试题时,我们需要避免进入面试误区.这意味着我们不应该盲目地开展头脑风暴,提出一些不切实际的想法,因为这些想法可能无法经受面试官的深入追问.因此,我们需要站在前人的基础上,思考如何 ...

  5. mobaxterm软件的使用

    MobaXterm是一款功能强大的多功能远程计算机管理软件,可以在Windows操作系统下运行,支持SSH.Telnet.RDP.VNC等协议 一.软件下载与安装 下载地址:https://mobax ...

  6. 错误记录-MariaDB连接异常

    简介: 问题: C#,VS2022,mariadb-10.11.5-winx64,using MySql.Data.MySqlClient; 在执行connection.Open()时抛出异常:Sys ...

  7. vue+element-ui小笔记

    1.图片加载失败,给默认图 2.form表单中,输入框加回车事件,页面刷新,如何解决? 3.使用在线主题生成工具,修改element自定义主题色 1.图片加载失败,给默认图,两种解决方法: 方法一: ...

  8. 2018CCPC桂林 A(贪心,思维)

    题目 分析:首先发现将大的数放在小的数前面结果更优,于是想到通过比较元素大小的方式将两个数组合并,大的放前面小的放后面,但很容易就能想到比这样合并更优的方案.一开始我是想先按这种方式进行合并,然后将最 ...

  9. 现代统计分析软件Datainside在学生成绩分析中的应用

    Datainside(薪火数据)是一款非常常用的统计分析软件,广泛应用于学术研究和商业领域. 在学生成绩分析方面,Datainside提供了丰富的功能和工具,可以帮助教育机构和研究人员深入理解学生的学 ...

  10. vertx的学习总结2

    一.什么是verticle verticle是vertx的基本单元,其作用就是封装用于处理事件的技术功能单元  (如果不能理解,到后面的实战就可以理解了) 二.写一个verticle 1. 引入依赖( ...