Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean。工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象。

Spring初始化bean有两种方式:

  • 实现InitializingBean接口,实现afterPropertiesSet方法。(比通过反射调用init-method指定的方法效率要高一点)
  • 配置文件中通过init-method指定,两种方式可以同时使用。(init-method方式消除了对spring的依赖)

InitializingBean 使用场景:

  • 通过外部对类是否是单例进行控制,该类自己无法感知
  • 对类的创建之前进行初始化的操作,在afterPropertiesSet()中完成。

执行顺序优先级:

构造方法 > postConstruct >afterPropertiesSet > init方法

如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。

package com.vipsoft.mqtt.pool;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; @Service
public class MqttManager implements InitializingBean { public MqttManager() {
System.out.println("构造方法执行...");
} @PostConstruct
public void postConstruct() {
System.out.println("postConstruct方法执行...");
} @Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet方法执行...");
} public void init() {
System.out.println("init方法执行...");
} @Bean(initMethod = "init")
public MqttManager test() {
return new MqttManager();
} }

输出

构造方法执行...
postConstruct方法执行...
afterPropertiesSet方法执行...
构造方法执行...
postConstruct方法执行...
afterPropertiesSet方法执行...
init方法执行...

Java SpringBoot Bean InitializingBean 项目初始化的更多相关文章

  1. SpringBoot系列教程之Bean之指定初始化顺序的若干姿势

    上一篇博文介绍了@Order注解的常见错误理解,它并不能指定 bean 的加载顺序,那么问题来了,如果我需要指定 bean 的加载顺序,那应该怎么办呢? 本文将介绍几种可行的方式来控制 bean 之间 ...

  2. 【转载】JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案

    JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案 本文为转载,原文地址为:https://www.cnblogs.com/adversary/p/103 ...

  3. JAVA - SpringBoot项目跨域访问

    JAVA - SpringBoot添加支持CORS跨域访问 CORS(Cross-Origin Resource Sharing)“跨域资源共享”,是一个W3C标准,它允许浏览器向跨域服务器发送Aja ...

  4. JAVA - SpringBoot项目引用MyBatis操作数据库

    JAVA - SpringBoot项目引用MyBatis操作数据库 1. 创建SpringBoot项目,参考:https://www.cnblogs.com/1285026182YUAN/p/1232 ...

  5. JAVA - SpringBoot项目引用generator生成 Mybatis文件

    JAVA - SpringBoot项目引用generator生成 Mybatis文件  在spring官网https://start.spring.io/自动生成springboot项目,这里选择项目 ...

  6. Java SpringBoot 项目构建 Docker 镜像调优实践

    PS:已经在生产实践中验证,解决在生产环境下,网速带宽小,每次推拉镜像影响线上服务问题,按本文方式构建镜像,除了第一次拉取.推送.构建镜像慢,第二.三-次都是几百K大小传输,速度非常快,构建.打包.推 ...

  7. SpringBoot(十):读取application.yml下配置参数信息,java -jar启动时项目修改参数

    读取application.yml下配置参数信息 在application.yml文件内容 my: remote-address: 192.168.1.1 yarn: weburl: http://1 ...

  8. 向虚拟机注册钩子,实现Bean对象的初始化和销毁方法

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 有什么方式,能给代码留条活路? 有人说:人人都是产品经理,那你知道吗,人人也都可以是 ...

  9. java~springboot~目录索引

    回到占占推荐博客索引 最近写了不过关于java,spring,微服务的相关文章,今天把它整理一下,方便大家学习与参考. java~springboot~目录索引 Java~关于开发工具和包包 Java ...

  10. zookeeper实现项目初始化缓存以及同步监听

    Spring-利用InitializingBean接口和zookeeper实现项目初始化缓存以及同步监听 1.先贴出几个需要用到的工具类 ZkClientUtils import com.ithzk. ...

随机推荐

  1. 文心一言 VS 讯飞星火 VS chatgpt (136)-- 算法导论11.3 2题

    二.用go语言,假设将一个长度为r的字符串散列到m 个槽中,并将其视为一个以 128 为基数的数,要求应用除法散列法.我们可以很容易地把数 m 表示为一个 32 位的机器字,但对长度为r的字符串,由于 ...

  2. 毕业论文精选:基于Qt的高考志愿系统填报查询的设计与实现

    基于Qt的高考志愿系统填报查询的设计与实现 摘     要 在当今社会教育的迅速发展下,高考人数的规模和增长速度也是空前的.高考已经变成了家长和社会高度关注的事情,但是高考只是一个开始,高考结束后的志 ...

  3. AtCoder Beginner Contest 329 (ABC329)

    A. Spread 不说了,代码. B. Next 不说了,代码. C. Count xxx Description 给定一个长度为 \(N\) 的字符串 \(S\),求 \(S\) 中非空连续,并且 ...

  4. Centos离线安装JDK+Tomcat+MySQL8.0+Nginx

    一.安装JDK 注:以下命令环境在Xshell中进行. 1.查询出系统自带的OpenJDK及版本 rpm -qa | grep jdk 2.如果显示已安装openjdk则对其进行卸载. #卸载 rpm ...

  5. AtCoder_abc330

    AtCoder_abc330 比赛链接 A - Counting Passes A题链接 题目大意 给出\(N\)个数\(a_1,a_2,a_3\cdots,a_N\),和一个正整数\(L\).输出有 ...

  6. 循环返回结果结果集(connect 函数使用)

    --示例: SELECT 0 + ROWNUM sonID FROM DUAL /*区间范围*/ CONNECT BY ROWNUM <= 20;

  7. AntDesignBlazor示例——分页查询

    本示例是AntDesign Blazor的入门示例,在学习的同时分享出来,以供新手参考. 示例代码仓库:https://gitee.com/known/BlazorDemo 1. 学习目标 分页查询框 ...

  8. MongoDB中的分布式集群架构

    MongoDB 中的分布式集群架构 前言 Replica Set 副本集模式 副本集写和读的特性 Sharding 分片模式 分片的优势 MongoDB 分片的组件 分片键 chunk 是什么 分片的 ...

  9. 从零开始封装 vue 组件

    对于学习 Vue 的同学来说,封装 vue 组件是实现代码复用的重要一环.在 Vue 官网中非常详细地介绍了 vue 组件的相关知识,我这里简单摘取使用最频繁的几个知识点,带大家快速入门 vue 组件 ...

  10. Linux下安装不同python版本的虚拟环境

    使用的是virtualenv工具安装的虚拟环境. virtualenv是一个用来建立虚拟的python环境,通常情况下,可能会碰到各种python环境,但是只有一台电脑,virtualenv就派上用场 ...