1 在Spring Boot可以掃描的包下
假設我們編寫的工具類為SpringUtil。
如果我們編寫的SpringUtil在Spring 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
publicclass SpringUtil implements ApplicationContextAware{
privatestatic ApplicationContext applicationContext = null;
@Override
publicvoid setApplicationContext(ApplicationContext applicationContext) throwsBeansException {
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
publicstatic ApplicationContext getApplicationContext() {
returnapplicationContext;
}
//通過name獲取 Bean.
publicstatic Object getBean(String name){
return getApplicationContext().getBean(name);
}
//通過class獲取Bean.
publicstatic <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
//通過name,以及Clazz返回指定的Bean
publicstatic <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
啟動應用,查看控制台的打印信息是否有:
======ApplicationContext配置成功,在普通類可以通過調用SpringUtils.getAppContext()獲取applicationContext對象,
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;
publicclass SpringUtil implements ApplicationContextAware{
privatestatic ApplicationContext applicationContext = null;
@Override
publicvoid setApplicationContext(ApplicationContext applicationContext) throwsBeansException {
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
publicstatic ApplicationContext getApplicationContext() {
returnapplicationContext;
}
//通過name獲取 Bean.
publicstatic Object getBean(String name){
return getApplicationContext().getBean(name);
}
//通過class獲取Bean.
publicstatic <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
//通過name,以及Clazz返回指定的Bean
publicstatic <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
之后這一步才是關鍵,使用@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);
}
}
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 進行注入使用,當然我們這個類的核心是普通類可以調用spring的bean進行使用了,是不是很神奇呢。