最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決ApplicationContext獲取不到Bean的問題

 更新時間:2024年06月04日 09:54:27   作者:csdn_halon  
這篇文章主要介紹了解決ApplicationContext獲取不到Bean的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

開發(fā)環(huán)境遇到報錯

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'XXXXX' available

現(xiàn)將原問題代碼簡化抽出分析。

部署環(huán)境

  • springboot版本:1.x
  • java:1.8
  • 其他:略

問題代碼

service層

  • 接口:
public interface ErrorBeanService {

    void transactionalMethod();

    void callMethod();
}
  • 實現(xiàn)類:
@Service("errorBeanServiceImpl")
public class ErrorBeanServiceImpl implements ErrorBeanService{


    private ApplicationContext applicationContext;

    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext){
        this.applicationContext = applicationContext;
    }

    @Transactional(rollbackFor = Exception.class)
    public void transactionalMethod() {
        System.out.println("transactionalMethod run ~ ");
    }


    public void callMethod() {
        // Transactional注解失效
//        transactionalMethod();

        // 使用applicationContext獲取到bean 使事物注解生效
        applicationContext.getBean(ErrorBeanServiceImpl.class).transactionalMethod();  // 報錯行
    }
}

contro層:

@RestController
@RequestMapping("/error")
public class ErrorController {
    
    @Autowired
    private ErrorBeanService errorBeanService;
    
    @RequestMapping(value = "/errorBean", method = RequestMethod.GET)
    public void errorBean() {
        errorBeanService.callMethod();
    }
}

查看報錯行代碼,使用了applicationContext.getBean的方式獲取bean使得內(nèi)部調(diào)用事務(wù)注解生效,但在獲取bean時報錯NoSuchBeanDefinitionException異常,報錯如下:

排除了包掃描和beanName問題,看上述報錯倒數(shù)第四行報錯:

org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)

由于使用了事物注解(AOP)從而使用了動態(tài)代理,該環(huán)境使用的是JDK的動態(tài)代理機(jī)制,那么代理不會繼承而是使用實現(xiàn)接口。

所以這個bean是通過接口注入的,就無法通過接口的實例與bean的實例關(guān)聯(lián)。

ps:

  • Springboot 1.x AOP默認(rèn)還是使用 JDK 動態(tài)代理的
  • 如果目標(biāo)對象實現(xiàn)了接口默認(rèn)采用JDK動態(tài)代理 (可強(qiáng)制改為CGLIB)
  • 如果目標(biāo)對象沒有實現(xiàn)接口默認(rèn)采用CGLIB動態(tài)代理

解決方案

  • 升級SpringBoot版本為2.x,AOP默認(rèn)使用CGLIB實現(xiàn)。
  • properties配置文件增加:spring.aop.proxy-target-class=true ## 強(qiáng)制使用CGLIB代理
  • 使用applicationContext.getBean的重載方法獲取對應(yīng)的bean

修復(fù)代碼

為了探求transactional注解是否生效,現(xiàn)增加AOP 切面類模擬事物。

@Aspect
@Configuration
public class AopConfig {

    /**
     * 增強(qiáng)transactionalMethod方法 模擬transational注解
     */
    @Pointcut("execution(* com.example.springbootdemo.error.test.ErrorBeanServiceImpl.transactionalMethod())")
    public void executeAdvice() {
    }

    /**
     * 環(huán)繞增強(qiáng)
     */
    @Around("executeAdvice()")
    public Object aroundAdvice(ProceedingJoinPoint thisJoinPoint) throws Throwable {
        System.out.println("aroundAdvice before proceed");
        Object obj = thisJoinPoint.proceed();
        System.out.println("aroundAdvice after proceed");
        return obj;
    }

}

去除事務(wù)注解:

@Service("errorBeanServiceImpl")
public class ErrorBeanServiceImpl implements ErrorBeanService{


    private ApplicationContext applicationContext;

    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext){
        this.applicationContext = applicationContext;
    }

    public void transactionalMethod() {
        System.out.println("transactionalMethod run ~ ");
    }


    public void callMethod() {
        applicationContext.getBean(ErrorBeanServiceImpl.class).transactionalMethod();
    }
}
  • 升級SpringBoot版本為2.x 略
  • 配置配置文件 略
  • 修改callMethod方法使用getBean的重載方法

<T> T getBean(String var1, Class<T> var2) throws BeansException;

代碼如下:

    public void callMethod() {
        // applicationContext.getBean(ErrorBeanServiceImpl.class).transactionalMethod();

        applicationContext.getBean("errorBeanServiceImpl", ErrorBeanService.class).transactionalMethod();
    }

上述三種方式最終輸出結(jié)果:

aroundAdvice before proceed
transactionalMethod run ~ 
aroundAdvice after proceed

體悟:八股文還是有用的~

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java定時任務(wù)的三種實現(xiàn)方式

    Java定時任務(wù)的三種實現(xiàn)方式

    這篇文章主要給大家介紹了關(guān)于Java定時任務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Java實現(xiàn)爬蟲給App提供數(shù)據(jù)(Jsoup 網(wǎng)絡(luò)爬蟲)

    Java實現(xiàn)爬蟲給App提供數(shù)據(jù)(Jsoup 網(wǎng)絡(luò)爬蟲)

    這篇文章主要介紹了Java實現(xiàn)爬蟲給App提供數(shù)據(jù),即Jsoup 網(wǎng)絡(luò)爬蟲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Springboot項目引入druid安裝部署使用教程

    Springboot項目引入druid安裝部署使用教程

    這篇文章主要介紹了Springboot項目引入druid安裝部署使用,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • Spring Batch實戰(zhàn)示例

    Spring Batch實戰(zhàn)示例

    批量數(shù)據(jù)處理是一個非常常見的需求,比如月底的工資代發(fā)、銀行對賬、數(shù)據(jù)報表生成等,當(dāng)數(shù)據(jù)量達(dá)到幾十萬甚至上百萬時,可以高效的完成,感興趣的可以了解一下
    2026-02-02
  • 使用JPA單項一對多外鍵關(guān)聯(lián)

    使用JPA單項一對多外鍵關(guān)聯(lián)

    這篇文章主要介紹了使用JPA單項一對多外鍵關(guān)聯(lián),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java?安全ysoserial?URLDNS利用鏈分析

    java?安全ysoserial?URLDNS利用鏈分析

    這篇文章主要為大家介紹了java?安全ysoserial?URLDNS利用鏈分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 使用java的HttpClient實現(xiàn)多線程并發(fā)

    使用java的HttpClient實現(xiàn)多線程并發(fā)

    這篇文章主要介紹了使用java的HttpClient實現(xiàn)多線程并發(fā)的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • 枚舉java語言中的修飾符組合的實例代碼

    枚舉java語言中的修飾符組合的實例代碼

    這篇文章主要介紹了枚舉java語言中的修飾符組合,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • 手把手教你SpringBoot整合Mybatis

    手把手教你SpringBoot整合Mybatis

    這篇文章主要介紹了手把手教你SpringBoot整合Mybatis,Mybatis是一款持久化框架,可以幫我們省去大部分jdbc的代碼,需要的朋友可以參考下
    2023-03-03
  • SpringBoot使用CORS解決無法跨域訪問問題的具體步驟

    SpringBoot使用CORS解決無法跨域訪問問題的具體步驟

    跨域問題指的是不同站點之間,使用 ajax 無法相互調(diào)用的問題,跨域問題本質(zhì)是瀏覽器的一種保護(hù)機(jī)制,它的初衷是為了保證用戶的安全,防止惡意網(wǎng)站竊取數(shù)據(jù),本文給大家介紹了SpringBoot使用CORS解決無法跨域訪問問題的具體步驟,需要的朋友可以參考下
    2025-05-05

最新評論

兴海县| 磴口县| 稻城县| 五常市| 同德县| 安福县| 安岳县| 正安县| 黄平县| 隆安县| 油尖旺区| 建始县| 怀来县| 鄂尔多斯市| 永泰县| 栖霞市| 云浮市| 洛阳市| 浮山县| 苍梧县| 宜都市| 山东省| 满洲里市| 吴旗县| 北安市| 皮山县| 巩义市| 盐山县| 新泰市| 勃利县| 衢州市| 平利县| 确山县| 临夏市| 东乌珠穆沁旗| 徐汇区| 邹平县| 峨眉山市| 金平| 伊春市| 泰顺县|