首页 > 其他分享 >Solon2 开发之容器,二、构建一个 Bean 的三种方式

Solon2 开发之容器,二、构建一个 Bean 的三种方式

时间:2023-02-12 21:55:05浏览次数:40  
标签:容器 Solon public Bean context Solon2 UserService class

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) 手动获取 //要确保组件已注册

标签:容器,Solon,public,Bean,context,Solon2,UserService,class
From: https://www.cnblogs.com/noear/p/17114815.html

相关文章

  • Bean的拓展和应用
    一.Bean的作用域1.单例模式(spring的默认机制,即拿相同的bean的时候对象都是相同的,不会造成资源浪费)<beanid="user"class="top.lostyou.pojo.user"p:name="jay周"p:se......
  • 容器部署分布式zabbix
    之前有写过docker-compose部署zabbix的博客这里再总结下分布式部署zabbix的笔记,这里重点是部署zabbix-proxy同样需要准备数据库配置文件数据库配置文件差不多这里是doc......
  • Docker consul的容器服务更新与发现
    一、Consul概述(1)什么是服务注册与发现服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的......
  • 022_第三方 bean 属性绑定
    @ConfigurationProperties使用 @ConfigurationProperties为第三方bean绑定属性:    解除使用@ConfigurationProperties注释警告:    @EnableConf......
  • #yyds干货盘点# LeetCode面试题:盛最多水的容器
    1.简述:给定一个长度为n的整数数组 height 。有 n 条垂线,第i条线的两个端点是 (i,0) 和 (i,height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可......
  • 【Docker】MySQL容器定时备份
    我们通常使用原生的mysql会比较多,mysql的备份也耳熟能详。假如现在有个mysql数据库username为root,password为123456,且现在要导出schema为db1、db2的数据。在本地导出的时候......
  • div、td 、p 等容器内强制换行和不换行的方法
    转载自:http://www.divcss5.com/html/h50327.shtml1、强制不换行,同时以省略号结尾。<divstyle="width:100px;overflow:hidden;white-space:nowrap;text-overflow:ellipsi......
  • ACP云原生容器工程师-ACK操作
    操作流程授权账号(RBAC/RAM)创建集群(专有版、托管版、serverless版)部署应用(镜像、模板)运维管理(运维集群、运维应用)集群创建集群查看查看集群的基本信息......
  • sping入门介绍-bean标签的属性
    bean标签的属性 1、基础属性<beanid="userDao"class="com.itheima.dao.impl.UserDaoImpl"></bean>id:在容器中唯一class:类全路径2、scope:对象作用......
  • 2023.6 容器技术
    容器是软件的可执行单元,采用通用方式封装了应用程序代码及其库和依赖项,因此可以随时随地运行容器(无论是在桌面、传统IT还是云端),它利用操作系统的功能(在Linux内核中,即名......