springbean 的 setter/构造注入

文章讨论了Java中除属性注入外的setter和构造注入方式,强调它们可以在非Spring容器中使用。通过配置类和静态方法,可以直接获取bean并调用其实例。此外,文章推荐使用final修饰的构造注入,并介绍了@RequiredArgsConstructor注解的使用,以提高代码安全性和遵循SpringBoot的推荐实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

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

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

 @Autowired
 // @Resource
 private 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() {
    }


    // 构造注入
    @Autowired
    public ResourceConfig(AliPayServiceImpl aliPayService) {
        ResourceConfig.aliPayService = aliPayService;
    }

    private static AliPayServiceImpl aliPayService;



    public static AliPayServiceImpl getAliPayService() {
        return aliPayService;
    }
}

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

代码如下(示例):

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

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


获取bean

三、使用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中的,但是我将它存了一个静态变量副本,然后直接使用了~~

Spring Boot中,可以使用setter方法注入注入依赖项。具体步骤如下: 1. 在需要注入依赖项的类中定义一个私有的依赖项变量,并生成对应的setter方法。 ```java @Service public class MyService { private MyDependency myDependency; public void setMyDependency(MyDependency myDependency) { this.myDependency = myDependency; } } ``` 2. 在配置类中使用@Bean注解创建依赖项的实例,并通过调用setter方法将依赖项注入到需要的类中。 ```java @Configuration public class MyConfig { @Bean public MyDependency myDependency() { return new MyDependency(); } @Bean public MyService myService() { MyService myService = new MyService(); myService.setMyDependency(myDependency()); return myService; } } ``` 3. 如果需要注入多个依赖项,只需要在目标类中定义多个私有变量和对应的setter方法,然后在配置类中使用多个@Bean注解创建依赖项的实例并注入即可。 ```java @Service public class MyService { private MyDependency1 myDependency1; private MyDependency2 myDependency2; public void setMyDependency1(MyDependency1 myDependency1) { this.myDependency1 = myDependency1; } public void setMyDependency2(MyDependency2 myDependency2) { this.myDependency2 = myDependency2; } } @Configuration public class MyConfig { @Bean public MyDependency1 myDependency1() { return new MyDependency1(); } @Bean public MyDependency2 myDependency2() { return new MyDependency2(); } @Bean public MyService myService() { MyService myService = new MyService(); myService.setMyDependency1(myDependency1()); myService.setMyDependency2(myDependency2()); return myService; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寂寞旅行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值