经常写springboot的同学都知道在我们需要用到ioc里面的对象的时候需要对要用到的对象进行@Autowired注释进行注入到当前类,这样一来会发现代码特别冗余很乱,这时候我们就建议进行构造器注入见下列代码
@RestController
@RequestMapping("/test")
// 在需要注入Bean的类上面加上该注解
@RequiredArgsConstructor
public class TestController {
// 这里可以用@NonNull或者用final修饰即可
@NonNull
private TestServiceImpl testService;
@RequestMapping("/testMethod")
private String testMethod(){
testService.shot();
return "成功";
}
}
@Data
@Service
@RequiredArgsConstructor
public class TestServiceImpl{
final Test test;
public void shot(){
System.out.println(test);
}
}
@Data
@Service
public class Test {
private String name = "张三";
private String age = "李四";
private String sex = "王五";
static {
System.out.println("先执行了test里面的static");
}
}
运行结果:
启动后日志打印:先执行了test里面的static
调用方法后执行:Test(name=张三, age=李四, sex=王五)
误区
很多同学会觉得我已经使用了构造器注入为什么还需要@Service来将需要注入的Bean通过这种方式注入到ioc呢?其实这是不对的,通过观察源码我们发现,@RequiredArgsConstructor的构造器注入是还是通过@Autowired从ioc里面获取到对象之后进行赋予引用,如果不对需要注入的对象放入ioc就会报错找不到类
注意
这里@RequiredArgsConstructor只会对当前类里面加了final或者@NonNull的属性进行注入,这对不需要注入的属性进行了区分