获取spring 容器中的bean方法
在开发中,总是能碰到用注解注入不了Spring容器里面bean对象的问题,发现注入的对象为null,针对此问题进行分析
- 首先,静态方法中不可调用非静态方法,这与JVM加载类的机制有关。
- 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>