> 文章列表 > springbean 的 setter/构造注入

springbean 的 setter/构造注入

springbean 的 setter/构造注入

文章目录

  • 前言
  • 一、另外两种注入的怎么用?
  • 二、使用setter和构造注入的步骤
    • 1. 搞一个配置类,用户获取spring容器中的bean
    • 2. 由于有静态方法,所以直接调用
  • 三、使用final 的构造注入方式(推荐)
  • 总结

前言

我们知道,一般java中的依赖注入有三种:
1 属性注入
2 settter注入
3 构造注入

我们习惯于在spring容器下进行开发了,所以一般都是用属性注入的方式,例如:

 @Autowired// @Resourceprivate PayService payService;

一、另外两种注入的怎么用?

今天遇到了一个问题,真正的体会到了另外两种注入的高明之处;

  • 属性注入, 必须依赖于spring容器,既: 你想用属性注入,那么你必须身在容器中(所在位置也被纳入了spring容器)
  • 另外两种注入,可以不在spring容器中,也可以获取到spring对象实例,然后进行相应操作!

二、使用setter和构造注入的步骤

1. 搞一个配置类,用户获取spring容器中的bean

代码如下(示例):

@Configuration
public class ResourceConfig {// setter 注入//@Resource//public void setAliPayService(AliPayServiceImpl aliPayService) {//    ResourceConfig.aliPayService = aliPayService;//}public ResourceConfig() {}// 构造注入@Autowiredpublic ResourceConfig(AliPayServiceImpl aliPayService) {ResourceConfig.aliPayService = aliPayService;}private static AliPayServiceImpl aliPayService;public static AliPayServiceImpl getAliPayService() {return aliPayService;}
}

2. 由于有静态方法,所以直接调用

代码如下(示例):

@SpringBootTest
class PayServiceTest123 {@Testvoid test(){AliPayServiceImpl aliPayService = ResourceConfig.getAliPayService();String s = aliPayService.toPay("123", 3);System.out.println(s);}
}

我甚至可以在static的方法中调用这个 实现类的方法~~


springbean 的 setter/构造注入

三、使用final 的构造注入方式(推荐)

这种方式也是springboot官方推荐的方式,依然可以解决上述说的问题;
Springboot官方建议使用final来修饰成员变量,final修饰的成员变量是不能够被修改的,就不能被反射了;
利用 @RequiredArgsConstructor + final 修饰,替换掉 @Autowired/@Resource

  • @RequiredArgsConstructor 也是一种构造注入,相当于为每一个final字段或者non-null字段生成一个构造方法
    使用示例如下:
@RequiredArgsConstructor
@Controller
public class AdminUserController {private final IUserService iUserService;@PostMapping(/login”)public Result adminLogin(HttpServletResponse response, String username,String password) {//…}
}
  • @AllArgsConstructor 和@RequiredArgsConstructor都可以用来替换@Autowired写法,区别在@RequiredArgsConstructor必须要有final修饰,使用@AllArgsConstructor后,@Value会失效,获取不到值。使用@RequiredArgsConstructor则正常。今后注入service、mapper等都使用@RequiredArgsConstructor好了。

总结

基于setter和构造注入得到的bean,其实也是spring中的,但是我将它存了一个静态变量副本,然后直接使用了~~