欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot普通類獲取spring容器中bean的操作

 更新時間:2020年09月29日 11:03:13   作者:hgzheng  
這篇文章主要介紹了SpringBoot普通類獲取spring容器中bean的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

前言

在spring框架中,是無法在普通類中通過注解注入實例的,因為sping框架在啟動的時候,就會將標明交給spring容器管理的類進行實例化,并梳理他們彼此的依賴關系,進行注入,沒有交給spring容器管理的普通類,是不會進行注入的,即使你使用了注入的相關注解。這個時候,如果我們需要在普通類中獲取spring容器中的實例,就需要一些特定的方法,這里將整理一下如何在springboot中實現(xiàn)這樣的方法。

創(chuàng)建springboot工程demo

項目結構圖示

項目結構說明

service包下為demo接口和實現(xiàn)類,添加@Service注解,標明交由spring框架管理實例。

test包下為測試用的普通類,測試獲取實例的方法。

utils包下為自定義的獲取spring容器中實例的方法。

工程代碼

service

package com.demo.service;

public interface IDemoService {
  String demo();
}
package com.demo.service.impl;

import com.demo.service.IDemoService;
import org.springframework.stereotype.Service;

@Service
public class DemoServiceImpl implements IDemoService {
  @Override
  public String demo() {
    return "Hello World";
  }
}

@Service注解標明了此實例交由spring容器管理

test

package com.demo.test;

import com.demo.service.IDemoService;
import com.demo.utils.BeanUtil;

public class Test {
  public void test(){
    //獲取已經(jīng)實例化的接口bean
    IDemoService bean = BeanUtil.getBean(IDemoService.class);
    //執(zhí)行bean中方法
    String demo = bean.demo();
    //輸出結果
    System.out.println(demo);
  }
}

utils

package com.demo.utils;
import org.springframework.context.ConfigurableApplicationContext;

public class BeanUtil {
  //將管理上下文的applicationContext設置成靜態(tài)變量,供全局調(diào)用
  public static ConfigurableApplicationContext applicationContext;
  //定義一個獲取已經(jīng)實例化bean的方法
  public static <T> T getBean(Class<T> c){
    return applicationContext.getBean(c);
  }
}

啟動類

package com.demo;

import com.demo.test.Test;
import com.demo.utils.BeanUtil;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication()
public class DemoApplication {
  public static void main(String[] args) {
    //run方法的返回值ConfigurableApplicationContext繼承了ApplicationContext上下文接口
    ConfigurableApplicationContext applicationContext = SpringApplication.run(DemoApplication.class, args);
    //將run方法的返回值賦值給工具類中的靜態(tài)變量
    BeanUtil.applicationContext = applicationContext;
    //測試獲取已經(jīng)實例化的接口bean,執(zhí)行bean中方法
    new Test().test();
  }
}

測試效果

可以看到,test方法應成功獲取DemoService接口實例,這里總結的是springboot工程在普通類獲取sping容器中實例的方法,其原理和傳統(tǒng)方法其實都是一樣的,獲取上下文環(huán)境,從上下文環(huán)境中拿到spring容器管理的實例。

補充知識:SpringBoot獲取Bean

一種最簡單的方法是實現(xiàn)ApplicationContextAware類來獲取容器中的bean:

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringContextUtil implements ApplicationContextAware {

  private static ApplicationContext applicationContext;

  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    SpringContextUtil.applicationContext = applicationContext;
  }

  //獲取applicationContext
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }

  //通過name獲取 Bean.
  public static Object getBean(String name) {
    return getApplicationContext().getBean(name);
  }

  //通過class獲取Bean.
  public static <T> T getBean(Class<T> clazz) {
    return getApplicationContext().getBean(clazz);
  }

  //通過name,以及Clazz返回指定的Bean
  public static <T> T getBean(String name, Class<T> clazz) {
    return getApplicationContext().getBean(name, clazz);
  }
}

我們可以通過bean的名稱、bean的類型或者bean的名稱+類型來獲取容器中的bean。

默認情況下,Spring容器中的bean是單例的,為此我做了一個測試,我創(chuàng)建了兩個bean,一個是默認的,一個是我指定多例的:

import org.springframework.stereotype.Service;

/**
 * 這是一個單例的bean
 */
@Service
public class BeanSingletonService {
}
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

/**
 * 這是一個多例的bean
 */
@Service
@Scope("prototype")
public class BeanPrototypeService {
}

驗證下我的想法:

import com.xqnode.learning.common.config.SpringContextUtil;
import com.xqnode.learning.service.BeanPrototypeService;
import com.xqnode.learning.service.BeanSingletonService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class LearningApplicationTests {
  
  @Test
  public void contextLoads() {
    BeanSingletonService s1 = SpringContextUtil.getBean(BeanSingletonService.class);
    BeanSingletonService s2 = SpringContextUtil.getBean(BeanSingletonService.class);
    BeanPrototypeService p1 = SpringContextUtil.getBean(BeanPrototypeService.class);
    BeanPrototypeService p2 = SpringContextUtil.getBean(BeanPrototypeService.class);
    System.out.println("s1==s2: " + s1.equals(s2));
    System.out.println("p1==p2: " + p1.equals(p2));
  }
}

從結果中可以看到默認的BeanSingletonService 這個bean是單例的,兩個對象完全相等,而我指定的BeanPrototypeService 這個bean則是多例的,兩個bean不相同。

以上這篇SpringBoot普通類獲取spring容器中bean的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 簡述Java編程語言對象的容納

    簡述Java編程語言對象的容納

    這篇文章主要對Java編程思想中對象的容納進行了一個總體的介紹,具有一定的參考價值,需要的朋友可以了解下。
    2017-09-09
  • 多個SpringBoot項目采用redis實現(xiàn)Session共享功能

    多個SpringBoot項目采用redis實現(xiàn)Session共享功能

    這篇文章主要介紹了多個SpringBoot項目采用redis實現(xiàn)Session共享,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 詳細講解Java輸入語句的寫法

    詳細講解Java輸入語句的寫法

    作為初步進入java開發(fā)學習的小白來說,學習java語言一開始的時候得一步步的學習,比如說java輸入語句應該這么去實現(xiàn)呢,這篇文章主要給大家介紹了關于Java輸入語句的相關資料,需要的朋友可以參考下
    2024-03-03
  • Mybatis初始化知識小結

    Mybatis初始化知識小結

    Mybatis的初始化過程就是加載自己運行時所需要的配置信息的過程,這篇文章主要介紹了Mybatis初始化知識小結,需要的朋友可以參考下
    2021-10-10
  • java Array和Arrays的區(qū)別總結

    java Array和Arrays的區(qū)別總結

    在本篇內(nèi)容里小編給大家整理的是一篇關于java Array和Arrays的區(qū)別總結內(nèi)容,有需要的朋友們可以學習下。
    2021-03-03
  • 基于Java編寫第一個區(qū)塊鏈項目

    基于Java編寫第一個區(qū)塊鏈項目

    區(qū)塊鏈是分布式數(shù)據(jù)存儲、點對點傳輸、共識機制、加密算法等計算機技術的新型應用模式,下面這篇文章主要給大家介紹了基于Java實現(xiàn)區(qū)塊鏈的相關資料,需要的朋友可以參考下
    2021-08-08
  • Java8 Lamdba函數(shù)式推導

    Java8 Lamdba函數(shù)式推導

    這篇文章主要介紹了Java8 Lamdba函數(shù)式推導,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 關于@MapperScan包掃描的坑及解決

    關于@MapperScan包掃描的坑及解決

    這篇文章主要介紹了關于@MapperScan包掃描的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 在Java Spring框架中使用的設計模式有哪些

    在Java Spring框架中使用的設計模式有哪些

    面試中常會被問道Spring框架使用了哪些設計模式?關于這個問題本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Java實現(xiàn)深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)算法

    Java實現(xiàn)深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)算法

    深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)是兩種基本的圖搜索算法,可用于圖的遍歷、路徑搜索等問題。DFS采用棧結構實現(xiàn),從起點開始往深處遍歷,直到找到目標節(jié)點或遍歷完整個圖;BFS采用隊列結構實現(xiàn),從起點開始往廣處遍歷,直到找到目標節(jié)點或遍歷完整個圖
    2023-04-04

最新評論