javascript
17、Spring Boot普通类调用bean【从零开始学Spring Boot】
轉載:http://blog.csdn.net/linxingliang/article/details/52013017
我們知道如果我們要在一個類使用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。
?????如果我們編寫的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
public?class?SpringUtil?implementsApplicationContextAware{
???????private?staticApplicationContext?applicationContext?=?null;
?
???????@Override
???????public?voidsetApplicationContext(ApplicationContext?applicationContext)?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
???????public?staticApplicationContext getApplicationContext() {
??????????????return?applicationContext;
?????? }
??????
???????//通過name獲取 Bean.
???????public?static?ObjectgetBean(String?name){
??????????????return?getApplicationContext().getBean(name);
?????? }
??????
???????//通過class獲取Bean.
???????public?static?<T> TgetBean(Class<T>?clazz){
??????????????return?getApplicationContext().getBean(clazz);
?????? }
??????
???????//通過name,以及Clazz返回指定的Bean
???????public?static?<T> TgetBean(String?name,Class<T>?clazz){
??????????????return?getApplicationContext().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;
?
public?class?SpringUtil?implementsApplicationContextAware{
???????private?staticApplicationContext?applicationContext?=?null;
?
???????@Override
???????public?void?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
???????public?staticApplicationContext getApplicationContext() {
??????????????return?applicationContext;
?????? }
??????
???????//通過name獲取 Bean.
???????public?static?ObjectgetBean(String?name){
??????????????return?getApplicationContext().getBean(name);
?????? }
??????
???????//通過class獲取Bean.
???????public?static?<T> TgetBean(Class<T>?clazz){
??????????????return?getApplicationContext().getBean(clazz);
?????? }
??????
???????//通過name,以及Clazz返回指定的Bean
???????public?static?<T> TgetBean(String?name,Class<T>?clazz){
??????????????return?getApplicationContext().getBean(name,?clazz);
?????? }
}
?
之后這一步才是關鍵,使用@Bean注解,在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的掃描包下方式二
代碼基本和上面都是相同的,主要是在App.java中使用@Import進行導入。
而且在SpringUtil是不需要添加@Component注解
@SpringBootApplication
@ServletComponentScan
@Import(value={SpringUtil.class})
public?class?App{
?????? //省略其它代碼.
}
?
?
說明以上3中方式都生效了,這3中方式根據實際情況選擇一種方式就可以了。
?
那么這樣子在普通類既可以使用:
SpringUtil.getBean()?獲取到Spring IOC容器中的bean。
當然也可以在Spring管理的類中使用:
@Resouce或者@Autowired?進行注入使用,當然我們這個類的核心是普通類可以調用spring的bean進行使用了,是不是很神奇呢。
?
?
61. mybatic insert異常:BindingException: Parameter 'name' not found【從零開始學Spring B】?
?
?
60. Spring Boot寫后感【從零開始學Spring Boot】?
?
?
59. Spring Boot Validator校驗【從零開始學Spring Boot】?
?
58. Spring Boot國際化(i18n)【從零開始學Spring Boot】?
?
57. Spring?自定義properties升級篇【從零開始學Spring Boot】?
?
56. spring boot中使用@Async實現異步調用【從零開始學Spring Boot】?
?
55. spring boot?服務配置和部署【從零開始學Spring Boot】?
?
54. spring boot日志升級篇—logback【從零開始學Spring Boot】
?
52. spring boot日志升級篇—log4j多環境不同日志級別的控制【從零開始學Spring Boot】?
?
51. spring boot屬性文件之多環境配置【從零開始學Spring Boot】
?
50. Spring Boot日志升級篇—log4j【從零開始學Spring Boot】
?
49. spring boot日志升級篇—理論【從零開始學Spring Boot】
?
48. spring boot單元測試restfull API【從零開始學Spring Boot】
?
47. Spring Boot發送郵件【從零開始學Spring Boot】
?
46. Spring Boot中使用AOP統一處理Web請求日志
?
45. Spring Boot MyBatis連接Mysql數據庫【從零開始學Spring Boot】
?
44. Spring Boot日志記錄SLF4J【從零開始學Spring Boot】
?
43. Spring Boot動態數據源(多數據源自動切換)【從零開始學Spring Boot】
?
42. Spring Boot多數據源【從零開始學Spring Boot】
?
41. Spring Boot?使用Java代碼創建Bean并注冊到Spring中【從零開始學Spring Boot】
?
40. springboot + devtools(熱部署)【從零開始學Spring Boot】?
?
39.4 Spring Boot Shiro權限管理【從零開始學Spring Boot】
?
39.3 Spring Boot Shiro權限管理【從零開始學Spring Boot】
?
39.2. Spring Boot Shiro權限管理【從零開始學Spring Boot】
?
39.1 Spring Boot Shiro權限管理【從零開始學Spring Boot】
?
38 Spring Boot分布式Session狀態保存Redis【從零開始學Spring Boot】?
?
37 Spring Boot集成EHCache實現緩存機制【從零開始學Spring Boot】?
?
36 Spring Boot Cache理論篇【從零開始學Spring Boot】
?
35 Spring Boot集成Redis實現緩存機制【從零開始學Spring Boot】?
?
34Spring Boot的啟動器Starter詳解【從零開始學Spring Boot】
?
33 Spring Boot?監控和管理生產環境【從零開始學Spring Boot】
?
32 Spring Boot使用@SpringBootApplication注解【從零開始學Spring Boot】?
?
31 Spring Boot導入XML配置【從零開始學Spring Boot】
?
更多查看博客:?http://412887952-qq-com.iteye.com/
轉載于:https://www.cnblogs.com/ceshi2016/p/6705977.html
總結
以上是生活随笔為你收集整理的17、Spring Boot普通类调用bean【从零开始学Spring Boot】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv3.2.0 Cmake 3.
- 下一篇: 今天下棋,结合以前一些技巧的总结