获取spring 容器中的bean方法

      在开发中,总是能碰到用注解注入不了Spring容器里面bean对象的问题,发现注入的对象为null,针对此问题进行分析

  1. 首先,静态方法中不可调用非静态方法,这与JVM加载类的机制有关。
  2. Spring的依赖注入实际上是依赖于Set方法进行注入值的,Spring是基于对象层面的依赖注入,而静态属性/静态变量实际上是属于类的。

 

目前实现有三种方案:

第一种:

 

package com.scai.mplus.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
* @author : fxh
* @version : 1.0
* @class-name : com.scai.mplus.config.SpringUtil
* @description :
* @date : 2019/1/24 10:41
**/
@Component
public class SpringUtil implements ApplicationContextAware {

private static ApplicationContext applicationContext;
private Logger logger = LoggerFactory.getLogger(SpringUtil.class);
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringUtil.applicationContext == null) {
SpringUtil.applicationContext = applicationContext;
}
logger.info("#####ApplicationContext配置成功");
}

/**
* 获取applicationContext
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过name获取 Bean.
* @param name
* @return
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}

/**
* 通过class获取Bean
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}

/**
* 通过name,以及Clazz返回指定的Bean
* @param name
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}


注: 在其他类中就可以直接通过SpringUtil.getBean(xxx.class)获取容器中对应的bean

第二种方法:
package com.scai.mplus.util;


import com.scai.mplus.analysis.jieba.viterbi.SegResult;
import com.scai.mplus.common.RspMsg;
import com.scai.mplus.seg.service.AddressSegService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
* @Description: java类作用描述 在静态方法中获取spring 容器中注入的bean
* @Author: fxh
* @CreateDate: 2019/1/24 15:45
* @UpdateUser: fxh
* @UpdateDate: 2019/1/24 15:45
* @UpdateRemark: 修改内容
* @Version: 1.0
*/
@Component //此处注解不能省却
public class GetBean {


private static String clazzName = GetBean.class.getName();
/**
* 此处是要使用的service需要spring注入
*/
@Autowired
private AddressSegService addressSegService;
private static GetBean getBean;
/**
* 注意此处注解 */
@PostConstruct
public void init() {
getBean = this;
getBean.addressSegService = this.addressSegService;
}
/**
* 主要使用场景(3)
*/
public static void insertParam(int id){
/**
* 注意此处的调用方法(4)
*/
RspMsg<SegResult>rspMsg = getBean.addressSegService.segAddress("xxxx");

}

}


注:@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行)的方法public void init()先给该类赋值,然后通过(1)出注入进来。这样不影响dao等service下面调用的注入

 

第三种

 

使用xml配置文件注入bean,如:

 

<bean id="stringUtil" class="com.*.*.util" init-method="init">
<property name="xxx" ref="xxx"/>
</bean>

 

posted @ 2019-01-24 16:04  scai-sky  阅读(843)  评论(0编辑  收藏  举报