日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

17、Spring Boot普通类调用bean【从零开始学Spring Boot】

發(fā)布時間:2025/7/14 javascript 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 17、Spring Boot普通类调用bean【从零开始学Spring Boot】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載:http://blog.csdn.net/linxingliang/article/details/52013017

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

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

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

但是往往我們所做的都是Web?Application,這時我們啟動spring容器是通過在web.xml文件中配置,這樣就不適合使用上面的方式在普通類去獲取對象了,因為這樣做就相當(dāng)于加載了兩次spring容器,而我們想是否可以通過在啟動web服務(wù)器的時候,就把Application放在某一個類中,我們通過這個類在獲取,這樣就可以在普通類獲取spring?bean對象了,讓我們接著往下看。

?

普通類調(diào)用Spring?bean對象:

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

這里有更多這方面的介紹,比較詳細(xì),在這里只是拋裝引玉說明在Spring Boot是如何進行調(diào)用的。

?

?

17.1?在Spring Boot可以掃描的包下

?????假設(shè)我們編寫的工具類為SpringUtil。

?????如果我們編寫的SpringUtil在SpringBoot可以掃描的包下或者使用@ComponentScan引入自定義的包了,那么原理很簡單,只需要使得SpringUtil實現(xiàn)接口: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;

?

/**

?*?普通類調(diào)用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配置成功,在普通類可以通過調(diào)用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);

?????? }

}

?

啟動應(yīng)用,查看控制臺的打印信息是否有:

======ApplicationContext配置成功,在普通類可以通過調(diào)用SpringUtils.getAppContext()獲取applicationContext對象,

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

?????這種情況處理起來也很簡單,先編寫SpringUtil類,同樣需要實現(xiàn)接口: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配置成功,在普通類可以通過調(diào)用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);

?????? }

}

?

之后這一步才是關(guān)鍵,使用@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自動給程序進行必要的配置,等價于以默認(rèn)屬性使用@Configuration,@EnableAutoConfiguration和@ComponentScan

@SpringBootApplication

@ServletComponentScan

?

public class App {

??????

?????? /**注冊Spring Util

?????? ?*?這里為了和上一個沖突,所以方面名為:springUtil2

?????? ?*?實際中使用springUtil

?????? ?*/

?????? @Bean

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

??????

?????? /**

?????? ?*

??????參數(shù)里VM參數(shù)設(shè)置為:

?????? -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進行導(dǎo)入。

而且在SpringUtil是不需要添加@Component注解

@SpringBootApplication

@ServletComponentScan

@Import(value={SpringUtil.class})

public?class?App{

?????? //省略其它代碼.

}

?

?

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

?

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

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

當(dāng)然也可以在Spring管理的類中使用:

@Resouce或者@Autowired?進行注入使用,當(dāng)然我們這個類的核心是普通類可以調(diào)用spring的bean進行使用了,是不是很神奇呢。

?

?

61. mybatic insert異常:BindingException: Parameter 'name' not found【從零開始學(xué)Spring B】?

?

?

60. Spring Boot寫后感【從零開始學(xué)Spring Boot】?

?

?

59. Spring Boot Validator校驗【從零開始學(xué)Spring Boot】?

?

58. Spring Boot國際化(i18n)【從零開始學(xué)Spring Boot】?

?

57. Spring?自定義properties升級篇【從零開始學(xué)Spring Boot】?

?

56. spring boot中使用@Async實現(xiàn)異步調(diào)用【從零開始學(xué)Spring Boot】?

?

55. spring boot?服務(wù)配置和部署【從零開始學(xué)Spring Boot】?

?

54. spring boot日志升級篇—logback【從零開始學(xué)Spring Boot】

?

52. spring boot日志升級篇—log4j多環(huán)境不同日志級別的控制【從零開始學(xué)Spring Boot】?

?

51. spring boot屬性文件之多環(huán)境配置【從零開始學(xué)Spring Boot】

?

50. Spring Boot日志升級篇—log4j【從零開始學(xué)Spring Boot】

?

49. spring boot日志升級篇—理論【從零開始學(xué)Spring Boot】

?

48. spring boot單元測試restfull API【從零開始學(xué)Spring Boot】

?

47. Spring Boot發(fā)送郵件【從零開始學(xué)Spring Boot】

?

46. Spring Boot中使用AOP統(tǒng)一處理Web請求日志

?

45. Spring Boot MyBatis連接Mysql數(shù)據(jù)庫【從零開始學(xué)Spring Boot】

?

44. Spring Boot日志記錄SLF4J【從零開始學(xué)Spring Boot】

?

43. Spring Boot動態(tài)數(shù)據(jù)源(多數(shù)據(jù)源自動切換)【從零開始學(xué)Spring Boot】

?

42. Spring Boot多數(shù)據(jù)源【從零開始學(xué)Spring Boot】

?

41. Spring Boot?使用Java代碼創(chuàng)建Bean并注冊到Spring中【從零開始學(xué)Spring Boot】

?

40. springboot + devtools(熱部署)【從零開始學(xué)Spring Boot】?

?

39.4 Spring Boot Shiro權(quán)限管理【從零開始學(xué)Spring Boot】

?

39.3 Spring Boot Shiro權(quán)限管理【從零開始學(xué)Spring Boot】

?

39.2. Spring Boot Shiro權(quán)限管理【從零開始學(xué)Spring Boot】

?

39.1 Spring Boot Shiro權(quán)限管理【從零開始學(xué)Spring Boot】

?

38 Spring Boot分布式Session狀態(tài)保存Redis【從零開始學(xué)Spring Boot】?

?

37 Spring Boot集成EHCache實現(xiàn)緩存機制【從零開始學(xué)Spring Boot】?

?

36 Spring Boot Cache理論篇【從零開始學(xué)Spring Boot】

?

35 Spring Boot集成Redis實現(xiàn)緩存機制【從零開始學(xué)Spring Boot】?

?

34Spring Boot的啟動器Starter詳解【從零開始學(xué)Spring Boot】

?

33 Spring Boot?監(jiān)控和管理生產(chǎn)環(huán)境【從零開始學(xué)Spring Boot】

?

32 Spring Boot使用@SpringBootApplication注解【從零開始學(xué)Spring Boot】?

?

31 Spring Boot導(dǎo)入XML配置【從零開始學(xué)Spring Boot】

?

更多查看博客:?http://412887952-qq-com.iteye.com/

轉(zhuǎn)載于:https://www.cnblogs.com/ceshi2016/p/6705977.html

總結(jié)

以上是生活随笔為你收集整理的17、Spring Boot普通类调用bean【从零开始学Spring Boot】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。