Spring注解驱动开发 第十四节 @Autowired标志位置的原理

Spring注解驱动开发 第十四节 @Autowired标志位置的原理

本节主要了解@Autowired注解标注在不同位置是spring是如何工作的。

首先是标注在属性上

	@Autowired
    private Car car;

向上面代码一样,在spring容器启动的时候会把注入的组件装配到这个变量上。这个也是比较常用的标注位置。

	@Autowired
    public void setCar(Car car) {
        this.car = car;
    }

这段代码我们把Autowired注解标注在了方法上,同样可以把容器中的组件装配到属性上,他的运行原理是在spring启动,组件注入后会调用这个方法,然后将spring容器中对应的组件注入到这个方法的参数上,也就是Car对象上,然后就完成了装配。我们看一下打印结果。

四月 24, 2019 9:39:59 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@4141d797: startup date [Wed Apr 24 21:39:59 CST 2019]; root of context hierarchy
Boss{car=com.meng.dao.Car@358c99f5}
com.meng.dao.Car@358c99f5

Process finished with exit code 0

由于我是在用Autowired注解装配到组件打印了一次,然后自己调用getBean又去spring容器取了一份,进行对比,无论我们使用getBean获取还是Autowired装配,取出来的对象都是同一个。同时这个结果也证明了Autowired是可以标注在方法上的。

同时,还可以把Autowired标注在构造器上。

	@Autowired
    public Boss(Car car){
        this.car = car;
    }

我们把Autowired标注在了有参谋构造器上,下面说一说标注在构造器可以运行的原理,首先,在以前的情况下,就算是无参构造,spring在启动时会调用类的无参构造,然后将他注入到spring容器,这样说现在就很容易理解了,spring在启动的时候会调用Boss类的有参构造,那么参数Car从哪里来,当然是spring容器中来的,所以spring在调用有参构造就把自己容器的car装配给有参构造,就完成了装配。让我们查看打印结果:

Boss{car=com.meng.dao.Car@23282c25}
com.meng.dao.Car@23282c25

Process finished with exit code 0

没有问题,但是我们引发了一个新问题,就是既然spring自动调用有参构造,那么为什么还要加@Autowired,这句话算是说对了,就算不加这个注解,依然能运行成功,所以了解原理是十分重要的。

	public Boss(Car car){
        this.car = car;
    }

打印结果:

Boss{car=com.meng.dao.Car@14ec4505}
com.meng.dao.Car@14ec4505

Process finished with exit code 0

最后我们采用这种方式来装配bean:

 	@Bean
    public Boss boss(Car car){
        Boss boss = new Boss();
        boss.setCar(car);
        return boss;
    }

这种是传统的配置类中注入spring的方式。其实原理和前面的有参构造差不多,因为它本身就是注入spring容器,spring在启动后,调用这个方法,然后参数是从spring容器中取出的,然后创建boss对象,并把car传递进去,最后boss类也被注入到spring容器中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值