1、手动

简单的构建:

//生成普通的Bean
Solon.context().wrapAndPut(UserService.class, new UserServiceImpl()); //生成带注解的Bean(比如:@Controller)
Solon.context().beanMake(UserServiceImpl.class);

更复杂的手动,以适应特殊的需求:

UserService bean = new UserServiceImpl();

//可以进行手动字段注入
Solon.context().beanInject(bean); //可以再设置特殊的字段
bean.setXxx("xxx"); //包装Bean(指定名字的)
BeanWrap beanWrap = Solon.context().wrap("userService", bean);
//包装Bean(指定类型的)
//BeanWrap beanWrap = Solon.context().wrap(UserService.class, bean); //以名字注册
Solon.context().putWrap("userService", beanWrap);
//以类型注册
Solon.context().putWrap(UserService.class, beanWrap);

下面2种模式,必须要被扫描到。在不便扫描,或不须扫描时手动会带来一种自由感。

2、用配置器类

本质是 @Configuration + @Bean 的组合,并且 Config 要被扫描到

@Configuration
public class Config{
//以类型进行注册(默认) //可用 @Inject(UserService.class) 注入
@Bean
public UserService build(){
return new UserServiceImpl();
} //以名字进行注册 //可用 @Inject("userService") 注入
//@Bean("userService")
//public UserService build2(){
// return new UserServiceImpl();
//} //同时以名字和类型进行注册 //支持类型或名字注入
//@Bean(name="userService", typed=true)
//public UserService build2(){
// return new UserServiceImpl();
//}
}

使用带条件的构建

@Configuration
public class Config{
@Bean
public CacheService cacheInit(@Inject("${cache.enable}") boolean enable,
@Inject("${cache.config}") CacheServiceSupplier supper){
if(enable){
return supper.get();
}else{
return null;
}
}
}

顺带,还可以借用 @Configuration + @Bean 的组合,进行初始化

@Configuration
public class Config{
@Bean
public void titleInit(@Inject("${demo.title}") String title){
Config.TITLE = title;
} @Bean
public void dsInit(@Inject("${demo.ds}") String ds) {
String[] dsNames = ds.split(","); for (String dsName : dsNames) {
Props props = Solon.cfg().getProp("demo.db-" + dsName);
if (props.size() > 0) {
//按需创建数据源
DataSource db1 = props.getBean("", HikariDataSource.class); //手动推到容器内
BeanWrap bw = Solon.context().wrap(DataSource.class, db1);
Solon.context().putWrap(dsName, bw);
}
}
}
} //
// 相对于 @Init 的区别:@Bean 是在容器扫描时执行的;@Init 是在容器扫描完成后后执行的。
//

3、使用组件注解(必须要能被扫描到)

a. 以类型进行注册(默认)

@Component
public class UserServiceImpl implements UserService{ } //通过 @Inject(UserService.class) 注入
//通过 Solon.context().getBean(UserService.class) 手动获取 //要确保组件已注册

b. 以名字进行注册

@Component("userService")
public class UserServiceImpl implements UserService{ } //通过 @Inject("userService") 注入
//通过 Solon.context().getBean("userService") 手动获取 //要确保组件已注册

c. 以名字和类型同时进行注册

@Component(name="userService", typed=true)
public class UserServiceImpl implements UserService{ } //通过 @Inject("userService") 注入
//通过 Solon.context().getBean("userService") 手动获取 //要确保组件已注册
//通过 @Inject(UserService.class) 注入
//通过 Solon.context().getBean(UserService.class) 手动获取 //要确保组件已注册

Solon2 开发之IoC,二、构建一个 Bean 的三种方式的更多相关文章

  1. Solon 开发,三、构建一个Bean的三种方式

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

  2. spring创建bean的三种方式

    spring创建bean的三种方式: 1通过构造方法创建bean(最常用) 1.1 spring默认会通过无参构造方法来创建bean,如果xml文件是这样配置,则实体类中必须要有无参构造方法,无参构造 ...

  3. Spring学习之实例化bean的三种方式

    实例化bean的三种方式 构造器实例化bean Person.java public class Person { private String name; private Integer age; ...

  4. 彻底了解构建 JSON 字符串的三种方式

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7701856.html 前言:JSON 是轻量级的数据交换格式,很常用,尤其是在使用 Ajax ...

  5. 02Spring基于xml的IOC配置--实例化Bean的三种方式

    maven依赖 <dependencies> <!--IOC相关依赖--> <dependency> <groupId>org.springframew ...

  6. Spring装配Bean的三种方式+导入和混合配置

    目录 Spring IoC与bean 基于XML的显式装配 xml配置的基本结构 bean实例的三种创建方式 依赖注入的两种方式 构造器注入方式 setter方法注入方式 利用命名空间简化xml 基于 ...

  7. SpringBoot引入第三方jar的Bean的三种方式

    在SpringBoot的大环境下,基本上很少使用之前的xml配置Bean,主要是因为这种方式不好维护而且也不够方便. 因此本篇博文也不再介绍Spring中通过xml来声明bean的使用方式. 一.注解 ...

  8. spring装配bean的三种方式及其混合装配

    在spring容器中装配bean有三种基本方式和混合装配方式: 隐式的bean自动发现机制和自动装配 在java中进行显式配置 在xml中配置 混合装配(在多个java文件中配置.在JavaConfi ...

  9. spring4笔记----使用装配注入合作者Bean的三种方式

    no :不自动装配 byName :id(name)与setter方法去set前缀,并小写首字母后同名的Bean完成注入,如有多个匹配则抛异常 byType :spring容器找全部bean,如果找到 ...

  10. spring 装配bean的三种方式

    这段时间在学习Spring,依赖注入DI和面向切面编程AOP是Spring框架最核心的部分.这次主要是总结依赖注入的bean的装配方式. 什么是依赖注入呢?也可以称为控制反转,简单的来说,一般完成稍微 ...

随机推荐

  1. websocket和ajax的区别(和http的区别)

    websocket和ajax的区别(和http的区别) https://segmentfault.com/a/1190000021741131 1. 本质不同 ajax,即异步JavaScript和X ...

  2. coco漫画获取隐藏的图片链接

    网站分析 打开目标网站:https://www.cocomanhua.com/, 随便打开一部漫画: https://www.cocomanhua.com/10330/1/205.html F12 打 ...

  3. 微信支付:wxpay.unifiedOrder(data)返回appid 与 openId 不配

    原因:小程序和APP.公众号等支付方式夸端口调用支付,后台配置多个appId时 A程序中的openid 在B程序中支付.即使用A程序的openid和B程序的appIdy去调用wxpay.unified ...

  4. 如何使用 GTX750 或 1050 显卡安装 CUDA11+

    前言 由于兼容性问题,使得我们若想用较新版本的 PyTorch,通过 GPU 方式训练模型,也得更换较新版本得 CUDA 工具包.然而 CUDA 的版本又与电脑显卡的驱动程序版本关联,如果是低版本的显 ...

  5. 你所不知道的ASP.NET Core进阶系列(三)

    前言 一年多没更新博客,上一次写此系列还是四年前,虽迟但到,没有承诺,主打随性,所以不存在断更,催更,哈哈,上一篇我们细究从请求到绑定详细原理,本篇则是探讨模型绑定细节,当一个问题产生到最终解决时,回 ...

  6. iOS内存管理机制

    这世上,没有谁活得比谁容易,只是有人在呼天抢地,有人在默默努力.   随着科技的发展,移动设备的内存越来越大,设备的运行速度也越来越快,但是相对于整个应用市场上成千上万的应用容量来说,还是及其有限的. ...

  7. #ifndef、#define、#ifdef等命令在C#中的应用

    1.#ifndef指令的理解 #ifndef是一个预处理指令,用于判断一个表示符是否被定义.如果该标识符未被定义,则执行条件编译中的代码块.否则,将跳过该代码块.下面是一个简单的粒子. 1 #ifnd ...

  8. 深入理解HarmonyOS UIAbility:生命周期、WindowStage与启动模式探析

    本文分享自华为云社区<深入理解HarmonyOS UIAbility:生命周期.WindowStage与启动模式探析>,作者:柠檬味拥抱. UIAbility组件概述 UIAbility组 ...

  9. Kafka集群调优+能力探底

    一.前言 我们需要对4个规格的kafka能力进行探底,即其可以承载的最大吞吐:4个规格对应的单节点的配置如下: 标准版: 2C4G 铂金版: 4C8G 专业版: 8C16G 企业版: 16C32G 另 ...

  10. 数据仓库主流开发语言——SQL

    数仓开发语言概述  SQL语言介绍 数仓与SQL 结构化数据 二维表结构 SQL语法分类