面试题总结
其它面试题(springboot、mybatis、并发、java中高级面试总结等)
可以看出@Autowired注解不仅可以标注在字段上。也可以标注在构造方法上,实例方法上,参数上。
案例准备
接下来,我们在项目中新建一个Dog类,在Doc类中有一个Cat类的引用,并且我们使用@Component注解将Dog类加载到IOC容器中,如下所示。
package io.mykit.spring.plugins.register.bean;
import org.springframework.stereotype.Component;
/**
-
@author binghe
-
@version 1.0.0
-
@description 测试实体类
*/
@Component
public class Dog {
private Cat cat;
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
@Override
public String toString() {
return “Dog{” + “cat=” + cat + ‘}’;
}
}
配置好之后,我们还需要在AutowiredConfig类的@ComponentScan注解中进行配置,使其能够扫描io.mykit.spring.plugins.register.controller
包下的类,如下所示。
@Configuration
@ComponentScan(value = {
“io.mykit.spring.plugins.register.dao”,
“io.mykit.spring.plugins.register.service”,
“io.mykit.spring.plugins.register.controller”,
“io.mykit.spring.plugins.register.bean”})
public class AutowiredConfig {
}
此时,我们可以直接在Dog类中的cat字段上添加@Autowired注解,使其自动装配。这是我们在《【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?》一文中得出的结论。那今天我们就使用其他的方式来实现cat的自动装配。
标注在实例方法上
我们也可以将@Autowired注解标注在setter方法上,如下所示。
@Autowired
public void setCat(Cat cat) {
this.cat = cat;
}
当@Autowired注解标注在方法上时,Spring容器在创建对象的时候,就会调用相应的方法为对象赋值。如果标注的方法存在参数时,则方法使用的参数和自定义类型的值,需要从IOC容器中获取。
接下来,我们将AutowiredTest类的testAutowired01()方法中有关获取和打印PersonService信息的代码注释,新增获取和打印Dog信息的代码,如下所示。
@Test
public void testAutowired01(){
//创建IOC容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AutowiredConfig.class);
//PersonService personService = context.getBean(PersonService.class);
//System.out.println(personService);
Dog dog = context.getBean(Dog.class);
System.out.println(dog.toString());
context.close();
}
运行AutowiredTest类的testAutowired01()方法进行测试,可以看到,结果信息中输出了如下一行信息。
Dog{cat=io.mykit.spring.plugins.register.bean.Cat@6a400542}
说明已经获取到cat的信息,可以将@Autowired注解标注在方法上
为了验证最终的输出结果是否是从IOC容器中获取的,我们可以在AutowiredTest类的testAutowired01()方法中直接获取Cat的信息,如下所示。
@Test
public void testAutowired01(){
//创建IOC容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AutowiredConfig.class);
//PersonService personService = context.getBean(PersonService.class);
//System.out.println(personService);
Dog dog = context.getBean(Dog.class);
System.out.println(dog.toString());
Cat cat = context.getBean(Cat.class);
System.out.println(cat);
context.close();
}
我们再次运行AutowiredTest类的testAutowired01()方法进行测试,可以在输出的结果信息看到如下两行代码。
Dog{cat=io.mykit.spring.plugins.register.bean.Cat@6a400542}
io.mykit.spring.plugins.register.bean.Cat@6a400542
可以看出在Dog类中通过@Autowired注解获取到的Cat对象和直接从IOC容器中获取到Cat对象是同一个对象。
标注在构造方法上
在前面的案例中,我们在Dog类上使用了@Component注解,如下所示。
package io.mykit.spring.plugins.register.bean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
-
@author binghe
-
@version 1.0.0
-
@description 测试实体类
*/
@Component
public class Dog {
private Cat cat;
public Cat getCat() {
return cat;
}
@Autowired
public void setCat(Cat cat) {
this.cat = cat;
}
@Override
public String toString() {
return “Dog{” +
“cat=” + cat +
‘}’;
}
}
此时,Spring默认加载IOC容器中的组件,IOC容器启动的时候默认会调用bean的无参构造器创建对象,然后再进行初始化赋值等操作。
接下来,我们为Dog类添加一个有参构造方法,然后去除setCat()方法上的@Autowired注解,将@Autowired注解标注在有参构造方法上,并在构造方法中打印信息,如下所示。
package io.mykit.spring.plugins.register.bean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
-
@author binghe
-
@version 1.0.0
-
@description 测试实体类
*/
@Component
public class Dog {
private Cat cat;
@Autowired
public Dog(Cat cat){
this.cat = cat;
System.out.println(“调用了Dog的有参构造方法”);
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
@Override
public String toString() {
return “Dog{” +
“cat=” + cat +
‘}’;
}
}
接下来,我们运行AutowiredTest类的testAutowired01()方法进行测试,可以看到输出结果信息中存在如下一行信息。
调用了Dog的有参构造方法
说明IOC容器在启动的时候调用了Dog类的有参构造方法。并且可以从输出的如下两行信息可以看出:通过Dog类的toString()方法打印出的Cat对象和直接从IOC容器中获取的Cat对象是同一个对象。
Dog{cat=io.mykit.spring.plugins.register.bean.Cat@6a400542}
io.mykit.spring.plugins.register.bean.Cat@6a400542
这里,需要大家注意的是:使用@Autowired注解标注在构造方法上时,构造方法中的参数对象也都是从IOC容器中获取的。
标注在参数上
我们也可以将@Autowired注解标注在参数上,例如,在Dog类中我们将构造方法上的@Autowired注解标注在构造方法的参数上,如下所示。
public Dog(@Autowired Cat cat){
this.cat = cat;
System.out.println(“调用了Dog的有参构造方法”);
}
也可以将@Autowired注解标注在setter方法的参数上,如下所示。
public void setCat(@Autowired Cat cat) {
this.cat = cat;
}
这些效果与标注在字段、实例方法和构造方法上的效果都是一样的。
例如,我们将@Autowired注解标注在构造方法的参数上,运行AutowiredTest类的testAutowired01()方法进行测试,可以看到,输出结果中,同样包含如下三行信息。
调用了Dog的有参构造方法
Dog{cat=io.mykit.spring.plugins.register.bean.Cat@6a400542}
io.mykit.spring.plugins.register.bean.Cat@6a400542
最后
每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。
如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。
io.mykit.spring.plugins.register.bean.Cat@6a400542
最后
每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。
如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。
[外链图片转存中…(img-PRhxjQSc-1715482552350)]