Spring之Method Injection

本文探讨了在Spring框架中,当单例Bean依赖非单例Bean时可能遇到的问题,并介绍了一种优雅的解决方案——Method Injection。通过具体示例展示了如何配置非单例Bean并在需要时获取新的实例。

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

对于Spring的多数用户而言,主要的Bean存在形式都是单例,当一个单例需要结合另一个单例协作或者一个非单例与另一个非单例协作时,典型的做法是通过属性的形式注入,但是当两个Bean的声明周期不同时候这会存在一个问题。例如单例A依赖一个非单例B,而对外提供的服务是通过A暴露的,这样的话每一次调用A的方法时候都不会更新实例B,这将会导致问题(因为A的属性只在初始化时候被设置一次,之后不再被设置)。对于这个问题有如下解决方案:

1:不再使用以来注入,而是实现BeanFactoryAware接口之后每一次通过getBean的方法获取一个新的实例B,但是这通常不是一个理想的解决方案,因为bean代码耦合到Spring中。

2:Method Injection是BeanFactory的一个高级特性,以一种优雅的方式解决此问题。

public abstract class UserService {

    public abstract WalletService createWalletService() ;
    public UserService() {
        System.out.println("UserService 正在实例化!");
    }

    public void login(String userName, String passWord) {
        createWalletService().run();
        System.out.println(userName + "正在登陆!");
    }
}

  

public  class WalletService {
    public WalletService(){
        System.out.println("CarService");
    }
    public void run() {
        System.out.println("this = " + this);
    }
}

 

walletService是一个非单例bean,每一次用户调用时候都必须获取一个新的walletService进行请求,这种需求配置如下:

    <bean id="walletService" class="com.daxin.service.WalletService" singleton="false"/>
    <bean id="userService" class="com.daxin.service.UserService">
        <lookup-method name="createWalletService" bean="walletService"></lookup-method>
     </bean>  

 

测试代码:

    public static void main(String[] args) throws CloneNotSupportedException {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
        for (int i = 0; i < 5; i++) {
            UserService userService = (UserService) ctx.getBean("userService");
            userService.login("daxin", "root");
        }
        ctx.close();
    }

  

测试输出:

daxin正在登陆!
CarService
this = com.daxin.service.WalletService@40e6dfe1
daxin正在登陆!
CarService
this = com.daxin.service.WalletService@1b083826
daxin正在登陆!
CarService
this = com.daxin.service.WalletService@105fece7
daxin正在登陆!
CarService
this = com.daxin.service.WalletService@3ec300f1
daxin正在登陆!

  

转载于:https://www.cnblogs.com/leodaxin/p/9383863.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值