<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
有時候,會有這樣一個需求,在程式執行時動態生成的物件,需要注入到Spring容器中進行管理。
下面是獲取Bean以及注入Bean的工具類
import org.springframework.beans.BeansException; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; import java.lang.reflect.Field; import java.util.Map; @Component public class SpringUtils implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringUtils.applicationContext = applicationContext; } public static ApplicationContext getApplicationContext() { return applicationContext; } public static Object getBean(String name) throws BeansException { return applicationContext.getBean(name); } public static Object getBean(Class name) throws BeansException { return applicationContext.getBean(name); } /** * bean注入spring容器 * map[id,className,...] * id 為 bean的標識 * className 為 類的全限定類名 * ... 為其他屬性 * @param map */ public static void injectBean(Map<String, String> map) { String className = map.get("className"); Class<?> aClass; if (className == null) { throw new RuntimeException("map引數缺少className"); } try { aClass = Class.forName(className); if (aClass == null) { throw new RuntimeException("className不存在"); } } catch (ClassNotFoundException e) { throw new RuntimeException(e); } BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(aClass); Field[] declaredFields = aClass.getDeclaredFields(); for (int i = 0; i < declaredFields.length; i++) { String fieldName = declaredFields[i].getName(); if (map.get(fieldName) != null) { // 必須設定可存取,否則下面的操作做不了 // declaredFields[i].setAccessible(true); builder.addPropertyValue(fieldName, map.get(fieldName)); } } BeanDefinitionRegistry registry = (BeanDefinitionRegistry) applicationContext; // 註冊bean 第一個引數為 name ,第二個為 bean定義類 String id = map.get("id"); if (id == null) { registry.registerBeanDefinition(className, builder.getBeanDefinition()); return; } registry.registerBeanDefinition(id, builder.getBeanDefinition()); } }
測試
@Test public void test2() { HashMap<String, String> map = new HashMap<>(); map.put("id", "helloTask"); map.put("className", "com.example.demo.Task.HelloTask4"); // 註冊bean SpringUtils.injectBean(map); // HelloTask4 helloTask =(HelloTask4) SpringUtils.getBean(HelloTask4.class); HelloTask4 helloTask = (HelloTask4) SpringUtils.getBean("helloTask"); System.out.println(helloTask.getClass()); }
附:利用註解向Spring容器中注入Bean
常用註解包含:@Controller、@Service、@Repository、@Component,其中@Controller、@Service、@Repository都是基於@Component的擴充套件。通常的@Controller用於標識處理前端請求的類,@Service用於標識業務邏輯類,@Repository用於標識DAO層的類,@Component為通用註解,可以標註在任何想要注入容器中的類上面;
@Component //@Controller //@Service //@Repository class Stu{ }
也可以利用@Bean與@Configuration注入,其中@Configuration用於標註一個設定類,@Bean用於標註返回需注入Bean的方法;
@Configuration class MyConfig{ @Bean public Student getStudent(){ return new Student(); } }
總結
到此這篇關於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