一开始在普通类中调用Service,报的空指针异常.
找的的解决方法如下:
1.写一个SpringInit辅助类,代码如下:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class SpingInit implements ServletContextListener{
private static WebApplicationContext springContext;
public SpingInit(){
super();
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent event) {
springContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
}
public static ApplicationContext getApplicationContext() {
return springContext;
}
}
2.把该类所在的包要被spring扫描
<context:component-scan base-package="com.test.utils" />
3.在web.xml中加入该类的监听事件
<listener>
<listener-class>com.test.utils.SpingInit</listener-class>
</listener>
4.在普通类中调用:
NotifyManagementInfoService notifyManagementInfoService =
(NotifyManagementInfoService) SpingInit.getApplicationContext().getBean("notifyManagementInfoServiceImpl");
若不知道bean的被命名成什么,可在xml中加入
<bean id=" testService" class="com.yzx.crbt.service.impl.CustomerServiceImpl" />
会报expected single matching bean but found 2: testService,customerServiceImpl异常,可查看bean被命名成什么....
我小白一个,在这里的时候还吃亏了...
好了,终于可以在普通类中进行操作了
notifyManagementInfoService.add(notifyManagementInfo);
参考博客:http://www.cnblogs.com/chongerlishan/p/5942033.html
-----------------------------------------------------------2018/8/6更新-----------------------------------------------------------------------------------
偶然遇到一位神人写的SpringUtils工具类,发现比我的之前找的方法好使多了,特此更新.
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
public final class SpringUtils implements BeanFactoryPostProcessor {
private static ConfigurableListableBeanFactory beanFactory; // Spring应用上下文环境
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
SpringUtils.beanFactory = beanFactory;
}
/**
* 获取对象
*
* @param name
* @return Object 一个以所给名字注册的bean的实例
* @throws org.springframework.beans.BeansException
*
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T) beanFactory.getBean(name);
}
/**
* 获取类型为requiredType的对象
*
* @param clz
* @return
* @throws org.springframework.beans.BeansException
*
*/
public static <T> T getBean(Class<T> clz) throws BeansException {
@SuppressWarnings("unchecked")
T result = (T) beanFactory.getBean(clz);
return result;
}
/**
* 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
*
* @param name
* @return boolean
*/
public static boolean containsBean(String name) {
return beanFactory.containsBean(name);
}
/**
* 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
* 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
*
* @param name
* @return boolean
* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
*
*/
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
return beanFactory.isSingleton(name);
}
/**
* @param name
* @return Class 注册对象的类型
* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
*
*/
public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
return beanFactory.getType(name);
}
/**
* 如果给定的bean名字在bean定义中有别名,则返回这些别名
*
* @param name
* @return
* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
*
*/
public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
return beanFactory.getAliases(name);
}
}
添加到bean中:
@Bean
public SpringUtils springUtils() {
return new SpringUtils();
}
监听也不用了,bean的名字也不用知道了...直接如此调用:
A a=SpringUtils.getBean(A.class);
相见恨晚,告辞!
-----------------------------------------------------------2019/11/6更新-----------------------------------------------------------------------------------
在多线程时使用@Autowired总是获取不到bean,原因是:new thread不在spring容器中,也就无法获得spring中的bean对象。
解决方法:手动获取
package com.test.configs;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class BeanContext implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
BeanContext.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext(){
return applicationContext;
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T)applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> clz) throws BeansException {
return (T)applicationContext.getBean(clz);
}
}
创建thread
package com.test.handler;
import com.test.configs.BeanContext;
import com.test.service.TestService;
import com.test.model.User;
/**
* created by huguoju on 2017/11/13.
*/
public class TestHandler implements Runnable {
private User user;
private TestService testService;
@Override
public void run() {
this.testService= BeanContext.getApplicationContext().getBean(TestService.class);
User user=testService.queryUserById(11);
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
原文地址:https://blog.csdn.net/u011493599/article/details/78522315