Spring 将参数传递给构造函数 context.getBean

时间:2021-02-19 09:04:51

标签: java spring

我试图将构造函数参数动态传递给 Springboot 框架中的 bean。我已经按照这个 link 使用 context.getBean(class, arg...) 在 Spring 中动态传递构造函数参数,但它没有成功获取值并显示默认值。我的代码有什么问题?

项目结构:

enter image description here

applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="opBean" class="com.testout.service.Operation">
        <constructor-arg name="param1" value="default1" />
        <constructor-arg name="param2" value="default2" />
    </bean>

</beans>

申请

import com.testout.service.Operation;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


@SpringBootApplication
public class Application implements CommandLineRunner {
    public static void main(String[] args)  {
        SpringApplication.run(Application.class, args);
    }
    @Override
    public void run(String... args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        String param1 = "newValue1";
        String param2 = "newValue2";
        Operation op = (Operation) context.getBean("opBean", param1, param2);
        op.printParams();
    }
}

操作

package com.testout.service;

public class Operation {
    private String param1;
    private String param2;

    public Operation(String param1, String param2){

        this.param1 = param1;
        this.param2 = param2;
        System.out.println("param1: " + param1 + ", param2: " + param2);
    }
    public void printParams(){

        System.out.println(this.param1);
        System.out.println(this.param2);
    }
}

输出:

2021-02-19 16:45:58.201  INFO 43664 --- [           main] com.testout.controller.Application       : No active profile set, falling back to default profiles: default
2021-02-19 16:45:59.097  INFO 43664 --- [           main] com.testout.controller.Application       : Started Application in 1.494 seconds (JVM running for 2.074)
param1: default1, param2: default2
default1
default2

1 个答案:

答案 0 :(得分:2)

如果您想要这种行为,您必须将 bean 的 scope 设置为 prototype

<bean id="opBean" class="com.testout.service.Operation" scope="prototype"/>