玄学springboot applicationcontext.getBean(用类名String还是类型Class), getBean(..)的调用场景结果不同?getBean(..)还会阻塞?@DependsOn按照名称依赖,那么getBean用类名String

springContextStati是一个实现了Applicationcontextaware的类的名字,可以getBean(..)RegistryTask是一个在RegistryServer调用netty封装的channelinitializer时候,的clienthandler被触发读事件的时候 new 的
@Component
@DependsOn(value={"springContextStatic","normalConfig","channelCache","serviceAddrCache"})DependsOn的参数都是String字符串,类的名称,后面在RegistryTask的构造函数中,必须用appcontext.getBean(String name)获得bean,否则阻塞。
public class RegistryServer {
    .....
......
    @PostConstruct
    private void doRunServer() {
            try {            此处被注释的代码部分如果不执行,那么后面一个RegistryTask阻塞在构造函数上        执行此处getBean(Class<T>)代码的意义是什么?加载?玄。。
                /*LOGGER.info("doRunServer:appctx:{}",SpringContextStatic.getApplicationContext());
                LOGGER.info("normalconfig:{}",SpringContextStatic.getBean(NormalConfig.class));
                LOGGER.info("channelcache:{}",SpringContextStatic.getBean(ChannelCache.class));
                LOGGER.info("serviceaddrcache:{}",SpringContextStatic.getBean(ServiceAddrCache.class));*/
                //创建并初始化 Netty 服务端辅助启动对象 ServerBootstrap
                ServerBootstrap serverBootstrap = initServerBootstrap(bossGroup, workerGroup);
                //绑定对应ip和端口,同步等待成功
                ChannelFuture future = serverBootstrap.bind(paramConfig.getServerport()).sync();
                LOGGER.info("regist server 已启动,端口:{}", paramConfig.getServerport());
                //等待服务端监听端口关闭
                future.channel().closeFuture().sync();
            } catch (InterruptedException i) {
                LOGGER.error("regist server 出现异常,端口:{}, cause:", paramConfig.getServerport(), i.getMessage());
            } finally {
                //优雅退出,释放 NIO 线程组
                workerGroup.shutdownGracefully();
                bossGroup.shutdownGracefully();
            }

    }

    /**
     * 创建并初始化 Netty 服务端辅助启动对象 ServerBootstrap
     *
     * @param bossGroup
     * @param workerGroup
     * @return
     */
    private ServerBootstrap initServerBootstrap(EventLoopGroup bossGroup, EventLoopGroup workerGroup) {
        return new ServerBootstrap()
                .group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .option(ChannelOption.SO_BACKLOG, 1024)
                .childOption(ChannelOption.SO_KEEPALIVE, true)
                .childHandler(new ServerChannelInitializer(new RegistryServerHandler(threadPool)));
    }
}
public class RegistryTask implements Runnable {
    private static Logger log = LoggerFactory.getLogger(RegistryTask.class);

    private ChannelHandlerContext ctx;
    private RegistryMessage msg;
    private ChannelCache channelCache = null;
    private ServiceAddrCache serviceAddrCache = null;
    private NormalConfig normalConfig = null;

    /*private ChannelCache channelCache = SpringContextStatic.getBean(ChannelCache.class);

    private ServiceAddrCache serviceAddrCache = SpringContextStatic.getBean(ServiceAddrCache.class);

    private NormalConfig normalConfig = SpringContextStatic.getBean(NormalConfig.class);*/

    public RegistryTask(ChannelHandlerContext ctx, RegistryMessage msg) {
        System.out.println("constructing registrytask,appctx:"+SpringContextStatic.getApplicationContext());
        log.info("doRunServer:appctx:{}",SpringContextStatic.getApplicationContext());
        log.info("normalconfig:{}",SpringContextStatic.getBean("normalConfig"));
        /*log.info("channelcache:{}",SpringContextStatic.getBean(ChannelCache.class));
        log.info("serviceaddrcache:{}",SpringContextStatic.getBean(ServiceAddrCache.class));*/

        this.ctx = ctx;
        this.msg = msg;

      上一个文件的被注释部分getBean(Class<T>)如果不执行,此处会阻塞,why?
        /*this.channelCache = SpringContextStatic.getBean(ChannelCache.class);
        this.serviceAddrCache = SpringContextStatic.getBean(ServiceAddrCache.class);
        this.normalConfig = SpringContextStatic.getBean(NormalConfig.class);*/
        正确写法:getBean(String name)
        this.channelCache = (ChannelCache) SpringContextStatic.getBean("channelCache");
        this.serviceAddrCache = (ServiceAddrCache) SpringContextStatic.getBean("serviceAddrCache");
        this.normalConfig = (NormalConfig) SpringContextStatic.getBean("normalConfig");
    }

原文地址:https://www.cnblogs.com/CreatorKou/p/11354682.html

时间: 2024-10-11 03:01:55

玄学springboot applicationcontext.getBean(用类名String还是类型Class), getBean(..)的调用场景结果不同?getBean(..)还会阻塞?@DependsOn按照名称依赖,那么getBean用类名String的相关文章

SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用

1. activemq 首先引入依赖 pom.xml文件 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> 创建一个配置队列类 JMSConfiguration.java package com.wangx.boot.util; impo

Item 30 用enum代替int常量类型枚举,string常量类型枚举

1.用枚举类型替代int枚举类型和string枚举类型 public class Show { // Int枚举类型 // public static final int APPLE_FUJI = 0; // public static final int APPLE_PIPPIN = 1; // public static final int APPLE_GRANNY_SMITH = 2; public enum Apple { FUJI, PIPPIN, GRANNY_SMITH } pub

C语言 string::size_type类型

string::size_type类型 从逻辑上来讲,size()成员函数似乎应该返回整型数值,或如2.2节"建议"中所述的无符号整数.但事实上,size操作返回的是string::size_type类型的值.我们需要对这种类型做一些解释. string类类型和许多其他库类型都定义了一些伙伴类型(companion types).这些伙伴类型使得库类型的使用是机器无关的(machine-independent).size_type就是这些伙伴类型中的一种.它定义为与unsigned型(

解读STL的string类中各方法的使用场景

所在头文件:<string> 实现:typedf basic_string<char> string 所在命名空间:std 功能:标准string提供字节标准容器的接口,同事增加对字符串中单独的字符的操作.由于标准string是basic_string<char>的一种特化,只能针对char型,如果字符编码方式是多字节或者可变字符序列(eg:UTF-8)那么它仍然按字节去解读,而不是按照传入内容的编码方式. (1)成员函数number functions constru

C++ string::size_type 类型【转】

1 int main() 2 { 3 string str("Hello World!\n"); 4 cout << "The size of " << str << "is " << str.size() 5 << " characters, including the newline" << endl; 6 return 0; 7 } 从逻辑上来讲,s

C++ string::size_type类型

程序代码: int main() { string str("Hello World!\n"); cout << "The size of " << str << "is " << str.size() << " characters, including the newline" << endl; return 0; } 从逻辑上来讲,size() 成员

Java中调用c/c++语言出现Exception in thread &quot;main&quot; java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V...错误

错误: Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V at Test.testPrint(Native Method) at Test.main(Test.java:8) 解决方法: 昨天一天都在想办法解决这个问题,操作步骤按照教程来的,怎么会出错呢?想了半天,觉得还是dll文件生成的不对.所以,最后决定把codeblocks换成visual

SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)

1.概念:SpringBoot整合Restful架构 2.背景 Spring 与 Restful 整合才是微架构的核心,虽然在整个 SpringBoot(SpringCloud)之中提供有大量的服务方便整合,但是这些 整合都不如 Rest 重要,因为 Rest 是整个在微架构之中进行通讯的基础模式.那么对于 Rest 首先必须对其有一个最为核心的解释: 利用 JSON 实现数据的交互处理.而且 Spring 里面提供有一个非常强大的 RestTemplate 操作模版,利用此模版可以非常轻松的实

String[255]在高版本Delphi里还是被解释成Byte,总体长度256,使用StrPCopy可以给Array String拷贝字符串

学了好多不了解的知识: procedure TForm1.Button1Click(Sender: TObject); var s1 : String; s2 : String[255]; begin s1:='ç1很好'; ShowMessage(s1); // 这里显示正常 s2:=s1; ShowMessage(s2); // 这里显示乱码. // 问这个问题的原因是,在一个recode pack 里定义了String[255],但是使用Unicode字符给它赋值的时候,就乱码了,这该怎么