当前位置: 首页 > 知识库问答 >
问题:

如何在Spring的运行时向bean添加属性

傅安宁
2023-03-14

我是Spring的新手。我有下面的Person bean,其中包含姓名、地址和年龄作为属性。现在我想在我的自定义BeanFactoryPostProcess中向Person bean添加名为性别的新属性。我的人bean实现了属性访问器。

XML配置文件

<bean id="PersonBean" class="com.mkyong.common.Person">             
   <property name="name" value="mkyong"></property>
   <property name="address" value="address ABC"></property>
   <property name="age" value="29"></property>                           
</bean>                                                                 
<bean class="com.mkyong.common.CustomBeanFactory"></bean>

自定义BeanFactoryPostProcess

public class CustomBeanFactory implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {
    BeanDefinition beanDefinition = arg0.getBeanDefinition("PersonBean");
    beanDefinition.setAttribute("gender", "Male");
    }                                                                       
}

人员类别
在此处输入代码

public class Person implements AttributeAccessor{

private String name;
private String address;
private int age;

public Person(){
    System.out.println("Creating bean Person "+this);
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

@Override
public String[] attributeNames() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Object getAttribute(String arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public boolean hasAttribute(String arg0) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public Object removeAttribute(String arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void setAttribute(String arg0, Object arg1) {
    // TODO Auto-generated method stub
}   
}

客户端程序

public static void main(String [] arg){
    ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"Spring-Autoscan.xml"});

    Person personObj = (Person)context.getBean("PersonBean");
    System.out.println("Value of gender attribute "+personObj.getAttribute("gender"));
}

如果我访问性别我得到null

请让我知道如何动态设置和获取属性。

共有1个答案

公西财
2023-03-14

setAttribute()方法为空。它不存储值。

public void setAttribute(String arg0, Object arg1) {
    // TODO Auto-generated method stub
} 

在里面创建一个映射,你可以在那里存储值并将其取回。这样地

private Map<String, Object> map = new HashMap<>();

public void setAttribute(String arg0, Object arg1) {
    map.put(arg0, arg1);
} 

public Object getAttribute(String arg0) {
    return map.get(arg0);
}
 类似资料:
  • 我知道ApplicationContext扩展点,如ApplicationContext事件和BeanFactoryPostProcessor。 我手头的问题是,在创建了一些bean之后,我需要添加bean,我想这会丢弃BeanFactoryPostProcessor选项,因为在应用程序上下文开始注册bean之前会发生这种情况。 我尝试在上下文刷新后添加一个singletonBean:

  • 问题内容: 因此,标题非常简单。我有一个处理程序类,它实现了spring提供的接口。在这个类中,我将添加多个具有如下bean类设置的bean : 该方法返回的对象。 稍后,我将获取类实现的必需实例。所有这些都很好。当我要删除其中一个实例并在以后没有注册表实例的位置添加新实例时,就会出现问题。谁能帮我找到一种方法吗? 以下是该类的代码- 问题答案: 您可以利用(在此处查找API)动态删除或注册Bea

  • 我通过HiberNate将用户保存在DB表中,我使用Spring Security进行身份验证: 这非常有效,但有一点需要注意:用户在服务器启动时被加载。我需要编写方法RegisterUser(用户用户),在运行时将新用户添加到Spring Security。这种方法应该只关注这项任务。我不知道如何开始实现这个功能,所以谢谢你的建议!;) Ofc用户有登录名、密码、角色字符串等字段。。。 请不要发

  • 我正在寻找一种解决方案,当DB密码更改而不重新启动时,SpringBoot可以重新创建新的数据源。 Spring数据源。url=url-spring。数据源。username=usr-spring。数据源。password=passwordexamplespring。数据源。驱动程序类名=oracle。jdbc。驾驶员OracleDriver 我有这样定义数据源。实现这一点的最好方法是什么。

  • 当Java11排除了JavaFX作为最新版本的一部分时,我得到了以下错误。 那么如何在Java11中将JavaFX添加到Eclipse中呢?谢了。

  • 在XML中,我想要的配置如下所示(但我不想使用XML):