SSM项目中,普通类中调用Service

一开始在普通类中调用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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值