Bean的三种注入方式

说明:本文介绍 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 旧版本的写法。

相关推荐
Billy121382 分钟前
Day25-编译期计算与 constexpr if:跨越编译与运行的边界
开发语言·c++进阶学习
掘金酱10 分钟前
TRAE Work 实战帮征文 | 获奖名单公示
前端·人工智能·后端
小小龙学IT20 分钟前
第七节 C++ 与 QML 交互
开发语言·qt
用户693717500138429 分钟前
前阵子刷屏的 Ox-Alpha 真身揭晓!GLM-5.3-Flash 上线,这价格真的杀疯了
前端·后端·github
四千岁35 分钟前
抓包LangChain-了解LangChain的原理
前端·javascript·后端
晓晓_za89866835 分钟前
Geo 优化源码二次开发:自定义地域规则改造实操文档
java·开发语言·搜索引擎·ci/cd·矩阵
摇滚侠36 分钟前
《SpringBoot 3:入门与应用实战》第 8 章 AOP 的进阶机制和应用 阅读笔记 16
java·spring boot·笔记
泡海椒38 分钟前
JQuick-Curl 快速上手:Maven 依赖与第一个 HelloWorld 请求
后端
QQ_21696290961 小时前
【源码编号:project86570】SpringBoot电影院在线选座售票系统:电影排片、在线选座、订单购票、后台管理完整实战
java·spring boot·后端
卷无止境1 小时前
FastAPI 实现 SSO,从协议原理到生产级落地
后端·python·fastapi