spring中静态类调用非静态对象的方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring中静态类调用非静态对象的方法相关的知识,希望对你有一定的参考价值。
大家好,我想请教个问题,项目中有个成功的service及其实现类impl,现在因需求原因,我新写了个类,这个类是全局唯一的,在tomcat启动的时候通过servlet来进行初始化创建,在这个全局类中我调用了上面说的service的方法,但是程序报错说service中的一个属性为null,
这是全局类中的调用代码:
ThirdPaymentService thirdpaymentservice=new ThirdPaymentService();
Map map=thirdpaymentservice.getPayStatusMap(orderid);(thirdpaymentservice为其他部分已测试通过的service,类名为ThirdPaymentService)
这是出错的函数,其中就是报告函数中第一行
rechargeService为空
public Map getPayStatusMap(Long orderId) throws BusinessException
Rechange recharge = rechargeService.searchRecharge(orderId);
return getPayStatusMap(recharge);
其定义为@Service
@Property
public class ThirdPaymentService
@Autowired
private RechargeService rechargeService; // 充值service
我调用ThirdPaymentService 实例的时候,rechargeService通过@autowired注解应该已经注入了,为什么还是会为null 呢,请求指点,谢谢!
首先,检查是否开启Autowired自动装配功能,在Spring配置文件中应该配置:
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
然后,检查注入的rechargeService这个Bean有没有在配置文件中定义。
<bean id="rechargeService" class="com.xxx.RechargeService">
</bean>
你有没有在RechargeService类上使用注解,来把它定义为一个Bean?
如果你是使用的注解来定义RechargeService这个Bean,请确保打开了Bean注解功能:
<context:component-scan base-package="com.xxx" />追问
1,3已经打开了,在RechargeService类使用了注解@Service,确保他能作为一个bean被注入,主要是ThirdPaymentService 是在一个已经在别的地方成功使用的,应该来说他里面的属性及方法都不应该有问题
追答那么有可能问题是出在ThirdPaymentService thirdpaymentservice=new ThirdPaymentService();
你最好是把ThirdPaymentService也纳入Spring容器的管理中,也就是在这个类上也定义注解。
然后测试的时候不要用new来实例化,而要用Spring容器为这个类产生的实例,可以通过Spring容器上下文来获得:
ThirdPaymentService thirdpaymentservice = (ThirdPaymentService)context.getBean("thirdpaymentservice");
对的,我后来用spring容器产生的实例就ok了
参考技术A 当前对象调用的时候可以省略,也就是省略了this.不用对象不可以调用非静态方法。
省略了this.
this. 可以写也可以不写,写成this.add(panel); 也对。
参考技术B spring配置文件里边的bean id是rechargeService吧?追问
配置文件里没有bean配置,全是用注解@Service + @Autowired实现注入
转:静态方法中调用非静态方法
//A ststic method cannot call a non-static method, but we can transfer a object reference, which include a non-static metho to the static method, thus, wo can call that non-static method in a indirect way.
public class StaticMethodTest{
void NonStaticMethod(){
System.out.println("This is a non-sataic method.");
static void StaticMethod(StaticMethodTest s){
System.out.println("This is a static method.");
s.NonStaticMethod();
}
StaticMethod(sObj); //在主函数中可以直接调用静态方法
}
}
以上是关于spring中静态类调用非静态对象的方法的主要内容,如果未能解决你的问题,请参考以下文章