1. 程式人生 > >資料新增非同步解析重新整理大資料量redis (——)(三)Spring Boot普通類呼叫bean【從零開始學Spring Boot】

資料新增非同步解析重新整理大資料量redis (——)(三)Spring Boot普通類呼叫bean【從零開始學Spring Boot】

從零開始學Spring BootSpring Boot普通類呼叫bean 

 

【視訊&交流平臺】

à SpringBoot視訊

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

à SpringCloud視訊

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

à Spring Boot原始碼

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

à 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物件:

可以參考:http://412887952-qq-com.iteye.com/blog/1479445

---------------------------------------------------------------------------------------------------------

 

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

 

 

17.1 Spring Boot可以掃描的包下

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

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

com.kfit.base.util.SpringUtil:

package com.kfit.base.util;

 

import org.springframework.beans.BeansException;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

import org.springframework.stereotype.Component;

 

/**

 * 普通類呼叫Spring bean物件:

 * 說明:

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

 * @author Administrator

 */

@Component

public class SpringUtil implements ApplicationContextAware{

    private static ApplicationContext applicationContext = null;

 

    @Override

    public void setApplicationContext(ApplicationContext applicationContextthrows 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

    public static ApplicationContext getApplicationContext() {

       return applicationContext;

    }

   

    //通過name獲取 Bean.

    publicstatic 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(nameclazz);

    }

}

 

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

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

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

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

simple.plugin.spring.SpringUtil

package simple.plugin.spring;

 

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 applicationContextthrows 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

    public static ApplicationContext getApplicationContext() {

       returnapplicationContext;

    }

   

    //通過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(nameclazz);

    }

}

 

之後這一步才是關鍵,使用@Bean註解,在App.java類中將SpringUtil註解進來,程式碼如下:

package com.kfit;

 

import org.springframework.boot.SpringApplication;

import org.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 SpringUtil springUtil2(){return new SpringUtil();}

      

       /**

        *

      引數裡VM引數設定為:

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

        * @param args

        */

       public static void main(String[] args) {

              SpringApplication.run(App.class, args);

       }

}

 

 

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

程式碼基本和上面都是相同的,主要是在App.java中使用@Import進行匯入。

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

@SpringBootApplication

@ServletComponentScan

@Import(value={SpringUtil.class})

publicclass App {

    //省略其它程式碼.

}

 

 

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

 

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

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

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

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