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 旧版本的写法。

相关推荐
weixin_440784116 小时前
【HandlerThread实现原理】
android·java·开发语言
天空'之城6 小时前
C 语言工业级通用组件手写 24:互补滤波
c语言·开发语言·互补滤波·嵌入式算法·工业级组件
leoZ2316 小时前
本地跑大模型实战(七):llama.cpp 性能调优,让推理更快更省
java·人工智能·spring·生成对抗网络·语言模型·自然语言处理·llama
有梦不弃6 小时前
模块化单体架构设计方案:DDD + 六边形架构落地实践
后端·架构
XR1234567886 小时前
工厂车间无线网络方案对比:AGV漫游哪家强?
开发语言·php
傻啦嘿哟7 小时前
某短视频平台视频爬虫实战:抓取推荐流视频信息,绕过反爬的3种技巧
开发语言·爬虫·python
現実君8 小时前
【硬件进阶】AD22上位替换JLEDA教程
开发语言·php
mubei-1238 小时前
SpringDAO的用法
java·开发语言·数据库
大模型momo8 小时前
Spring AI 实战:多 Agent 协作实战 —— 分工拆解复杂旅游行程任务
人工智能·spring·ai·agent·旅游
happymagic8 小时前
java spring boot做的jar包程序,如何实现自动运行启动
java·运维·服务器·spring boot·jar