Spring动态修改bean属性的value

1、定义成员变量

package com.example.demo.controller;

import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.Map;

/**
 * @Description: TODO
 * @Author: Top
 * @Version: V1.0
 * @Date: 2020-01-15 15:03
 */
@RestController
@RequestMapping("/api/{edition}/page2")
public class MyPageHelperController2 {

    @Autowired
    private Environment env;

    @Autowired
    private UserService userServiceImpl;

    private String str1;

    private static String str2;

    @GetMapping("/myPage3")
    @ResponseBody
    public Map<Object, Object> expenseStatement(Object str) throws IOException {

        str1 = "zhangjiguo";
        System.out.println(str1);

        str2 = "guoguo";
        System.out.println(str2);
        return null;
    }

    @GetMapping("/myPage4")
    @ResponseBody
    public Map<Object, Object> expenseStatement2(Object str) throws IOException {

        System.out.println(str1);
        System.out.println(str2);

        return null;
    }

    @GetMapping("/myPage5")
    @ResponseBody
    public Map<Object, Object> expenseStatement3(Object str) throws IOException {

        str1 = "zhangsan";
        str2 = "jiji";
        System.out.println(str1);
        System.out.println(str2);

        return null;
    }
}

2、定义工具类,从容器中获取某个bean

package com.example.demo.common;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringContextUtils implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    /**
     * 通过name获取 Bean.
     *
     * @param name
     * @return
     */
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    /**
     * 通过class获取Bean.
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    /**
     * 通过name及Clazz返回指定的Bean
     *
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }

    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtils.applicationContext = applicationContext;
    }

    /**
     * 获取applicationContext
     *
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
}

3、修改成员变量

@RequestMapping("ok")
    public Object test2(){
        ApplicationContext applicationContext = SpringContextUtils.getApplicationContext();
        String[] beans = applicationContext.getBeanDefinitionNames();
        for (String beanName : beans) {
            // 拿到bean的Class对象
            Class<?> beanType = applicationContext.getType(beanName);
            if (beanType == null) {
                continue;
            }
            // 拿到当前bean类型的所有字段
            Field[] declaredFields = beanType.getDeclaredFields();
            if(!beanName.contains("myPageHelperController2") ){
                continue;
            }
            for (Field field : declaredFields) {
                // 从spring容器中拿到这个具体的bean对象
                Object bean = applicationContext.getBean(beanName);
                // 当前字段设置新的值
                try {
                    setFieldData(field, bean, "ffffff");
                    System.out.println("finished");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return "ok";
    }

    private void setFieldData(Field field, Object bean, String data) throws Exception {
        // 注意这里要设置权限为true
        field.setAccessible(true);
        Class<?> type = field.getType();
        if (type.equals(String.class)) {
            field.set(bean, data);
        } else if (type.equals(Integer.class)) {
            field.set(bean, Integer.valueOf(data));
        } else if (type.equals(Long.class)) {
            field.set(bean, Long.valueOf(data));
        } else if (type.equals(Double.class)) {
            field.set(bean, Double.valueOf(data));
        } else if (type.equals(Short.class)) {
            field.set(bean, Short.valueOf(data));
        } else if (type.equals(Byte.class)) {
            field.set(bean, Byte.valueOf(data));
        } else if (type.equals(Boolean.class)) {
            field.set(bean, Boolean.valueOf(data));
        } else if (type.equals(Date.class)) {
            field.set(bean, new Date(Long.valueOf(data)));
        }
    }

示例二:

import java.lang.reflect.Field;
 
public class Main {
    public static void main(String[] args) throws Exception {
        // 创建一个Person类的实例
        Person person = new Person("John", 25);
        
        // 获取Person类的Class对象
        Class<?> clazz = person.getClass();
        
        // 获取name字段并设置新值
        Field nameField = clazz.getDeclaredField("name");
        nameField.setAccessible(true);
        nameField.set(person, "Tom");
        
        // 输出修改后的结果
        System.out.println(person.getName());   // 输出"Tom"
        
        // 获取age字段并设置新值
        Field ageField = clazz.getDeclaredField("age");
        ageField.setAccessible(true);
        ageField.setInt(person, 30);
        
        // 输出修改后的结果
        System.out.println(person.getAge());     // 输出30
    }
}
 
class Person {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring是一个流行的Java应用程序框架,其中的DI(依赖注入)是一个重要的概念。 在Spring中,DI是一种设计模式,用于将对象之间的依赖关系从代码中移除,从而实现松耦合并提高可重用性和可测试性。在DI中,对象不会自行实例化其依赖项,而是将这些依赖项传递给它们。 Spring框架中的DI实现主要有两种方式:构造函数注入和属性注入。 在构造函数注入中,依赖项通过对象的构造函数传递。这种方式可以确保依赖项在对象被实例化时就已经存在。 在属性注入中,依赖项通过Setter方法或直接设置公共字段注入到对象中。这种方式更加灵活,因为它允许对象在运行时更改其依赖项。 Spring框架还提供了一些依赖项注入的方式,如接口注入和注解注入,这些方式可以让开发人员更加方便地管理依赖项。 总之,Spring中的DI是一种强大的编程模式,可以让开发人员更加灵活地管理对象之间的依赖关系,从而提高代码的可重用性和可测试性。 ### 回答2: Spring中的DI(依赖注入)是通过IOC(控制反转)实现的。在Spring中,使用IOC容器来管理对象的创建和依赖关系的注入。 首先,我们需要在Spring的配置文件中定义要管理的对象。可以使用XML配置文件或Java注解来完成配置。在配置文件中,我们可以指定对象的类名、属性、构造函数等信息。 然后,在程序运行时,Spring的IOC容器会根据配置信息创建对象,并将对象的依赖注入到对象中。依赖注入可以通过构造函数、setter方法或字段注入来完成。 Spring的IOC容器会自动解析对象之间的依赖关系,并保证依赖关系正确地注入到对象中。这样,我们就可以通过IOC容器来管理对象的创建和依赖关系,而不需要手动去创建对象或者处理对象之间的依赖关系。 通过使用IOC容器,我们可以实现松耦合的对象之间的交互。对象之间的依赖关系不再硬编码在代码中,而是由IOC容器来管理。这样,我们可以很方便地修改对象之间的依赖关系,而不需要修改源代码。 总结来说,Spring中的DI通过IOC容器实现,将对象的依赖关系注入到对象中,实现了对象之间的松耦合。这种设计模式可以提高代码的可扩展性和可维护性,使系统更加灵活和易于测试。 ### 回答3: Spring中的依赖注入(Dependency Injection,DI)是指通过容器自动将一个对象所依赖的其他对象注入到该对象中的过程。 在Spring中,DI的实现主要依赖于以下两个核心机制: 1. Bean的定义:通过使用XML配置文件或者注解的方式,我们可以将一个对象(即Bean)标识为一个可被Spring管理的对象。在配置文件中,我们需要指定这个对象所依赖的其他对象或者值。这样Spring就知道了哪些对象需要被注入到该Bean中。 2. 容器的实例化和管理:Spring容器负责创建和管理所有的Bean。它会读取配置文件中的Bean定义,并根据定义的信息来创建相应的Bean实例。当容器创建一个Bean时,它会检查该Bean所依赖的其他Bean,并将它们注入到该Bean中。这样就完成了对象之间的依赖关系的建立。 值得注意的是,Spring的依赖注入有多种方式的实现: 1. 构造函数注入:通过构造函数来注入依赖的对象。在Bean的定义中,我们可以指定构造函数的参数,Spring会根据参数的类型和名称来寻找对应的依赖对象进行注入。 2. Setter方法注入:通过Setter方法来注入依赖的对象。在Bean的定义中,我们可以将依赖的对象定义为Bean的属性,并提供相应的Setter方法。Spring会调用这些Setter方法,将依赖的对象注入到Bean中。 3. 接口注入:通过实现特定的接口来注入依赖的对象。在Bean的定义中,我们可以实现一些特定的接口,如ApplicationContextAware、BeanFactoryAware等。Spring容器会检测到这些接口的存在,并通过调用对应的方法将依赖的对象传递到Bean中。 总的来说,Spring的依赖注入是一种通过容器自动管理对象之间的依赖关系的方式。它使得我们能够更加灵活地组织和管理对象,并实现对象之间的解耦。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值