获取ApplicationContext对象的实现 在static代码块中调用

在做一个需要从static代码块中操作数据库的方式。如果重新建立一个数据库连接有点low,所以从spring中进行获取。网上搜索到几种方式。需要new几个对象。因为已经有一个了。再new一个。不合理。所以本人使用了如下的方式进行获取bean。

所以使用了实现ApplicationContextAware来实现

@Service
public class SpringContextHolder implements ApplicationContextAware {
//    ServletContextListener
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

        SpringContextHolder.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String beanName) {
        return applicationContext.getBean(beanName);
    }

    public static <T>T getBean(String beanName , Class<T>clazz) {
        return applicationContext.getBean(beanName , clazz);
    }

}


本人使用的是注解方式。只需要在类上面加上一个@Service 就可以。不用在xml中进行配置。

这样调用getBean方法就可以获取bean对象了。

具体的在static代码块中进行查询数据。如下。

有一个中间类。下面分为两段代码。

/**
 * 使用static方法获取 spring 中bean对象
 *
 * Created by abing on 2015/11/6.
 */
public class CommonBeanUtils {

    //
    public static Object getBean(String name){

        Object object = SpringContextHolder.getBean(name);

        return object;
    }

}
static {
    PlatformLogger.message("============================================");
    TUserService tUserService = (TUserService) CommonBeanUtils.getBean("userService");
    List<TUser> list = tUserService.getUserById("1");
    PlatformLogger.message("============================================");
    for (TUser tUser : list) {
        PlatformLogger.message(tUser.getId() + "  " + tUser.getName() + "  " + tUser.getPassword());
    }
    PlatformLogger.message("============================================");
}


这样就可以在static代码块中查询数据库了。


通过在网上搜索,发现还有几种方式能获取bean对象。下面列出几种方式来。

方法一:在初始化时保存ApplicationContext对象 
代码: 
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId"); 

方法二:通过Spring提供的工具类获取ApplicationContext对象
代码:
import org.springframework.web.context.support.WebApplicationContextUtils;
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
ac1.getBean("beanId");
ac2.getBean("beanId")


方法三:继承自抽象类ApplicationObjectSupport
说明:抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContext。
Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。

方法四:继承自抽象类WebApplicationObjectSupport
说明:类似上面方法,调用getWebApplicationContext()获取WebApplicationContext


方法四:继承自抽象类WebApplicationObjectSupport
说明:类似上面方法,调用getWebApplicationContext()获取WebApplicationContext




还有一种方式是beanFactoryAware 

自己测试了一下确实可行。下面贴出代码。

@Service
public class HolderBeanFactoryAware implements BeanFactoryAware {

    private static BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        HolderBeanFactoryAware.beanFactory = beanFactory;
    }

    public static Object getBean(String beanName) {
        return beanFactory.getBean(beanName);
    }

    public static <T>T getBean(String beanName , Class<T>clazz) {
        return beanFactory.getBean(beanName , clazz);
    }

}

自己操作数据库的地方

/**
 * 测试BeanFactoryAware来获取bean对象的例子
 */
public static void testBeanFactoryAware(){
    TUserService tUserService = (TUserService) HolderBeanFactoryAware.getBean("userService");
    List<TUser> list = tUserService.getUserById("1");
    PlatformLogger.message("============================================");
    for (TUser tUser : list) {
        PlatformLogger.message(tUser.getId() + "  " + tUser.getName() + "  " + tUser.getPassword());
    }
    PlatformLogger.message("============================================");
}

 

获取bean的方式 常见的方式为上面的五种方式。还有下面一种实现beanFactoryAware的实现方式。



你可能感兴趣的:(获取bean)