草庐IT

InitializingBean、@PostConstruct、@Bean(initMethod = \

晨风小菜鸟成长日记 2023-03-28 原文

需求背景:

1、项目启动时,加载缓存

2、项目启动时,开启对外服务端

一、InitializingBean实现

InitializingBean简介:

InitializingBean是Spring提供的拓展性接口,InitializingBean接口为bean提供了属性初始化后的处理方法,它只有一个afterPropertiesSet方法,凡是继承该接口的类,在bean的属性初始化后都会执行该方法。

InitializingBean用法:

package com.pcf.spdemo.configuration;

import com.pcf.spdemo.common.httpserver.NettyServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class BeanInit implements InitializingBean {
    private static Logger log = LoggerFactory.getLogger(BeanInit.class);

    @Autowired
    private NettyServer nettyServer;

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("netty----------------------------------");
        init();
    }

    private void init() {
        /** 另起一个线程器启动netty,主线程继续启动项目 **/
        new Thread(){
            @Override
            public void run() {
                nettyServer.start();
            }
        }.start();
        log.info("netty对外服务端已启动...");
    }
}

效果图:

1.PNG

二、@PostConstruct注解实现

@PostContruct是JDK自带的注解,用来修饰非静态void方法。spring初始化该bean后,会执行bean中的该方法。

示例代码:

package com.pcf.spdemo.configuration;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class InitCache {
    private static Logger log = LoggerFactory.getLogger(InitCache.class);

    @PostConstruct
    public void init() {
        log.info("通过@PostConstruct注解,实现项目启动时加载缓存...");
    }
}

效果展示:

2.PNG

三、通过配置@bean的init-method属性实现

代码实现:

package com.pcf.spdemo.configuration;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class InitCache {
    private static Logger log = LoggerFactory.getLogger(InitCache.class);

    @Bean(initMethod = "init")
    public void init() {
        log.info("通过配置@bean的init-method属性,实现项目启动时加载缓存...");
    }
}

效果展示:

3.PNG

四、通过bean构造方法实现

bean初始化时实现。(没见用过,最好别用这种方式)

代码实例:

package com.pcf.spdemo.configuration;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class InitCache {
    private static Logger log = LoggerFactory.getLogger(InitCache.class);

    public InitCache() {
        init();
    }

    public void init() {
        log.info("通过放入bean构造方法,实现项目启动时加载缓存...");
    }
}

效果展示:

4.PNG

五、四种方式优先级比较

测试代码:

package com.pcf.spdemo.configuration;

import com.pcf.spdemo.common.httpserver.NettyServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class BeanInit implements InitializingBean {
    private static Logger log = LoggerFactory.getLogger(BeanInit.class);

    @Autowired
    private NettyServer nettyServer;

    public BeanInit() {
        init2();
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("netty----------------------------------");
        init();
    }

    private void init() {
        /** 另起一个线程器启动netty,主线程继续启动项目 **/
        new Thread(){
            @Override
            public void run() {
                nettyServer.start();
            }
        }.start();
        log.info("netty对外服务端已启动...");
    }

    @PostConstruct
    public void init1() {
        log.info("通过@PostConstruct注解,实现项目启动时加载缓存...");
    }

    public void init2() {
        log.info("通过放入bean构造方法,实现项目启动时加载缓存...");
    }

    @Bean(initMethod = "init")
    public void init3() {
        log.info("通过配置@bean的init-method属性,实现项目启动时加载缓存...");
    }
}

测试结果展示:

5.PNG

由此可以看出:

优先级: 构造方法 > @PostContruct > afterPropertiesSet() > init-method

有关InitializingBean、@PostConstruct、@Bean(initMethod = \的更多相关文章

  1. 本地nacos启动失败,org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean ** - 2

    总结:nacos-2.x.x要使用mysql5.7.x项目使用若依3.1.0-cloud版本,因此要使用nacos-2.x.x的版本,下载并安装nacos后,配置application.properties里的ConfigModuleRelatedConfigurations模块,#***************ConfigModuleRelatedConfigurations***************####IfuseMySQLasdatasource: spring.datasource.platform=mysql###CountofDB: db.num=1###ConnectURL

  2. javascript - 我可以在没有 Ender 的情况下将 qwery 与 bean 一起使用吗? - 2

    我刚刚开始尝试微型库而不是使用jQuery,我想将qwery与bean一起使用。如果我设置了bean.setSelectorEngine(qwery);为什么以下不起作用?bean.on('.masthead','click',function(){console.log('clickfired');});我还在DOM实用程序中使用bonzo,所以我将它设置为使用美元和qwery,这样我就可以以类似jQuery的方式选择元素:例如$('.masthead')。function$(selector){returnbonzo(qwery(selector));}这也行不通。我不能将以下内容

  3. javascript - 在 JavaScript 中从支持 bean 迭代列表 - 2

    我在支持bean中有一个对象列表我想用JavaScript迭代它,所以我尝试了以下方法://我在控制台中没有收到任何错误,但它显示空警报。这是怎么引起的,我该如何解决? 最佳答案 需要先将其转换为JS对象数组。前提是id是数字,方法如下:varusers=[{id:#{user.id},firstName:"#{user.firstName}"}#{loop.last?'':','}];for(vari=0;i这只会在用户名包含换行符时失败(双引号已被JSF转义)。考虑根据EscapeJavaScriptinExpressionLa

  4. javascript - 使用 Primefaces JavaScript 在服务器上的 bean 上调用 JSF 方法 - 2

    在Primefaces用户指南中,它展示了如何对服务器进行AJAX调用的示例PrimeFaces.ajax.AjaxRequest('/myapp/createUser.jsf',{formId:'userForm',oncomplete:function(xhr,status){alert('Done');}});我想不通的是如何调用特定方法。我的目标是使用JavaScript使来自客户端的session无效。 最佳答案 RemoteCommand是实现这一点的好方法,因为它为您提供了一个JavaScript函数来执行这些操作(调

  5. 测试IDEA中几款从Java bean(POJO)得到JSON字符串用于postman请求参数的插件 - 2

    测试IDEA中几款从Javabean(POJO)得到JSON字符串用于postman请求参数的插件一、背景有时候,我们需要从写好的Java类得到JSON字符串(Java类一般指DTO/XxxRequest,即controller接口用来接收参数的POJO),用于postman调用接口的时候的入参。比如,DemoDTO是controller接口的入参,我现在要用postman简单测一下,我怎么样快速得到json字符串呢?@DatapublicclassDemoDTO{privateStringstr1;privateIntegerinteger1;privateLonglong1;private

  6. javascript - 将数据从 Java/JSF2 bean 传递到 Javascript/jQuery 组件作为返回值的最佳方法 - 2

    我无法确定将数据从Java支持/托管bean传递到jQuery/Javascript组件(例如Highcharts)的最佳方法,以便我的网络应用程序以动态、实时的方式生成/显示数据。我在Java方面非常扎实,但我对JavaScript/jQuery的了解非常有限,这显然是我失败的地方。据我所知,最好的方法是在我的网络应用程序上对一个隐藏字段进行Ajax化并传递一个JSON对象或字符串?进入它,然后将该值传递到我的JS组件中。首先,这似乎有点费力,因为我需要一个Ajax调用来更新JSON数据,然后调用setInterval将数据重新读取到JS组件中?我希望我可以将数据直接传递到JS组件中

  7. javascript - 如何将 JSF 托管 bean 属性传递给 JavaScript 函数? - 2

    我想知道如何将JSF托管bean属性传递给JavaScript函数。像这样:functionactualizaMenu(key){#{linkedMenu.setKey(key)}}#{entity.nombre} 最佳答案 这不完全是JSF变量的“传递”。这只是打印JSF变量,就好像它们是JavaScript变量/值一样。要知道,JSF和JS根本不同步运行。JSF在网络服务器中运行并生成HTML/CSS/JS代码,一旦到达那里,这些代码又会在网络浏览器中运行。您的具体问题很可能是因为您编写的JSF代码生成了无效的JS语法。验证这一

  8. java - <beans> 与profile 一起使用时可以在里面定义<bean> 吗? - 2

    我在weblogic服务器上部署我的web应用程序时遇到此错误。:org.xml.sax.SAXParseException:cvc-complex-type.2.4.a:Invalidcontentwasfoundstartingwithelement'beans'.Oneof'{"http://www.springframework.org/schema/beans":description,"http://www.springframework.org/schema/beans":import,"http://www.springframework.org/schema/bean

  9. java - 如何在 Spring XML 元数据配置中为 bean 设置 ServletContext 属性 - 2

    我尝试在此处搜索SO,但找不到解决方案。我有一些XML元数据,如下所示。使用此配置时,我得到一个异常,提示"javax.servlet.ServletContext"是一个接口(interface),它无法创建ID为servletContext的bean。ProductController类在一些我无法修改的jar中,但我希望它在我的应用程序中作为一个bean。它具有Autowiring的ServletContext属性。 最佳答案 如果您需要为ServletContext创建一个bean在XML配置spring应用程序中,您可以使

  10. java - 通过properties在xml配置中配置spring bean抽象与否 - 2

    我正在使用Spring3.0.5.RELEASE版本并具有以下配置:我得到:${myproperty.from.file}'不是'boolean'的有效值我怎样才能实现这种行为,或者也许有人会提供更好的想法来控制从属性创建bean。升级到Spring3.1不是一个选项,因此无法使用SpringProfiles。 最佳答案 据我所知abstractattribute并不意味着在运行时被属性值替换。abstract指示是否声明应用作模板。例如,你可以有这个如果值为abstract在运行时以某种方式设置为false,Spring会尝试为创

随机推荐