精华内容
下载资源
问答
  • spring初始化接口InitializingBean

    千次阅读 2018-09-08 10:21:21
    spring初始化接口InitializingBean InitializingBean接口用于初始化bean。此接口只有一个方法afterPropertiesSet, 继承此接口的bean,在bean的属性初始化会执行这个方法。 下面看一下此接口定义 /** * 当需要...

    spring初始化接口InitializingBean

    InitializingBean接口用于初始化bean。此接口只有一个方法afterPropertiesSet,
    继承此接口的bean,在bean的属性初始化会执行这个方法。

    下面看一下此接口定义

    /**
     * 当需要在BeanFactory设置完bean的所有属性后,还需做一些初始化的操作,可让该bean实现此接口
     */
    public interface InitializingBean {
    
        /**
         * 由BeanFactory在设置完bean的属性后调用
         * 该方法可用于实现bean的初始化操作,不过需要在bean的属性设置完毕后(从名字也可以看出)
         */
        void afterPropertiesSet() throws Exception;
    
    }
    

    我们可以在 AbstractAutowireCapableBeanFactory类中找到此接口的调用位置,如下:

    
    protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
                throws Throwable {
    
           //是否实现了 InitializingBean 接口
            boolean isInitializingBean = (bean instanceof InitializingBean);
            if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
                }
                if (System.getSecurityManager() != null) {
                    try {
                        AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
                            // 调用该方法
                            ((InitializingBean) bean).afterPropertiesSet();
                            return null;
                        }, getAccessControlContext());
                    }
                    catch (PrivilegedActionException pae) {
                        throw pae.getException();
                    }
                }
                else {
                   // 调用该初始化方法
                    ((InitializingBean) bean).afterPropertiesSet();
                }
            }
           // 判断是否指定了init-method方法
            if (mbd != null && bean.getClass() != NullBean.class) {
                String initMethodName = mbd.getInitMethodName();
                if (StringUtils.hasLength(initMethodName) &&
                        !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
                        !mbd.isExternallyManagedInitMethod(initMethodName)) {
                    // 执行init-method 方法
                    invokeCustomInitMethod(beanName, bean, mbd);
                }
            }
        }
    

    spring还有一种初始化方式,指定 init-method 方法,如xml配置的bean

      <bean id="initAndDestroySeqBean" class="com.wthfeng.dubboapi.beans.InitAndDestroyBean" init-method="initMethod"
              destroy-method="destroyMethod"/>
    

    从源码分析可知,init-method的初始化方法在InitializingBean.afterPropertiesSet 方式之后。

    总结如下:

    1. spring有两种初始化bean的方式,实现InitializingBean接口以及配置init-method方法,两种方式可以同时使用,实现接口的方式比指定init-method先调用。
    2. 如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。

    参考文章

    1. Spring核心接口之InitializingBean
    2. InitializingBean的作用
    展开全文
  • java接口初始化

    千次阅读 2018-10-06 12:04:27
    接口初始化的时候编译器仍然会给接口生成一个()的类构造器,用来初始化接口中的成员变量,这点在类的初始化上也有做到。真正不同的地方在于第三点,类的初始化执行之前要求父类全部都初始化完成了,但接口的初始化...

    上文写到

    类的四种主动引用和三种被动引用

    下面来说说接口的初始化

    接口初始化的时候编译器仍然会给接口生成一个()的类构造器,用来初始化接口中的成员变量,这点在类的初始化上也有做到。真正不同的地方在于第三点,类的初始化执行之前要求父类全部都初始化完成了,但接口的初始化貌似对父接口的初始化不怎么感冒。
    也就是说,子接口初始化的时候并不要求其父接口也完成初始化,只有在真正使用到父接口的时候它才会被初始化(比如引用接口上的常量的时候啦)。

    下面分解一下一个类的加载全过程:加载->验证->准备->解析->初始化

    首先是加载:这一块虚拟机要完成3件事:

    1.通过一个类的全限定名来获取定义此类的二进制字节流。

    2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

    3.在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。

    关于第一点,很灵活,很多技术都是在这里切入,因为它并没有限定二进制流从哪里来:

    从class文件来->一般的文件加载
    从zip包中来->加载jar中的类
    从网络中来->Applet
    ……….
    相比与加载过程的其他几个阶段,加载阶段可控性最强,因为类的加载器可以用系统的,也可以用自己写的,程序猿可以用自己的方式写加载器来控制字节流的获取。

    获取二进制流获取完成后会按照jvm所需的方式保存在方法区中,同时会在java堆中实例化一个java.lang.Class对象与堆中的数据关联起来。

    加载完成后就要开始对那些字节流进行检验了(其实很多步骤是跟上面交叉进行的,比如文件格式验证):

    检验的目的:确保class文件的字节流信息符合jvm的口味,不会让jvm感到不舒服。假如class文件是由纯粹的java代码编译过来的,自然不会出现类似于数组越界、跳转到不存在的代码块等不健康的问题,因为一旦出现这种现象,编译器就会拒绝编译了。但是,跟之前说的一样,Class文件流不一定是从java源码编译过来的,也可能是从网络或者其他地方过来的,甚至你可以自己用16进制写,假如jvm不对这些数据进行校验的话,可能一些有害的字节流会让jvm完全崩溃。

    检验主要经历几个步骤:文件格式验证->元数据验证->字节码验证->符号引用验证

    文件格式验证:验证字节流是否符合Class文件格式的规范并 验证其版本是否能被当前的jvm版本所处理。ok没问题后,字节流就可以进入内存的方法区进行保存了。后面的3个校验都是在方法区进行的。

    元数据验证:对字节码描述的信息进行语义化分析,保证其描述的内容符合java语言的语法规范。

    字节码检验:最复杂,对方法体的内容进行检验,保证其在运行时不会作出什么出格的事来。

    符号引用验证:来验证一些引用的真实性与可行性,比如代码里面引了其他类,这里就要去检测一下那些来究竟是否存在;或者说代码中访问了其他类的一些属性,这里就对那些属性的可以访问行进行了检验。(这一步将为后面的解析工作打下基础)

    验证阶段很重要,但也不是必要的,假如说一些代码被反复使用并验证过可靠性了,实施阶段就可以尝试用-Xverify:none参数来关闭大部分的类验证措施,以简短类加载时间。

    接着就上面步骤完成后,就会进入准备阶段了:

    这阶段会为类变量(指那些静态变量)分配内存并设置类比那辆初始值的阶段,这些内存在方法区中进行分配。这里要说明一下,这一步只会给那些静态变量设置一个初始的值,而那些实例变量是在实例化对象时进行分配的。这里的给类变量设初始值跟类变量的赋值有点不同,比如下面:

    public static int value=123;
    在这一阶段,value的值将会是0,而不是123,因为这个时候还没开始执行任何java代码,123还是不可见的,而我们所看到的把123赋值给value的putstatic指令是程序被编译后存在于(),所以,给value赋值为123是在初始化的时候才会执行的。

    这里也有个例外:

    public static final int value=123;
    这里在准备阶段value的值就会初始化为123了。这个是说,在编译期,javac会为这个特殊的value生成一个ConstantValue属性,并在准备阶段jm就会根据这个ConstantValue的值来为value赋值了。

    完成上步后,就要进行解析了。解析好像是对类的字段,方法等东西进行转换,具体涉及到Class文件的格式内容,并没深入去了解。

    初始化过程是类加载过程的最后一步:

    在前面的类加载过程中,除了在加载阶段用户可以通过自定义类加载器参与之外,其他的动作完全有jvm主导,到了初始化这块,才开始真正执行java里面的代码。

    这一步将会执行一些预操作,注意区分在准备阶段,已经为类变量执行过一次系统赋值了。

    其实说白了,这一步就是执行程序的();方法的过程。下面我们来研究一下()方法:

    ()方法叫做类构造器方法,有编译器自动手机类中的所有类变量的赋值动作和静态语句块中的语句合并而成的,置于他们的顺序与在源文件中排列的一样。

    ();方法与类构造方法不一样,他不需要显示得调用父类的();方法,虚拟机会保证子类的();方法在执行前父类的这个方法已经执行完毕了,也就是说,虚拟机中第一个被执行的();方法肯定是java.lang.Object类的。

    下面来个例子说明一下:

    static class Parent{ 
      public static int A=1; 
      static{ 
        A=2; 
      } 
    } 
    static class Sub extends Parent{ 
      public static int B=A; 
    } 
    public static void main(String[] args){ 
      System.out.println(Sub.B); 
    } 
    

    首先Sub.B中对静态数据进行了引用,Sub类要进行初始化了。同时,其父类Parent要先进行初始化动作。Parent初始化后,A=2,所以B=2;上个过程相当于:

    static class Parent{ 
      <clinit>(){ 
        public static int A=1; 
        static{ 
          A=2; 
        } 
      } 
    } 
    static class Sub extends Parent{ 
      <clinit>(){ //jvm会先让父类的该方法执行完在执行这里 
      public static int B=A; 
      } 
    } 
    public static void main(String[] args){ 
      System.out.println(Sub.B); 
    } 
    

    ();方法对类跟接口来说不是必须的,加入类或者接口中没有对类变量进行赋值且没有静态代码块,()方法就不会被编译器生成。
    由于接口里面不能存在static{}这种静态代码块,但仍然可能存在变量初始化时的变量赋值操作,所以接口里面也会生成()构造器。但跟类的不同的是,执行子接口的()方法前并不需要执行父接口的()方法,当父接口中定义的变量被使用时,父接口才会被初始化。

    另外,接口的实现类在初始化的时候也一样不会执行接口的()方法。

    另外,jvm会保证一个类的()方法在多线程环境下能被正确地加锁同步。<因为初始化只会被执行一次>。

    下面用个例子说明一下:

    public class DeadLoopClass { 
    
      static{ 
        if(true){ 
        System.out.println("要被 ["+Thread.currentThread()+"] 初始化了,下面来一个无限循环"); 
        while(treu){}   
        } 
      } 
    
      public static void main(String[] args) { 
        System.out.println("toplaile"); 
        Runnable run=new Runnable(){ 
    
          @Override 
          public void run() { 
            // TODO Auto-generated method stub 
            System.out.println("["+Thread.currentThread()+"] 要去实例化那个类了"); 
            DeadLoopClass d=new DeadLoopClass(); 
            System.out.println("["+Thread.currentThread()+"] 完成了那个类的初始化工作"); 
    
          }}; 
    
          new Thread(run).start(); 
          new Thread(run).start(); 
      } 
    
    } 
    

    这里面,运行的时候将会看到阻塞现象。


    展开全文
  • SpringBoot项目启动初始化InitializingBean接口与 @PostConstruct 方法 被spring管理 实现InitializingBean接口... 实现初始化接口 package com.config.redis; import com.richfit.itemcode.service.impl.Code...

     SpringBoot项目启动初始化InitializingBean接口与 @PostConstruct 方法

    • 被spring管理
    • 实现InitializingBean接口 
    • 重写afterPropertiesSet方法
    • 实现初始化接口

    package com.config.redis;
    
    import com.richfit.itemcode.service.impl.CodeItemServiceImpl;
    import com.utils.RedisUtil;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.Resource;
    
    /**
     * Redis Init
     * by CHENYB date 2019-05-30
     */
    @Component
    public class InitRedis implements InitializingBean {
    
        
        @Override
        public void afterPropertiesSet() throws Exception {
    
            /*这里调用需要配合初始化的方法*/
            /*cache */
            System.out.println("项目启动初始化时会执行");
        }
    }
    

     

    • 初始化方法,两种实现

    @RestController
    public class BaseController {
    
    	public static final Logger logger = LoggerFactory.getLogger(BaseController.class);
    
    
        //初始化方法 1
        private @PostConstruct void initialize() {
    
            //加入初始化内容
        }
    
        //初始化方法 2
        @PostConstruct 
        private void initialize() {
    
            //加入初始化内容
        }
    
    }

     

     

    随笔记录,只为方便自己学习

    2019-05-30

    展开全文
  • 接口初始化和类初始化区别

    千次阅读 2017-11-09 20:59:10
    虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化: 1. 遇到new、getstatic、putstatic、invokestatic这四条字节码指令时, 如果类还没有进行过初始化,则需要先触发其初始化。 生成这四条指令最常见...

    虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化:
    1. 遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,
    如果类还没有进行过初始化,则需要先触发其初始化。
    生成这四条指令最常见的Java代码场景是:
    使用new关键字实例化对象时、
    读取一个类的静态字段(static)时(被static修饰又被final修饰的,已在编译期把结果放入常量池的静态字段除外)
    设置一个类的静态字段(static)时(被static修饰又被final修饰的,已在编译期把结果放入常量池的静态字段除外)
    以及调用一个类的静态方法时。
    2. 使用Java.lang.refect包的方法对类进行反射调用时,如果类还没有进行过初始化,则需要先触发其初始化。
    3. 当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。
    4. 当虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先执行该主类。

    对于静态字段,只有直接定义这个字段的类才会被初始化,因此,通过其子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化

    接口初始化与类初始化区别:
    当一个类在初始化时,要求其父类全部已经初始化过了,
    但是一个接口在初始化时,并不要求其父接口全部都完成了初始化,只有在真正使用到父接口的时候(如引用接口中定义的常量)
    才会初始化该父接口。
    调用类中的static final常量时并不会触发该类的初始化,但是调用接口中的static final常量时便会触发该接口的初始化

    展开全文
  • Java接口初始化

    千次阅读 2019-11-06 22:03:27
     学习学习类初始化的时候看到了下面关于接口的两天结论: 在初始化一个类时,并不会初始化它所实现的接口初始化一个接口时,并不会先初始化它的父接口  因为接口中的变量都是 public static final 的,所以我...
  • ili9488芯片的初始化程序,用于RGB接口
  • 接口可以初始化

    千次阅读 2016-03-17 12:14:09
    static Session session =null;//Open Declaration org.hibernate.Session  此处session为接口
  • 接口初始化规则

    千次阅读 2019-09-02 19:19:38
    在JVM类加载这篇文章中,已经确定一个类在初始化时必须先行初始化其父类(如果有),我们接着来看接口初始化,我们明白接口中的成员属性都是public static final修饰的,例子中省略不写!!! 结论:当一个接口在...
  • 接口初始化(接口为null的判断)

    千次阅读 2017-03-16 12:16:20
    一、在实际项目中采用... 四、关联的真实玩家在调用时需要初始化,实际初始化实例应为真实玩家的类,但初始化时采用里氏替换原则,用父接口来表示。对接口为Null的判断,就是对是否实例化的判断。 五、测试代码段。
  • windows窗口初始化问题

    2015-10-13 07:12:20
    windows API 中是否有类似与windowinit的窗口初始化接口,该接口可以返回窗口句柄。
  • 接口初始化方法

    千次阅读 2018-05-03 20:49:52
    实现 InitializingBean接口   &lt;bean id="testBean" class="TestClass" init-method="initialize"/&gt;   @PostConstruct   Bean在实例的过程中先后顺序也就...
  • 目录 1、关键接口和类 1.1、关键类之 DefaultListableBeanFactory ...2、spring初始化过程中对外暴露的扩展接口 3、扩展点的启动顺序 spring的IOC容器初始化流程很复杂,本文只关注流程中的关键点,勾勒出主要...
  • ServletConfig 是一个接口,它怎样传递给他一格对象来进行初始化呢?其实,是这个对象是由 servlet 容 器来实例化的,由容器产生一格 ServletConfig 的实现类的对象,然后传递给 Servlet ②我们有些
  • 在查询的时候直接读取缓存中的数据而不是重新查询数据库(例如将全国省市区存在map或者list中),加载的时机不能是手动访问一个连接去调用该方法,而是应该在项目启动时就初始化这些数据。此时我们可以实现...
  • 众所周知Spring框架主要的...如果我们要在bean实例完成后需要执行自定义初始化方法怎么办呢?在Spring框架中提供了两种方式一种是在XML配置bean时指定init-method,另外一种方式是bean实现InitializingBean接口。接...
  • C/C++初始化和去初始化函数

    千次阅读 2018-06-10 16:24:21
    初始化/去初始化函数根据作用域可以分为几种不同的应用情形 1. 全局初始化/去初始化 这一次运行程序只做这一次初始化/去初始化 2. 模块初始化/去初始化 每次加载/卸载这个模块都调用一次初始化/去初始化 ...
  •  度娘了一下,原来InitializingBean提供了afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法。也就是说只有类继承InitializingBean,我们就可以在afterPropertiesSet方法中添加一下自己...
  • vue初始化加载数据报错问题

    千次阅读 2019-05-15 17:57:11
    初始化加载时定义currentPage为一个空对象,当初始化调用函数时解析至currnetPage后pagedefine因为没有初始化定义所以找不到它就会报错 解决办法: 在currnetPage中将pagedefine也进行定义。 总结: 在template中...
  • 和基本数据类型一样,对象数组初始化也分为静态初始化,动态初始化两种 对象数组动态初始化 //定义Person类 class Person { public int age; } //主类 public class Test { public static void main(String[] ...
  • 本篇博客是接着上一篇博客的《Mybatis初始化加载流程—-配置文件解析》,里面使用到的接口和配置文件是一样对的。这里的Mapper接口注册,也只是注册即将用来生成MapperProxy对象的MapperProxyFactory实例,在后面...
  • 【LWIP】以太网网卡接口部分初始化

    千次阅读 2017-04-11 15:54:24
    在《SylixOS_LWIP协议栈学习:网络接口结构》中,提到过netif 结构体和netdev结构体。...我们举个例子来看一个以太网网卡接口结构是怎样被初始化,还有数据包是如何接收和发送的。 static struct netdev_f
  • Spring初始化之ApplicationRunner、InitializingBean、@PostConstruct执行顺序问题前言一、ApplicationRunner 接口的用法二、InitializingBean接口的用法三、@PostConstruct注解的用法三者在Spring项目启动的执行...
  • 无法初始化Windows sockets接口

    千次阅读 2013-03-05 11:17:16
    这个可能是360阻止了svchost.exe程序导致的。 解决方法: 开始--运行--CMD 输入 :sfc/scannow 结束后再输入:netsh winsock reset 重启计算机解决 转载于:https://blog.51cto.com/djhh21/1147410...
  • 基于最新Spring 5.x,详细介绍了Spring MVC 初始化流程的源码,主要包括DispatcherServlet与MVC子容器的初始化,以及各种MVC组件的初始化
  • 借助Spring监听接口为数据库初始化数据  在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听、Servlet加载初始化等切入点为数据库准备数据,这些初始化数据是系统开始运行前必须的数据,例如权限组、系统...
  • MyBatis - 初始化(九)加载Mapper接口与XML映射文件 该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对各位读者会不太友好,阅读前需要对 MyBatis 和 Spring 有一定的了解。比较适合刚接触,会使用...
  • 这说明在spring初始化bean的时候,如果bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。 原文地址:https://www.cnblogs.com/study-everyday/p/6257127.html 问题 实现InitializingBean接...
  • 关于jsp页面的初始化,jquery初始化

    千次阅读 2018-07-09 11:27:19
    在做jsp开发中,通常会在初始化做一系列的操作,比如文本框赋值、锁定,div的隐藏、显示等等,用的的总结了一下,往后会不断的完善。jquery初始化:$(document).ready(function() {}初始化页面input开那个锁定: $...
  • bootstrapTable 表格初始化问题

    千次阅读 2018-12-06 20:12:06
    返回数据不能初始化表格。有数据返回。原因返回参数需要进行处理 返回格式json. 返回对象不要返回字符串哦~~ 处理方法 responseHandler:responseHandler, responseHandler=function (res) { if (res.success) { ...
  • 当应用有了access_token和jsapi_ticket后...来初始化微信接口调用。代码如下:getSignature(){ //初始化签名 var url = location.href.split('#')[0]; this.$http.post('weixin/getsign',{jsapi_ticket:Bus.jsapi...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,122,554
精华内容 449,021
关键字:

初始化接口问题