假设我有一个自动装配服务类的componentnet类。像
@Autowired
private MyService myService;
然后如果我想从同一个类的私有方法中使用它,比如
private void callService(){
myService.servmMthod();
}
它会给我们一个空指针,因为myService在这里为null但是如果方法是公开的,那么它将是正常的
public void callService(){
myService.servmMthod();
}
你能解释一下它为什么会这样吗?
基于评论:
@Component
public class MyDemo {
@Autowired
private MyService myService;
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"spring.xml");
Customer c1 = null;
MyDemo myDemo = ctx.getBean(MyDemo.class);
myDemo.callService(ctx);
}
private void callService(ApplicationContext ctx) {
System.out.println(myService);
myService.callMydao();
}
}
如果callService
是公开的,那么其他工作正常myService
为空。
答案 0 :(得分:0)
我猜您的MyService
正在使用AOP,因此Spring使用动态代理来创建MyDemo
类的代理。
当容器扫描Bean生成代理类时,可以代理公共方法,但是不代理私有方法。属性注入也是在代理类中完成的,因此通过公共方法获得的注入属性就是注入。私有方法在注入未完成时获取属性,因此为null。