国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - java 反射調(diào)用Service導致Spring注入Dao失效的解決方案

java 反射調(diào)用Service導致Spring注入Dao失效的解決方案

2021-12-09 10:54羅羅諾亞F Java教程

這篇文章主要介紹了java 反射調(diào)用Service導致Spring注入Dao失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

java 反射調(diào)用Service導致Spring注入Dao失效

問題發(fā)生背景:

原本打算做一個xml配置文件,寫一個公用類然后根據(jù)讀取配置反射動態(tài)調(diào)用方法。執(zhí)行過程中,發(fā)現(xiàn)service中的dao為null,經(jīng)過調(diào)查由于使用反射,導致dao注入失敗。

1、錯誤方法:通過反射執(zhí)行service的方法

?
1
2
3
4
5
6
String serviceClass = templateInfo.getService();//service執(zhí)行類的名稱
String method = templateInfo.getMethod();//調(diào)用方法名
//根據(jù)反射執(zhí)行保存操作
Class<?> classType = Class.forName(serviceClass);
Method m = classType.getDeclaredMethod(method,new Class[]{PageData.class});
m.invoke(classType.newInstance(),pd);

2、解決方法:通過獲取Spring容器取得對象

?
1
2
3
4
5
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
DivStattisTabService service = (DivStattisTabService)
Class<?>  cls = wac.getBean("divstattistabService").getClass();
Method m = classType.getDeclaredMethod(method,new Class[]{PageData.class});
m.invoke(wac.getBean("divstattistabService"),pd);

注:m.invoke方法第一個參數(shù)不能使用newInstance方法,否則Service中dao的注入失敗,dao為null

反射調(diào)用導致Spring特性失效

今天在項目中遇到一個由于Java反射調(diào)用Bean方法而導致Spring特性失效的問題,折騰了半天,現(xiàn)給出解決方案。

1、拋出問題

我要在控制器的某個方法中通過反射調(diào)用一個service的方法,但是這個方法已經(jīng)被納入切面同時該方法也依賴于其他通過Spring自動注入的Bean實例,準備代碼如下:

1.1、編寫TestAspectController類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@RestController
public class TestAspectController {
    @GetMapping("/testAspect")
    public Object testAspect() throws NoSuchMethodException {
        try {
            //通過完整類名反射加載類
            Class cla = Class.forName("com.icypt.learn.service.TestAspectService");
            //取得類實例
            Object obj = cla.newInstance();
            //通過實例反射調(diào)用sayHello方法
            obj.getClass().getDeclaredMethod("sayHello").invoke(obj);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return "ok";
    }
}

1.2、編寫ModuleService類

?
1
2
3
@Service
public class ModuleService {
}

1.3、編寫TestKey注解

?
1
2
3
4
5
6
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TestKey {
    String key() default "";
}

1.4、編寫TestAspectService

?
1
2
3
4
5
6
7
8
9
@Component
public class TestAspectService {
    @Autowired
    private ModuleService moduleService;
    @TestKey(key = "key")
    public void sayHello() {
        System.out.println("************--->************" + moduleService);
    }
}

1.5、編寫TestAspect切面

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Aspect
@Component
public class TestAspect {
    @Pointcut("@annotation(com.icypt.learn.aspect.TestKey)")
    public void process() {
    }
    @Before("process()")
    public void boBefore() {
        System.out.println("********before*********");
    }
    @After("process()")
    public void doAfter() {
        System.out.println("********after*********");
    }
}

運行結(jié)果:

2019-03-28 21:57:26.548 INFO 30348 --- [nio-8082-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet'
2019-03-28 21:57:26.548 INFO 30348
--- [nio-8082-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started 2019-03-28 21:57:26.587 INFO 30348
--- [nio-8082-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 39 ms
************--->************null

根據(jù)結(jié)果可以發(fā)現(xiàn),切面沒有被執(zhí)行,同時依賴注入的Bean也沒有獲得實例,其實原因很簡單,就是因為我們是手動通過反射獲得的Bean的實例,這種方式相當于我們new Bean(),此Bean的實例已完全脫離Spring容器,所以Spirng無法感知它的存在,那么如何解決呢?

2、解決問題

2.1、編寫SpringContextUtil類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Component
public class SpringContextUtil implements ApplicationContextAware {
      // Spring應(yīng)用上下文環(huán)境 
    private static ApplicationContext applicationContext;
      /**
     * 實現(xiàn)ApplicationContextAware接口的回調(diào)方法,設(shè)置上下文環(huán)境
     
     * @param applicationContext
     */
    public void setApplicationContext(ApplicationContext applicationContext) { 
        SpringContextUtil.applicationContext = applicationContext; 
    
      /**
     * @return ApplicationContext
     */
    public static ApplicationContext getApplicationContext() { 
        return applicationContext; 
    
      /**
     * 獲取對象
     
     * @param name
     * @return Object
     * @throws BeansException
     */
    public static Object getBean(String name) throws BeansException {
        return applicationContext.getBean(name); 
    }
    public static Object getBean(String name, Class cla) throws BeansException {
        return applicationContext.getBean(name, cla);
    }
}

此類的作用就是手動通過BeanId獲取Bean實例。

2.2、修改TestAspectController類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@RestController
public class TestAspectController {
    @GetMapping("/testAspect")
    public Object testAspect() throws NoSuchMethodException {
        try {
            //通過完整類名反射加載類
            Class cla = Class.forName("com.icypt.learn.service.TestAspectService");
            //獲取首字母小寫類名
            String simpleName = cla.getSimpleName();
            String firstLowerName = simpleName.substring(0,1).toLowerCase()
 + simpleName.substring(1);
            //通過此方法去Spring容器中獲取Bean實例
            Object obj = SpringContextUtil.getBean(firstLowerName, cla);
            //通過實例反射調(diào)用sayHello方法
            obj.getClass().getDeclaredMethod("sayHello").invoke(obj);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return "ok";
    }
}

其他類保持不變,運行結(jié)果如下:

2019-03-28 22:13:59.311 INFO 37252 --- [nio-8082-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet'
2019-03-28 22:13:59.312 INFO 37252
--- [nio-8082-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started 2019-03-28 22:13:59.350 INFO 37252
--- [nio-8082-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 38 ms
********before*********
************--->************com.icypt.learn.service.ModuleService@5681f667
********after*********

通過結(jié)果可以發(fā)現(xiàn),注入的Bean已經(jīng)獲得了實例同時切面也友好的執(zhí)行,問題完美解決。解決問題核心思想就是我們通過Spring的反射機制獲得Bean的實例化對象,而后通過Java的反射機制攜帶該實例對象去處理業(yè)務(wù),這樣就不會使Bean脫離Spring容器管理,當然也可以享有Spring的Bean所有擁有的特性。

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

原文鏈接:https://blog.csdn.net/Tracycater/article/details/50778662

延伸 · 閱讀

精彩推薦
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
主站蜘蛛池模板: 免费观看aaa | 成人免费在线电影 | 国产一区二区视频免费看 | 久久久久久久一区 | 四虎在线视频 | 一级欧美 | 中文一区| 97精品国产| 51ⅴ精品国产91久久久久久 | 午夜精品在线观看 | 亚洲毛片| 亚洲精品乱码久久久久久金桔影视 | 欧美三级电影 | 青青草原亚洲 | 日本精品在线观看 | av小说在线观看 | 青青久视频 | 日本成人一区 | 午夜视频在线 | 久久视频精品 | 亚洲电影在线观看 | 黄色av网 | 成人a在线视频免费观看 | 一级片免费在线观看视频 | 成人免费毛片高清视频 | 免费一二区 | 精品国产欧美一区二区三区成人 | 久久综合久久综合久久综合 | 亚洲免费一区二区 | 欧美在线免费观看 | 99热精品免费 | 午夜成年人 | 福利片中文字幕 | 精品国产91 | 欧美福利视频 | 久久精品亚洲精品国产欧美kt∨ | 亚洲视频在线观看网址 | 色一色视频 | 亚洲国产激情 | 亚洲一区二区中文字幕 | 欧美大片免费 |