当我们在Controller层想要使用Service层时,注入的方式通常是使用的是@Autowired
或者@Resource
注解,我们写的代码一般就如下:
Service层
package com.example.test.service;
public interface DogService {
String say();
}
package com.example.test.service;
import org.springframework.stereotype.Service;
@Service
public class DogServiceImpl implements DogService{
@Override
public String say() {
return "Wang!Wang!Wang!";
}
}
Controller层
package com.example.test.controller;
import com.example.test.service.DogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DogController {
@Autowired
private DogService dogService;
@GetMapping("/say")
public String say(){
return this.dogService.say();
}
}
通过@Service
注解,将DogService
接口的实现类交给Spring容器进行管理,在DogController
中直接使用@Autowired
或者@Resource
注解注入实例。
注意
@Autowired
或者@Resource
区别
@Autowired
是按照类型注入,@Resource
是按照Bean名称注入
而在Spring 4.3之后,为我们带来了一种更加优雅的依赖注入方式
需要将Controller层代码改造如下:
package com.example.test.controller;
import com.example.test.service.DogService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DogController {
public DogController(DogService dogService){
this.dogService = dogService;
}
private final DogService dogService;
@GetMapping("/say")
public String say(){
return this.dogService.say();
}
}
首先定义了一个含参构造器,因为之后需要使用改构造器实现依赖注入,所以为了遵从依赖不可变的原则,将dogService属性添加final修饰(意思是不添加final也可以完成依赖注入),到这依赖注入的步骤就已经结束了,剩下的交给Spring的新特性:如果目标 bean 只定义了一个构造函数,则它无需要指定@Autowired
注解,也就是说,Spring会识别到唯一的构造函数,然后使用该构造函数去进行依赖注入!
但是我们需要格外写一个构造函数,构造函数?!Lombok
啊!!!
我们引入Lombok依赖
再次改写Controller层!
package com.example.test.controller;
import com.example.test.service.DogService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@AllArgsConstructor
public class DogController {
private final DogService dogService;
@GetMapping("/say")
public String say(){
return this.dogService.say();
}
}
直接使用Lombok的@AllArgsConstructor
注解来生成构造器,这样无论需要注入多少依赖,一个@AllArgsConstructor都可以搞定!