为什么没有从私有方法调用自动装配的实例?

时间:2015-02-24 09:35:24

标签: java spring autowired

假设我有一个自动装配服务类的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为空。

1 个答案:

答案 0 :(得分:0)

我猜您的MyService正在使用AOP,因此Spring使用动态代理来创建MyDemo类的代理。

当容器扫描Bean生成代理类时,可以代理公共方法,但是不代理私有方法。属性注入也是在代理类中完成的,因此通过公共方法获得的注入属性就是注入。私有方法在注入未完成时获取属性,因此为null。