Solon2 开发之IoC,四、注入依赖与初始化
Solon 强调 有克制的注入 + 手动控制 结合的模式。好处是,代码用料少、启动快。
Bean 的关键生命节点:
| 节点 | 说明 |
|---|---|
| 1. Constructor(构造方法) | 不支持参数注入 |
| 2. @Inject(注入) | 基于订阅,不确定具体依赖什么时候会被注入 |
| 3. @Init(初始化) | 在容器扫描完成时执行,所有的依赖注入已完成 |
下面讲几种基于注入的初始化依赖,以助了解以上特性:
1、基于关系的简单初始化依赖:
@Configuration
public class DsConfig {
@Bean
public DataSource ds(@Inject("${demo.ds1}") HikariDataSource ds){
return ds; //构建数据源bean
}
@Bean
public void init(@Inject DataSource ds){
//初始化结构。数据源bean产生后,才会触发这个函数。从而形成简单的强制依赖关系。
SchemaUtils.init(ds);
}
}
2、基于关系的初始化依赖(反例):
2.1、不适合的场景:
@Component
public void DsHelper{
@Inject
DataSource ds; //注入数据源Bean //提示:@Inject 是异步的。DsHelper 组件生成时,ds 有可能并未完成注入
}
@Configuration
public class DsConfig {
@Bean
public DataSource ds(@Inject("${demo.ds1}") HikariDataSource ds){
return ds; //构建数据源bean
}
@Bean
public void init(@Inject DsHelper helper){
//初始化结构。此时 helper.ds 可能还是 null(因为ds是异步注入的)
SchemaUtils.init(helper.ds);
}
}
2.2、借用顺序的初始化依赖:
上例的“不适合的场景”,可以通过如下改造(但也显复杂和别扭):
@Component
public void DsHelper{
@Inject
DataSource ds; //注入数据源Bean //提示:@Inject 是异步的。DsHelper 组件生成时,ds 有可能并未完成注入
}
@Configuration
public class DsConfig {
@Bean
public DataSource ds(@Inject("${demo.ds1}") HikariDataSource ds){
return ds; //构建数据源bean
}
@Inject
DsHelper helper;
@Init
public void init(){
//初始化结构。此处,所有的Bean注入都已完成
SchemaUtils.init(helper.ds);
}
}
如果结构初始化后,再跟一个数据初始化
@Configuration
public class DataConfig {
@Inject
DsHelper helper;
@Init(index = 1) //默认为自动,也可以手动指定初始化执行顺序
public void init(){
//初始化数据
DataUtils.init(helper.ds);
}
}
注意:这个样例是故意设计出来的,不一定适合生产应用。
Solon2 开发之IoC,四、注入依赖与初始化的更多相关文章
- Solon 开发,八、注入依赖与初始化
Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...
- JavaEE开发之Spring中的依赖注入与AOP
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- JavaEE开发之Spring中的依赖注入与AOP编程
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- Spring注解驱动开发之Ioc容器篇
前言:现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解.原理,比如@Conditional.@Import.@Ena ...
- ios开发之Quartz2D 四:画饼图
#import "PieView.h" @implementation PieView - (void)drawRect:(CGRect)rect { // Drawing cod ...
- web 开发之js---JS变量也要注意初始化
原先以为js作为弱类型语言,变量的初始化没必要,但是: var text; text+="你好"; alert(text); 对话框弹出的内容是:"undefined你好 ...
- JavaEE开发之Spring中Bean的作用域、Init和Destroy方法以及Spring-EL表达式
上篇博客我们聊了<JavaEE开发之Spring中的依赖注入以及AOP>,本篇博客我们就来聊一下Spring框架中的Bean的作用域以及Bean的Init和Destroy方法,然后在聊一下 ...
- spring IOC中四种依赖注入方式
在spring ioc中有三种依赖注入,分别是:https://blog.csdn.net/u010800201/article/details/72674420 a.接口注入:b.setter方法注 ...
- 转:深入浅出spring IOC中四种依赖注入方式
转:https://blog.csdn.net/u010800201/article/details/72674420 深入浅出spring IOC中四种依赖注入方式 PS:前三种是我转载的,第四种是 ...
- 细数Javascript技术栈中的四种依赖注入
作为面向对象编程中实现控制反转(Inversion of Control,下文称IoC)最常见的技术手段之一,依赖注入(Dependency Injection,下文称DI)可谓在OOP编程中大行其道 ...
随机推荐
- 🔥🔥Java开发者的Python快速进修指南:函数基础
话不多说,今天我们要介绍的是函数.本系列文章追求短而精,今天我们将重点讨论函数以及与Java方法的区别.与Java方法不同,函数不需要像Java方法一样讲究修饰符等其他特性,它只需要使用"d ...
- Educational Codeforces Round 125 (Rated for Div. 2) E. Star MST
折磨了我三天的\(DP\),终于看懂啦. 首先,如果想要有题目要求的效果,那么最短的边一定都是与\(1\)相连的,就是一个菊花图,生成树里的边就是最短的边. \(f[i][j]\)表示已经有\(i\) ...
- 如何在langchain中对大模型的输出进行格式化
简介 我们知道在大语言模型中, 不管模型的能力有多强大,他的输入和输出基本上都是文本格式的,文本格式的输入输出虽然对人来说非常的友好,但是如果我们想要进行一些结构化处理的话还是会有一点点的不方便. 不 ...
- jdk所有版本-自留收藏
链接:https://pan.baidu.com/s/1NDbEAEbKeh8xFzjEwB8aLg 提取码:0000
- 【Javaweb】Servlet六 | HttpServletRequest类的含义及其使用方法【详解】
HttpServletRequest类的作用 每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的Http协议信息解析好封装到Request对象中.然后传递到Service方法(d ...
- bi报表软件开发的特点什么,产品和流程?
BI报表软件是一种针对企业数据分析和决策支持的工具,具有高度灵活性和易用性.在当前数据化的时代,越来越多的企业开始关注BI报表软件的开发和应用,因为它们可以帮助企业更好地管理数据,更好地进行商业决策. ...
- java如何导入导出excel
在Java中,可以使用多种方式导入和导出Excel文件.下面将详细介绍几种常见的方法及其实现步骤: 1. Apache POI库: Apache POI是一个开源的Java库,提供了许多类和方法用于处 ...
- vertx 的http服务表单提交与mysql验证
1.依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:/ ...
- SLR(1)分析法
由于LR(0)的能力实在是太弱了.例如: I = { X=>α·bβ, A=>α·, B=>α· } 这时候就存在两个冲突. 1.移进和规约的冲突: 2.规约和规约的冲突. SLR( ...
- Scrapy如何在爬虫类中导入settings配置
假设我们在settings.py定义了一个IP地址池 ##### 自定义设置 IP_PROXY_POOL = ( "127.0.0.1:6789", "127.0.0.1 ...