龙空技术网

静态方法中使用Spring加载的对象

JavaFans 257

前言:

今天姐妹们对“java中静态方法可以用对象调用吗”可能比较关心,小伙伴们都想要分析一些“java中静态方法可以用对象调用吗”的相关内容。那么小编同时在网摘上收集了一些对于“java中静态方法可以用对象调用吗””的相关资讯,希望各位老铁们能喜欢,各位老铁们一起来了解一下吧!

我们经常需要在一些工具类的静态方法中使用spring创建加载的对象。比如静态工具类方法依赖的数据信息来源自数据库,而从数据库中获取数据的对象是Spring自动创建和加载的。

实现方式一

1、在该工具类Partner 中注入Spring 管理的PartnerService对象service。

2、使用@PostConstruct 注解方式创建。

3、类Partner上加入@Component类似注解

具体示例代码如下:

@Componentpublic class Partner {     private static Map partners = new HashMap();     private static Partner instance;     @Autowired     private PartnerService service;     @PostConstruct     public void init() {          instance = this;          instance.service = this.service;          //从数据库中获取数据          List partnerEnties = instance.service.getAllPartners();          for (P p : partnerEnties) {          		 partners.put(p.getAppKey(), p);          }     }     public static Partner getInstanceFromDb(){     				return instance;     }}
实现方式二

构造函数方式注入依赖的Spring管理对象proxyConfig,并利用其数据来创建该类的静态属性RequestConfig对象config。这样在该类的其他方法中就能正常使用config对象了。

其中proxyConfig对象为自己定义pojo对象。

@Componentpublic class HttpUtil {    private static RequestConfig config;    public HttpUtil(ProxyConfig proxyConfig) {        initRequestConfig(proxyConfig);    }    private static void initRequestConfig(ProxyConfig proxyConfig) {        RequestConfig.Builder builder = RequestConfig.custom();        if (proxyConfig != null ) {            HttpHost proxy = new HttpHost(proxyConfig.getHost(), proxyConfig.getPort());            builder.setProxy(proxy);        }        HttpUtil.config = builder.setConnectTimeout(5000)                .setSocketTimeout(5000)                .build();    }    /**     * post 请求       */    public static Map<String, Object> post(Request request, String url) throws Exception {            SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(                SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build(),                NoopHostnameVerifier.INSTANCE        );        // 可以使用config类        CloseableHttpClient httpClient = HttpClientBuilder.create()          				.setSSLSocketFactory(csf)           				.setDefaultRequestConfig(config).build();        HttpPost httpPost = new HttpPost(url);        //do sth.    }}
实现方式三

利用ApplicationContextAware来实现

/** * spring获取工具类 * @since 1.0 */@Componentpublic class ApplicationBean implements ApplicationContextAware {    private static ApplicationContext context;    /**     * 当继承了ApplicationContextAware类之后,那么程序在调用     * getBean(String)的时候会自动调用该方法,不用自己操作     */    @Override    public void setApplicationContext(ApplicationContext appContext)            throws BeansException {        ApplicationBean.context= appContext;    }    public static Object getBean(String beanName){        return ApplicationBean.context.getBean(beanName);    }    public static <T> T getBean(Class<T> calzz) {        return ApplicationBean.context.getBean(calzz);    }}

ApplicationBean类就能利用getBean()静态方法类获取Spring管理的对象。

标签: #java中静态方法可以用对象调用吗