1. 程式人生 > >java之在普通程式碼中獲取bean的幾種方式

java之在普通程式碼中獲取bean的幾種方式

普通程式碼中獲取bean的幾種方式

最近在專案中,因程式碼模式要求,需要在普通類中去主動呼叫bean例項,經過參考分析,做如下的整理。

在初始化時儲存ApplicationContext物件 
通過Spring提供的utils類獲取ApplicationContext物件 
繼承自抽象類ApplicationObjectSupport 
繼承自抽象類WebApplicationObjectSupport 
實現介面ApplicationContextAware 
通過Spring提供的ContextLoader

注意:通過繼承類或者實現介面都需要交給spring去託管,否則無法使用ApplicationContext物件

在初始化時儲存ApplicationContext物件
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); 
ac.getBean("userService");
通過Spring提供的utils類獲取ApplicationContext物件
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc); 
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc); ac1.getBean("beanId"); ac2.getBean("beanId");

例項

public class MyServlet extends HttpServlet {
 public void init() throws ServletException {         
        super.init();
        ServletContext servletContext = getServletContext(); 
        WebApplicationContext ctx =WebApplicationContextUtils.getWebApplicationContext(servletContext);
        (Bean)ctx.getBean("bean"
); } }
繼承自抽象類ApplicationObjectSupport

說明:抽象類ApplicationObjectSupport提供getApplicationContext()方法。能夠方便的獲取ApplicationContext。
Spring初始化時。會通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 物件注入。

繼承自抽象類WebApplicationObjectSupport

說明:類似上面方法。呼叫getWebApplicationContext()獲取WebApplicationContext

實現介面ApplicationContextAware
@Component
public class SpringContextUtil implements ApplicationContextAware {
    /**
     * Spring應用上下文環境
     */
    private static ApplicationContext applicationContext;

    /**
     * 實現ApplicationContextAware介面的回撥方法。設定上下文環境
     *
     * @param applicationContext
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        SpringContextUtil.applicationContext = applicationContext;
    }

    /**
     * @return ApplicationContext
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 獲取物件
     *
     * @param name
     * @return Object
     * @throws BeansException
     */
    public static Object getBean(String name) throws BeansException {
        return applicationContext.getBean(name);
    }

    /**
     * 獲取物件通過Class
     *
     * @param cls
     * @return Object
     * @throws BeansException
     */
    public static <C> Object getBean(Class<C> cls) throws BeansException {
        return applicationContext.getBean(cls);
    }
通過Spring提供的ContextLoader
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
wac.getBean(beanID);