1. 程式人生 > >17、Spring Boot普通類呼叫bean【從零開始學Spring Boot】

17、Spring Boot普通類呼叫bean【從零開始學Spring Boot】

【視訊&交流平臺】

http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

https://gitee.com/happyangellxq520/spring-boot

http://412887952-qq-com.iteye.com/blog/2321532



我們知道如果我們要在一個類使用spring提供的bean物件,我們需要把這個類注入到spring容器中,交給spring容器進行管理,但是在實際當中,我們往往會碰到在一個普通的Java類中,想直接使用spring提供的其他物件或者說有一些不需要交給spring管理,但是需要用到spring裡的一些物件。如果這是spring框架的獨立應用程式,我們通過

ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId"); 

這樣的方式就可以很輕易的獲取我們所需要的物件。

但是往往我們所做的都是Web Application,這時我們啟動spring容器是通過在web.xml檔案中配置,這樣就不適合使用上面的方式在普通類去獲取物件了,因為這樣做就相當於載入了兩次spring容器,而我們想是否可以通過在啟動web伺服器的時候,就把Application放在某一個類中,我們通過這個類在獲取,這樣就可以在普通類獲取spring bean物件了,讓我們接著往下看。

普通類呼叫Spring bean物件:

這裡有更多這方面的介紹,比較詳細,在這裡只是拋裝引玉說明在Spring Boot是如何進行呼叫的。

17.1

在Spring Boot可以掃描的包下

假設我們編寫的工具類為SpringUtil

如果我們編寫的SpringUtil在SpringBoot可以掃描的包下或者使用@ComponentScan引入自定義的包了,那麼原理很簡單,只需要使得SpringUtil實現介面:ApplicationContextAware,然後加上@Component 註解即可,具體編碼如下:

com.kfit.base.util.SpringUtil:

package com.kfit.base.util;

import org.springframework.beans.BeansException;

importorg.springframework.context.ApplicationContext;

importorg.springframework.context.ApplicationContextAware;

importorg.springframework.stereotype.Component;

/**

 *普通類呼叫Spring bean物件:

 *說明:

 * 1、此類需要放到App.java同包或者子包下才能被掃描,否則失效。

 *@author Administrator

 */

@Component

publicclass SpringUtilimplementsApplicationContextAware{

       privatestaticApplicationContextapplicationContext =null;

       @Override

       publicvoidsetApplicationContext(ApplicationContextapplicationContext)throws BeansException{

              if(SpringUtil.applicationContext ==null){

                     SpringUtil.applicationContext  =applicationContext;

              }

              System.out.println("---------------------------------------------------------------------");

              System.out.println("---------------------------------------------------------------------");

       System.out.println("---------------com.kfit.base.util.SpringUtil------------------------------------------------------");

              System.out.println("========ApplicationContext配置成功,在普通類可以通過呼叫SpringUtils.getAppContext()獲取applicationContext物件,applicationContext="+SpringUtil.applicationContext+"========");

              System.out.println("---------------------------------------------------------------------");

       }

       //獲取applicationContext

       publicstaticApplicationContext getApplicationContext() {

              returnapplicationContext;

       }

       //通過name獲取 Bean.

       publicstatic ObjectgetBean(Stringname){

              returngetApplicationContext().getBean(name);

       }

       //通過class獲取Bean.

       publicstatic <T> TgetBean(Class<T>clazz){

              returngetApplicationContext().getBean(clazz);

       }

       //通過name,以及Clazz返回指定的Bean

       publicstatic <T> TgetBean(Stringname,Class<T> clazz){

              returngetApplicationContext().getBean(name,clazz);

       }

}

啟動應用,檢視控制檯的列印資訊是否有:

======ApplicationContext配置成功,在普通類可以通過呼叫SpringUtils.getAppContext()獲取applicationContext物件,

17.2 不在Spring Boot的掃描包下方式一

這種情況處理起來也很簡單,先編寫SpringUtil類,同樣需要實現介面:ApplicationContextAware,具體編碼如下:

simple.plugin.spring.SpringUtil

package simple.plugin.spring;

importorg.springframework.beans.BeansException;

import org.springframework.context.ApplicationContext;

importorg.springframework.context.ApplicationContextAware;

publicclass SpringUtilimplementsApplicationContextAware{

       privatestaticApplicationContextapplicationContext =null;

       @Override

       publicvoid setApplicationContext(ApplicationContextapplicationContext)throws BeansException{

              if(SpringUtil.applicationContext ==null){

                     SpringUtil.applicationContext  =applicationContext;

              }

              System.out.println("---------------------------------------------------------------------");

              System.out.println("---------------------------------------------------------------------");

       System.out.println("---------------simple.plugin.spring.SpringUtil------------------------------------------------------");

              System.out.println("========ApplicationContext配置成功,在普通類可以通過呼叫SpringUtils.getAppContext()獲取applicationContext物件,applicationContext="+SpringUtil.applicationContext+"========");

              System.out.println("---------------------------------------------------------------------");

       }

       //獲取applicationContext

       publicstaticApplicationContext getApplicationContext() {

              returnapplicationContext;

       }

       //通過name獲取 Bean.

       publicstatic ObjectgetBean(Stringname){

              returngetApplicationContext().getBean(name);

       }

       //通過class獲取Bean.

       publicstatic <T> TgetBean(Class<T>clazz){

              returngetApplicationContext().getBean(clazz);

       }

       //通過name,以及Clazz返回指定的Bean

       publicstatic <T> TgetBean(Stringname,Class<T> clazz){

              returngetApplicationContext().getBean(name,clazz);

       }

}

註解,在App.java類中將SpringUtil註解進來,程式碼如下:

package com.kfit;

import org.springframework.boot.SpringApplication;

importorg.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.boot.web.servlet.ServletComponentScan;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Import;

import simple.plugin.spring.SpringUtil;

/**

 * Hello world!

 *

 */

//其中@SpringBootApplication申明讓spring boot自動給程式進行必要的配置,等價於以預設屬性使用@Configuration,@EnableAutoConfiguration和@ComponentScan

@SpringBootApplication

@ServletComponentScan

public class App {

       /**註冊Spring Util

        *這裡為了和上一個衝突,所以方面名為:springUtil2

        *實際中使用springUtil

        */

       @Bean

       public SpringUtilspringUtil2(){return new SpringUtil();}

       /**

        *

引數裡VM引數設定為:

       -javaagent:.\lib\springloaded-1.2.4.RELEASE.jar-noverify

        * @param args

        */

       public static voidmain(String[] args) {

              SpringApplication.run(App.class,args);

       }

}

17.3 不在Spring Boot的掃描包下方式二

中使用@Import進行匯入。

而且在SpringUtil不需要新增@Component註解

@SpringBootApplication

@ServletComponentScan

@Import(value={SpringUtil.class})

public class App{

       //省略其它程式碼.

}

說明以上3中方式都生效了,這3中方式根據實際情況選擇一種方式就可以了。

那麼這樣子在普通類既可以使用:

SpringUtil.getBean() 獲取到Spring IOC容器中的bean。

當然也可以在Spring管理的類中使用:

@Resouce或者@Autowired進行注入使用,當然我們這個類的核心是普通類可以呼叫spring的bean進行使用了,是不是很神奇呢。

Spring Boot 系列視訊】

視訊&交流平臺:

http://study.163.com/course/introduction.htm?courseId=1004329008

http://412887952-qq-com.iteye.com/blog/2321532

網易雲課堂視訊最新更新

第十一章 Spring Boot 日誌

1、spring boot日誌—理論

2、Spring Boot日誌-logback

3、Spring Boot日誌-log4j2

第十二章 Spring Boot 知識點2

1、spring boot 服務配置和部署

2、Spring Boot 定製URL匹配規則

歷史章節

第一章 快速開始

1、Spring Boot之Hello World

2、Spring Boot之Hello World訪問404

第二章 Spring Boot之JSON

1、spring boot返回json資料

2、Spring Boot完美使用FastJson解析JSON資料

第三章 Spring Boot熱部署

1、Spring Boot熱部署(springloader)

2、springboot + devtools(熱部署)

第四章 Spring Boot資料庫

1、Spring Boot JPA/Hibernate/Spring Data概念

2、Spring Boot JPA-Hibernate

3、Spring Boot Spring Data JPA介紹

4、Spring Boot JdbcTemplate

5、Spring Boot整合MyBatis

第五章 web開發

1、全域性異常捕捉

2、配置server資訊

3、spring boot使用thymeleaf

4、Spring Boot 使用freemarker

5、Spring Boot新增JSP支援

第六章 定時任務

1、Spring Boot定時任務

2、Spring Boot 定時任務升級篇(動態修改cron引數)

3、Spring Boot 定時任務升級篇(動態新增修改刪除定時任務)

4、Spring Boot 定時任務升級篇(叢集/分散式下的定時任務說明)

5、Spring Boot Quartz介紹

6、Spring Boot Quartz在Java Project中使用

7、Spring Boot 整合Quartz普通使用

8、Spring Boot 整合Quartz升級版

9、Spring Boot 整合Quartz二次升級版

10、Spring Boot 整合Quartz-Job如何自動注入Spring容器託管的物件

第七章 Spring Boot MyBatis升級篇

1、Spring Boot MyBatis升級篇-註解

2、Spring Boot MyBatis升級篇-註解-自增ID

3、Spring Boot MyBatis升級篇-註解-增刪改查

4、Spring Boot MyBatis升級篇-註解-分頁查詢

5、Spring Boot MyBatis升級篇-註解-分頁PageHelper不生效

6、Spring Boot MyBatis升級篇-註解- mybatic insert異常:BindingException: Parameter 'name' not found

7、Spring Boot MyBatis升級篇-註解- #和$符號特別篇

8、Spring Boot MyBatis升級篇-註解-@Result

9、Spring Boot MyBatis升級篇-註解-動態SQL(if test)-方案一:<script>

10、Spring Boot MyBatis升級篇-註解-動態SQL(if test)-方案二:@Provider

11、Spring Boot MyBatis升級篇-註解-動態SQL-引數問題

12、Spring Boot MyBatis升級篇-註解-特別篇:@MapperScan和@Mapper

13、Spring Boot MyBatis升級篇-XML

14、Spring Boot MyBatis升級篇-XML-自增ID

15、Spring Boot MyBatis升級篇-XML-增刪改查

16、Spring Boot MyBatis升級篇-XML-分頁查詢

17、Spring Boot MyBatis升級篇-XML-分頁PageHelper不生效

18、Spring Boot MyBatis升級篇-XML-動態SQL(if test)

19、Spring Boot MyBatis升級篇-XML-註解-初嘗試

20、Spring Boot MyBatis升級篇- pagehelper替換為pagehelper-spring-boot-starter

第八章 Spring Boot 知識點1

1、Spring Boot 攔截器HandlerInterceptor

2、Spring Boot啟動載入資料CommandLineRunner

3、Spring Boot環境變數讀取和屬性物件的繫結

4、Spring Boot使用自定義的properties

5、Spring Boot使用自定義的properties

6、Spring Boot使用@SpringBootApplication

7、Spring Boot 監控和管理生產環境

第十章 Spring Boot 打包部署

1、Spring Boot打包部署((提供Linux的sh檔案))

第十一章 Spring Boot 日誌

1、spring boot日誌—理論

2、Spring Boot日誌-logback

3、Spring Boot日誌-log4j2