springboot實現(xiàn)在工具類(util)中調(diào)用注入service層方法
一、新建BeanUtil類
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import java.util.ArrayList;
import java.util.List;
@Slf4j
public class BeanUtil implements ApplicationContextAware, DisposableBean {
private static ApplicationContext applicationContext = null;
/**
* 從靜態(tài)變量applicationContext中取得Bean, 自動轉(zhuǎn)型為所賦值對象的類型.
*/
public static <T> T getBean(Class<T> requiredType) {
if(applicationContext==null){
throw new IllegalStateException("applicaitonContext屬性未注入, 請在SpringBoot啟動類中注冊BeanUtil.");
}
return applicationContext.getBean(requiredType);
}
@Override
public void destroy() {
applicationContext = null;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (BeanUtil.applicationContext != null) {
log.warn("BeanUtil中的ApplicationContext被覆蓋, 原有ApplicationContext為:" + BeanUtil.applicationContext);
}
BeanUtil.applicationContext = applicationContext;
}
}
二、在啟動類中注入BeanUtil
@SpringBootApplication
public class StartApplication {
public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args);
}
@Bean
public BeanUtil beanUtil() {
return new BeanUtil();
}
}
三、在Util類中獲取Service
public class MyUtils {
public static UserDetails getCurrentUser() {
MyUserDetailsService userDetailsService = BeanUtil.getBean(MyUserDetailsService.class);
//TODO 調(diào)用service中的方法處理自己的業(yè)務(wù)
return null;
}
}
springBoot中普通類直接調(diào)用spring管理的dao.service等bean
在項目中經(jīng)常會用到一些不是controller和service層的去訪問dao層,或者是普通類訪問service層。
前提:
首先確保dao,serivce全部可以在項目啟動的時候掃描到
編寫一個工具類,通過工具類去獲取ApplicationContext對象,然后通過applicationContext對象去加載spring管理的bean
將該工具類在項目啟動類進(jìn)行引入,否則會報空指針異常。
具體使用方法如下:
1)編寫工具
package com.bonc.springboot.utils;
/*
* @desc:提供非SPRING管理類調(diào)用管理類的功能
* 注意在服務(wù)啟動的時候進(jìn)行import,apllication中引入
*/
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(SpringUtil.applicationContext == null){
SpringUtil.applicationContext = applicationContext;
}
System.out.println("---------------------------------------------------------------------");
System.out.println("========ApplicationContext配置成功,在普通類可以通過調(diào)用SpringUtils.getAppContext()獲取applicationContext對象,applicationContext="+SpringUtil.applicationContext+"========");
System.out.println("---------------------------------------------------------------------");
}
//獲取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);
}
}
2)將該工具類,在服務(wù)啟動類application 中導(dǎo)入

3)普通類中使用APPlicationContent對象獲取對應(yīng)的bean進(jìn)行使用:
ApplicationContext appCtx = SpringUtil.getApplicationContext(); public TestDao dao = appCtx.getBean(TestDao.class);
也可寫成
public TestDao dao = SpringUtil.getBean(TestDao.class);
具體測試如下:
例:比如有一個請求中調(diào)用了實體類,實體類的構(gòu)造方法調(diào)用的dao,進(jìn)行的數(shù)據(jù)庫的訪問
請求:
//普通類進(jìn)行構(gòu)造的時候,可以調(diào)用dao 對象
@RequestMapping(value="/testClassQuery")
public void testClassQuery(){
TestClassQuery testClassQuery =new TestClassQuery();
}
普通類代碼:
**
* @Description: 測試普通類如何調(diào)用mapper
*/
public class TestClassQuery {
ApplicationContext appCtx = SpringUtil.getApplicationContext();
public TestDao dao = appCtx.getBean(TestDao.class);
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public TestClassQuery(){
testQuery();
}
public void testQuery(){
user = dao.queryUser("1"); //通過id獲取值
System.out.println(user.toString());
}
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java?Socket實現(xiàn)文件發(fā)送和接收功能以及遇到的Bug問題
這篇文章主要介紹了Java?Socket實現(xiàn)文件發(fā)送和接收功能以及遇到的Bug問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
IDEA的Terminal無法執(zhí)行g(shù)it命令問題
這篇文章主要介紹了IDEA的Terminal無法執(zhí)行g(shù)it命令問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
Spring Task定時任務(wù)的實現(xiàn)詳解
這篇文章主要介紹了SpringBoot定時任務(wù)功能詳細(xì)解析,這次的功能開發(fā)過程中也算是對其內(nèi)涵的進(jìn)一步了解,以后遇到定時任務(wù)的處理也更清晰,更有效率了,對SpringBoot定時任務(wù)相關(guān)知識感興趣的朋友一起看看吧2022-08-08
Mybatis如何從數(shù)據(jù)庫中獲取數(shù)據(jù)存為List類型(存為model)
這篇文章主要介紹了Mybatis如何從數(shù)據(jù)庫中獲取數(shù)據(jù)存為List類型(存為model),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
Java將Object轉(zhuǎn)換為數(shù)組的代碼
這篇文章主要介紹了Java將Object轉(zhuǎn)換為數(shù)組的情況,今天在使用一個別人寫的工具類,這個工具類,主要是判空操作,包括集合、數(shù)組、Map等對象是否為空的操作,需要的朋友可以參考下2022-09-09

