org.springframework.boot:spring-boot-starter-parent:2.6.4

Java 8

--

 

前言

在Spring项目中,一般使用 @Autowired 注入,不过,这种方式已经不是官方推荐的使用方式。

本文介绍几种使用 注解注入Bean的方式。

建立一个Spring Boot的Web项目,引入lombok。

建立服务类:

public interface ITest1Service {
	Date getNow();	
}

@Service
public class Test1Service implements ITest1Service {
	@Override
	public Date getNow() {
		return new Date();
	}
}

接下来,使用不同方式在 Controller中注入 上面的 Service Bean。发布于博客园

 

在 属性上使用 @Autowired 注解

import org.springframework.beans.factory.annotation.Autowired;

属性

@RestController
@RequestMapping(value = {"/api/test/1"})
@Slf4j
public class Test1Controller {

	@Autowired
	private ITest1Service test1Service;

	@GetMapping(value = {"/getNow"})
	public Date getNow() {
		log.info("Test1Controller test1Service={}", test1Service);
		return test1Service.getNow();
	}
	
}


使用 @Resource 注解

import javax.annotation.Resource;

@RestController
@RequestMapping(value = {"/api/test/2"})
@Slf4j
public class Test2Controller {

	@Resource(name = "test1Service")
	private ITest1Service test1Service;

	@GetMapping(value = {"/getNow"})
	public Date getNow() {
		log.info("Test2Controller test1Service={}", test1Service);
		return test1Service.getNow();
	}
	
}


在 setter方法上使用 @Autowired 注解

setter方法

@RestController
@RequestMapping(value = {"/api/test/3"})
@Slf4j
public class Test3Controller {

	private ITest1Service test1Service;
	
	@Autowired
	public void setTest1Service(ITest1Service test1Service) {
		this.test1Service = test1Service;
	}

	@GetMapping(value = {"/getNow"})
	public Date getNow() {
		log.info("Test3Controller test1Service={}", test1Service);
		return test1Service.getNow();
	}
	
}

 

使用 @RequiredArgsConstructor 注解

import lombok.RequiredArgsConstructor;

+

final

@RestController
@RequestMapping(value = {"/api/test/4"})
@RequiredArgsConstructor
@Slf4j
public class Test4Controller {

	// final
	private final ITest1Service test1Service;

	@GetMapping(value = {"/getNow"})
	public Date getNow() {
		log.info("Test4Controller test1Service={}", test1Service);
		return test1Service.getNow();
	}
	
}

 

测试结果

调用各个 接口 /api/test/*/getNow,各个Controller都注入成功,注入的 test1Service 是同一个Bean。

: Test1Controller test1Service=com.bzhy.ben.service.Test1Service@7d1ed2bd
: Test2Controller test1Service=com.bzhy.ben.service.Test1Service@7d1ed2bd
: Test3Controller test1Service=com.bzhy.ben.service.Test1Service@7d1ed2bd
: Test4Controller test1Service=com.bzhy.ben.service.Test1Service@7d1ed2bd

 

还有什么其它的方式吗?


参考资料

1、spring代替 @Autowired(lombok相关注解)

https://www.jianshu.com/p/087f805c1542

2、Spring Boot 生产中 16 条优秀实践

https://www.51cto.com/article/717811.html

3、