@Autowired注解详解——超详细易懂
@Autowired详解
要搞明⽩@Autowired注解就是要了解它是什么?有什么作⽤?怎么⽤?为什么?
⾸先了解⼀下IOC操作Bean管理,bean管理是指(1)spring创建对象 (2)spring注⼊属性。当我们在将⼀个类上标注@Service或者@Controller或@Component或@Repository注解之后,spring的组件扫描就会⾃动发现它,并且会将其初始化为spring应⽤上下⽂中的bean。 当需要使⽤这个bean的时候,例如加上@Autowired注解的时候,这个bean就会被创建。⽽且初始化是根据⽆参构造函数。先看代码来体会⼀下这个注解的作⽤,测试代码如下:(@Data注解是由Lombok库提供的,会⽣成getter、setter以及equals()、hashCode()、toString()等⽅法)
@Data
spring ioc注解@Service
public class AutoWiredBean {
private int id;
private String name;
public AutoWiredBean(){
System.out.println("⽆参构造函数");
}
public AutoWiredBean(int id, String name){
this.id = id;
this.name = name;
System.out.println("有参构造函数");
}
}
在springboot项⽬的测试类中进⾏测试,代码如下
@SpringBootTest
@RunWith(SpringRunner.class)
class Springboot02WebApplicationTests {
private AutoWiredBean autoWiredBean;
@Autowired
public Springboot02WebApplicationTests (AutoWiredBean autoWiredBean){
this.autoWiredBean = autoWiredBean;
}
@Test
void contextLoads(){
System.out.println(autoWiredBean);
System.out.Id());//0
System.out.Name());//null
}
}
控制台输出的结果如下:
将下⾯代码注释了在运⾏
/* @Autowired
public Springboot02WebApplicationTests (AutoWiredBean autoWiredBean){
this.autoWiredBean = autoWiredBean;
}*/
输出结果如下:
从这我们可以看到⽆论有没有使⽤AutoWiredBean 类,它都被spring通过⽆参构造函数初始化了。当将被使⽤时才会创建。
进⼊正题它有什么⽤?
@Autowired可以标注在属性上、⽅法上和构造器上,来完成⾃动装配。默认是根据属性类型,spring⾃动将匹配到的属性值进⾏注⼊,然后就可以使⽤这个属性(对Springboot02WebApplicationTests类来说)autoWiredBean对象的⽅法。
怎么⽤?
它可以标注在属性上、⽅法上和构造器上,那有什么区别吗?简单来说因为类成员的初始化顺序不同,静态成员 ——> 变量初始化为默认值——>构造器——>为变量赋值。如果标注在属性上,则在构造器中就不能使⽤这个属性(对象)的属性和⽅法。
推荐: 对构造函数标注注解,如图在构造器上标注@Autowired注解
当标注的属性是接⼝时,其实注⼊的是这个接⼝的实现类, 如果这个接⼝有多个实现类,只使⽤@Autowired就会报错,因为它默认是根据类型,然后就会到多个实现类bean,所有就不知道要注⼊哪个。然后它就会根据属性名去。所以如果有多个实现类可以配合
@Qualifier(value=“类名”)来使⽤ (是根据名称来进⾏注⼊的)可以参考
有些地⽅可能表述不清望包涵,望指出。我会马上改正
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论