<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
小夥伴們知道,Spring 容器最大的特點在於所有的 Bean 對於 Spring 容器的存在是沒有意識的,因此我們常說理論上你可以無縫將 Spring 容器切換為其他容器(然而在現實世界中,我們其實沒有這樣的選擇,除了 Spring 容器,難道還有更好用的?)。
當然這只是一個理論,在實際開發中,我們往往要用到 Spring 容器為我們提供的諸多資源,例如想要獲取到容器中的設定、獲取到容器中的 Bean 等等。在這種情況下,就需要 Spring 容器中的 Bean 真正的意識到 Spring 容器的存在,才能要到這些東西,那麼如何讓一個 Bean 意識到 Spring 容器的存在呢?
這就依賴於 Spring 容器給我們提供的各種 Aware 介面了。
/** * A marker superinterface indicating that a bean is eligible to be notified by the * Spring container of a particular framework object through a callback-style method. * The actual method signature is determined by individual subinterfaces but should * typically consist of just one void-returning method that accepts a single argument. * * <p>Note that merely implementing {@link Aware} provides no default functionality. * Rather, processing must be done explicitly, for example in a * {@link org.springframework.beans.factory.config.BeanPostProcessor}. * Refer to {@link org.springframework.context.support.ApplicationContextAwareProcessor} * for an example of processing specific {@code *Aware} interface callbacks. * * @author Chris Beams * @author Juergen Hoeller * @since 3.1 */ public interface Aware { }
從這個介面的註釋中,我們也能大概看出來,這個介面的子類,主要是提供了一些只有一個引數的 set 方法,通過這些方法可以讓 Spring 容器感知到某一件事情。
Aware 的實現有很多,大的方向來說主要有如下一些:
每一個 Aware 的作用如下:
這是 Spring 中提供的一堆 Aware。
接下來鬆哥隨便寫個例子大家來看下 Aware 的用法。
實現該介面的物件可以獲取到一個 BeanFactory 物件,通過 BeanFactory 可以完成 Bean 的查詢等操作。這算是一個比較常見的 Aware 了,我們一起來看下。
這裡為了省事,我就在 Spring Boot 中來和大家演示。
首先我們來定義一個簡單的 UserService:
@Service public class UserService { public void hello() { System.out.println("hello javaboy!"); } }
然後提供一個工具類:
@Component public class BeanUtils implements BeanFactoryAware { private static BeanFactory beanFactory = null; @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { BeanUtils.beanFactory = beanFactory; } public static <T> T getBean(String beanName) { return (T) beanFactory.getBean(beanName); } }
有了這個工具類,接下來我們就可以在一個非 Spring 管理的 Bean 中,隨時隨地的查詢 Bean 了,像下面這樣:
UserService userService = BeanUtils.getBean("userService"); userService.hello();
為什麼會有今天這篇文章呢?主要是在鬆哥最近做的 TienChin 專案中,有一個地方涉及到這塊知識點了,但是有的小夥伴不熟悉,因此就拎出來和大家梳理下。
在 TienChin 專案中,在記錄紀錄檔的時候,因為紀錄檔是一個延遲任務,所以提前準備好了相關的 Bean 已經註冊到 Spring 容器中了,像下面這樣:
@Configuration public class ThreadPoolConfig { /** * 執行週期性或定時任務 */ @Bean(name = "scheduledExecutorService") protected ScheduledExecutorService scheduledExecutorService() { return new ScheduledThreadPoolExecutor(corePoolSize, new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(), new ThreadPoolExecutor.CallerRunsPolicy()) { @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); Threads.printException(r, t); } }; } } @Component public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware { /** * Spring應用上下文環境 */ private static ConfigurableListableBeanFactory beanFactory; private static ApplicationContext applicationContext; @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { SpringUtils.beanFactory = beanFactory; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringUtils.applicationContext = applicationContext; } /** * 獲取物件 * * @param name * @return Object 一個以所給名字註冊的bean的範例 * @throws org.springframework.beans.BeansException */ @SuppressWarnings("unchecked") public static <T> T getBean(String name) throws BeansException { return (T) beanFactory.getBean(name); } /** * 獲取型別為requiredType的物件 * * @param clz * @return * @throws org.springframework.beans.BeansException */ public static <T> T getBean(Class<T> clz) throws BeansException { T result = (T) beanFactory.getBean(clz); return result; } }
而寫紀錄檔的非同步任務工具類,並非一個容器,所以要通過這個工具類獲取相應的 Bean,如下:
public class AsyncManager { /** * 操作延遲10毫秒 */ private final int OPERATE_DELAY_TIME = 10; /** * 非同步操作任務排程執行緒池 */ private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService"); /** * 單例模式 */ private AsyncManager() { } private static AsyncManager me = new AsyncManager(); public static AsyncManager me() { return me; } /** * 執行任務 * * @param task 任務 */ public void execute(TimerTask task) { executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); } }
有了 SpringUtils 我們就可以在一個非 Spring 容器所管理的 Bean 中,獲取到 Spring 容器中的 Bean 了。
到此這篇關於Spring通過工具類實現獲取容器中的Bean的文章就介紹到這了,更多相關Spring獲取Bean內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45