手動注冊bean
此種方式注冊的bean在調用時將由spring進行創建,相當於延遲加載bean
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;
@Component public class ApplicationContextUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext context) throws BeansException { applicationContext=context; } /** * 動態注入bean * @param requiredType 注入類 * @param beanName bean名稱 */ public static Object registerBean(Class<?> requiredType,String beanName){ //將applicationContext轉換為ConfigurableApplicationContext ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext; //獲取BeanFactory DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getAutowireCapableBeanFactory(); //創建bean信息. BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(requiredType); //動態注冊bean. defaultListableBeanFactory.registerBeanDefinition(beanName, beanDefinitionBuilder.getBeanDefinition()); //獲取動態注冊的bean. return configurableApplicationContext.getBean(requiredType); } }
手動創建bean實例
此種方式允許手動創建單例bean實例並注冊,注意必須是單例的,在spring調用時,會將手動創建的bean直接注入到調用方。
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;
@Component public class ApplicationContextUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext context) throws BeansException { applicationContext=context; } /** * 動態注入單例bean實例 * @param beanName bean名稱 * @param singletonObject 單例bean實例 * @return 注入實例 */ public static Object registerSingletonBean(String beanName,Object singletonObject){ //將applicationContext轉換為ConfigurableApplicationContext ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext; //獲取BeanFactory DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getAutowireCapableBeanFactory(); //動態注冊bean. defaultListableBeanFactory.registerSingleton(beanName,singletonObject); //獲取動態注冊的bean. return configurableApplicationContext.getBean(beanName); } }
