说明:本文介绍 Spring Boot 中三种注入 Bean 的方式。
场景
写两个接口,两个实现类
(OrderService)
java
public interface OrderService {
String test();
}
(UserService)
java
public interface UserService {
String test();
}
(OrderServiceImpl)
java
import com.hezy.demo.OrderService;
import org.springframework.stereotype.Service;
@Service
public class OrderServiceImpl implements OrderService {
@Override
public String test() {
return "order";
}
}
(UserServiceImpl)
java
import com.hezy.demo.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Override
public String test() {
return "user";
}
}
写一个接口,调用 OrderService,实现类中注入 UserService,共同完成接口。
java
import com.hezy.demo.OrderService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class DemoController {
@Resource
private OrderService orderService;
@GetMapping("/test")
public String test2(){
return orderService.test();
}
}
基于以上场景,介绍在 OrderService 实现类中,注入 UserService 的三种方式。
方式一:属性注入
如下,直接定义变量,使用 @Autowired 注解,或者 @Resource 注解,完成注入。这种方式也叫字段注入。
java
@Autowired
private UserService userService;
或者
java
@Resource
private UserService userService;
方式二:构造器注入
如下,定义一个 Bean 属性,在 OrderService 实现类的构造器中完成注入。
java
import com.hezy.demo.OrderService;
import com.hezy.demo.UserService;
import org.springframework.stereotype.Service;
@Service
public class OrderServiceImpl implements OrderService {
private final UserService userService;
public OrderServiceImpl(UserService userService) {
this.userService = userService;
}
}
方式三:接口注入
创建一个接口,用来装配 UserService Bean,如下:
java
public interface UserServiceBean {
void setUserService(UserService userService);
}
让 OrderService 的实现类,实现这个接口
java
@Service
public class OrderServiceImpl implements OrderService, UserServiceBean {
因为 Spring 不支持接口注入,这里手动在 IOC 容器中查找,完成注入
java
private UserService userService;
@Autowired
private ApplicationContext context;
@PostConstruct
public void init() {
setUserService(context.getBean(UserService.class));
}
@Override
public void setUserService(UserService userService) {
this.userService = userService;
}
测试
在 OrderService 实现类中,调用注入的 UserService 方法,拼接方法返回值,返回接口。
java
@Override
public String test() {
String user = userService.test();
return user + "-" + "order";
}
启动项目,三种注入方式均可以正常注入。

另外
另外,还有两种注入情况,如下,
java
private UserService userService;
@Autowired
public OrderServiceImpl(UserService userService) {
this.userService = userService;
}
或者
java
private UserService userService;
public OrderServiceImpl(@Autowired UserService userService) {
this.userService = userService;
}
在构造器注入的基础上额外使用 @Autowired 注解,不加也行,是 Spring 旧版本的写法。