如果bean类没有任何getter / setter方法,则使用和注入的Spring bean?

时间:2019-06-11 20:07:00

标签: spring

Here指出,即使bean类没有任何getter / setter方法,也可以实例化,配置和注入Spring bean。

是真的吗?

您能举个例子(或此类例子的链接)吗?

  

之所以将Spring托管对象称为Bean是因为   在早期版本中,Spring仅用于   JavaBeans。当然不再是这种情况: Spring可以管理   几乎任何对象,即使它没有JavaBean类型   特性,例如默认构造函数或 mutator方法   (获取器和设置器)。尽管如此,“春豆”一词具有   卡住了。

我得到以下例外情况:

org.springframework.beans.factory.BeanCreationExceptionorg.springframework.beans.NotWritablePropertyException: Invalid property 'name' of bean class [com.my.pkg1.Student]: Bean property 'name' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?引起

@WebListener
public class MyListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {   
        String metadata = "mybean.xml";
        ApplicationContext context = new ClassPathXmlApplicationContext(metadata );

        Student student = context.getBean("student", Student.class);
        System.out.println(student.age);
        System.out.println(student.name);       
    }   
}

public class Student {

    String name;

    int age;

//  public String getName() {
//      return name;
//  }
//
//  public void setName(String name) {
//      this.name = name;
//  }
//
//  public int getAge() {
//      return age;
//  }
//
//  public void setAge(int age) {
//      this.age = age;
//  }
}

和mybean.xml bean定义学生类的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.xsd">

    <bean id="student" class="com.my.pkg1.Student">
        <property name="name" value="John"></property>
        <property name="age" value="23"></property>
    </bean>

</beans>

我觉得<property name="name" value="John">如果没有getter和setter的话是无效的...

1 个答案:

答案 0 :(得分:0)

由于您的bean定义设置了nameage属性,因此需要使用setter来分配这些值。

您还可以使用构造函数(<constructor-arg>)或构建函数(factory-method)自定义bean。

以下是这些不同构造方法的简介:https://www.baeldung.com/spring-xml-injection