springboot静态获取bean的三种方式,你学会了吗?

Java知音_ Java知音_     2023-01-20     232

关键词:

点击关注公众号,实用技术文章及时了解

来源:blog.csdn.net/showchi/article/details/97005720

注意:调用者要被spring管理

目录

  • 方式一  注解@PostConstruct

  • 方式二  启动类ApplicationContext

  • 方式三 手动注入ApplicationContext

方式一  注解@PostConstruct

import com.example.javautilsproject.service.AutoMethodDemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import javax.annotation.PostConstruct;
 
/**
 * springboot静态方法获取 bean 的三种方式(一)
 * @author: clx
 * @version: 1.1.0
 */
@Component
public class StaticMethodGetBean_1 
 
    @Autowired
    private AutoMethodDemoService autoMethodDemoService;
 
    @Autowired
    private static AutoMethodDemoService staticAutoMethodDemoService;
 
    @PostConstruct
    public void init() 
        staticAutoMethodDemoService = autoMethodDemoService;
    
 
    public static String getAuthorizer() 
        return staticAutoMethodDemoService.test();
    

注解@PostConstruct说明

PostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。此方法必须在将类放入服务之前调用。支持依赖关系注入的所有类都必须支持此注释。即使类没有请求注入任何资源,用 PostConstruct 注释的方法也必须被调用。只有一个方法可以用此注释进行注释。

应用 PostConstruct 注释的方法必须遵守以下所有标准:

  • 该方法不得有任何参数,除非是在 EJB 拦截器 (interceptor) 的情况下,根据 EJB 规范的定义,在这种情况下它将带有一个 InvocationContext 对象 ;

  • 该方法的返回类型必须为 void;

  • 该方法不得抛出已检查异常;

  • 应用 PostConstruct 的方法可以是 public、protected、package private 或 private;

  • 除了应用程序客户端之外,该方法不能是 static;

  • 该方法可以是 final;

  • 如果该方法抛出未检查异常,那么不得将类放入服务中,除非是能够处理异常并可从中恢复的 EJB。

方式二  启动类ApplicationContext

实现方式:在springboot的启动类中,定义static变量ApplicationContext,利用容器的getBean方法获得依赖对象

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
/**
 * @author: clx
 * @version: 1.1.0
 */
@SpringBootApplication
public class Application 
    public static ConfigurableApplicationContext ac;
    public static void main(String[] args) 
       ac = SpringApplication.run(Application.class, args);
    
 

调用方式

/**
 * @author: clx
 * @version: 1.1.0
 */
@RestController
public class TestController 
    /**
     * 方式二
     */
    @GetMapping("test2")
    public void method_2() 
        AutoMethodDemoService methodDemoService = Application.ac.getBean(AutoMethodDemoService.class);
        String test2 = methodDemoService.test2();
        System.out.println(test2);
    

方式三 手动注入ApplicationContext

手动注入ApplicationContext

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
 
 
/**
 * springboot静态方法获取 bean 的三种方式(三)
 * @author: clx
 * @version: 1.1.0
 */
@Component
public class StaticMethodGetBean_3<T> implements ApplicationContextAware 
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException 
        StaticMethodGetBean_3.applicationContext = applicationContext;
    
 
    public static <T> T  getBean(Class<T> clazz) 
        return applicationContext != null?applicationContext.getBean(clazz):null;
    

调用方式

/**
     * 方式三
     */
    @Test
    public void method_3() 
        AutoMethodDemoService autoMethodDemoService = StaticMethodGetBean_3.getBean(AutoMethodDemoService.class);
        String test3 = autoMethodDemoService.test3();
        System.out.println(test3);
    

以上三种方式楼主都测试过可以为完美使用

推荐:

主流Java进阶技术(学习资料分享)

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

bean无法被注入的常见问题和springboot的三种扫描并加载bean方式(代码片段)

一、bean无法被注入的常见问题某个类中的成员,如果是采用@Autowired注入SpringBean,则当前类的实例,必须也是SpringBean才能成功注入,即该实例不能用newxxx()来获得,这种方式获得的实例无法调用@Autowired... 查看详情

springboot获取yml内容的三种方式

参考技术Aspringboot中有三种方式可以获取yml配置文件中的配置内容。yml如下注意,使用ConfigurationProperties后可能会有如下报错:虽不影响运行,但是很碍眼,可通过在springboot项目的pom文件中添加如下依赖解决:分别访问三个测试... 查看详情

spring管理bean的三种创建方式

...ng支持如下三种方式创建Bean1:调用构造器创建Bean2:调用静态工厂方法创建Bean3:调用实例工厂方法创建Bean一:调用构造方法创建Bean 调用构造方法创建Bean是最常用的一种情况Spring容器通过new关键字调用构造器来创建Bean实例... 查看详情

读取springboot的三种方式

参考技术A1.通过Value注解<code>packagecom.hengan.springboottest.controller;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassHelloCo... 查看详情

spring实例化bean的三种方式

...在Spring中,实例化Bean有三种方式:1、构造器实例化;2、静态工厂方式实例化;3、实例化工厂方式实例化构造器实例化:Spring容器通过Bean对应的类中默认的构造器函数实例化Bean.1-1、创建一个实体类Person1packagecom.mengma.instance.cons... 查看详情

通过beandefinitionreader获取beandefinition的三种不同方式(代码片段)

...ean的定义信息。后续生成完整Bean时,直接从该集合中获取。该集合在DefaultListableBeanFactory类中,是一个十分重要的类。前期准备 查看详情

反射:获取class对象的三种方式(代码片段)

...etClass();*2任何数据类型(包括基本数据类型)都有一个“静态”的class属性*3通过Class类的静态方法:forName(StringclassName)(常用)**/publicclassFanshepublicstaticvoidm 查看详情

springmvc访问静态资源的三种方式

...果你的DispatcherServlet拦截*.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了。 目的:可以正常访问静态文件,不要找不到静态文... 查看详情

springmvc访问静态资源的三种方式

...何你的DispatcherServlet拦截*.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了。 方案一:激活Tomcat的defaultServlet来处理静态文件1<... 查看详情

三种获取当前时间戳的方式

参考技术A以下是获取当前时间的时间戳的三种方式:如果你已经放弃了IE8,你可以转而使用Date.now()静态方法来获取时间戳。 查看详情

spring框架装配bean的三种方式

欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系。本系列教程希望您能站在上帝的角度去观察(了... 查看详情

springmvc访问静态资源的三种方式(转)

本文转自:http://www.iigrowing.cn/springmvc_fang_wen_jing_tai_zi_yuan_de_san_zhong_fang_shi.html如何你的DispatcherServlet拦截*.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.j 查看详情

spring创建bean的三种方式

1、使用构造器创建bean1.1、使用无参构造器创建packagecom.ly.spring;publicclassPerson{privateStringname;publicvoidsay(Stringname){System.out.println("你好,我叫"+name);}}<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns 查看详情

spring生成entitymanagerfactory的三种方式

spring生成EntityManagerFactory的三种方式1.LocalEntityManagerFactoryBean只是简单环境中使用。它使用JPAPersistenceProvider自动检测机制(accordingtoJPA‘sJavaSEbootstrapping),并且大多数情况下,你只能定义一下persistenceunitname例如:<beans><be 查看详情

spring中创建bean对象的三种方式以及作用范围

...时间:2020/02/02 一.在spring的xml配置文件中创建bean对象的三种方式:1.使用默认构造函数创建。在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时采用的就是默认构造函数创建bean对象,此时如... 查看详情

spring提供的三种装配bean方式(代码片段)

在Spring中,对象不需要自己查找或创建与其所关联的其他对象,Spring容器负责把需要相互协作的对象引用赋予各个对象。创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入(DI)的本质。Spring提供了三种... 查看详情

dubbo与springboot的三种整合方式

SpringBoot与dubbo整合的三种方式:1、导入dubbo-starter,在application.properties配置属性,使用@Service暴露服务,使用@Reference引用服务,使用@EnableDubbo开启dubbo注解(或者在application.properties中配置dubbo.scan.base-packages=com.lina02.gmall)2、保留 查看详情

spring实例化bean的三种方法

1.用构造器来实例化 [html] viewplain copy  print?<bean id="hello2" class="com.hsit.hello.impl.ENhello" />   2.使用静态工厂方法实例化 要写一个bean,bean中定义一个静态方 查看详情