spring-02:IOC创建对象方式(无参和有参的创建)

bean是怎样去创建对象的

  • 1、写一个实体类(无参构造输出一句话)
public class User {
    private String name;

    public User() {
        System.out.println("User的无参构造");
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }
}
  • 2、去bean中创建类的对象
    <bean id="user" class="com.liu.pojo.User">
        <property name="name" value="夏洛"/>
    </bean>
  • 3、测试
public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        User user = (User) context.getBean("user");


    }
}

当获取到bean的时候可以看到对象默认走无参构造被创建出来

在这里插入图片描述

  • 4、再写一个实体类
public class User02 {
    private String name;

    public User02() {
        System.out.println("User02的无参构造");
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "User02{" +
                "name='" + name + '\'' +
                '}';
    }
}
    <bean id="user02" class="com.liu.pojo.User02">
        <property name="name" value="haha"/>
    </bean>
  • 5、再测试
public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

    }
}

发现在获取到配置文件的上下文的时候,里面所有的类的对象就已经全部被创建了

在这里插入图片描述

  • 6、把实体类User中的set方法删除

会爆出这样一个错误

Caused by: org.springframework.beans.NotWritablePropertyException: 
Invalid property 'name' of bean class [com.liu.pojo.User]: 
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?

在这里插入图片描述

可以看到对象中的属性是通过set方法赋值的

User实体类中写一个有参构造,那么如何让bean在创建对象的时候去走有参构造呢

修改一下user实体类添加一个属性

public class User {
    private String name;
    private int age;

    public User() {
        System.out.println("User的无参构造");
    }

    public User(String name, int age) {
        System.out.println("User的有参构造");
        this.name = name;
        this.age = 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;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

这样有参构造中有两个参数

第一种方式:下标

bean中有一个属性constructor-arg,设置参数的下标和值,int类型的参数也要带” “,不然会报错

    <bean id="user" class="com.liu.pojo.User">
        <constructor-arg index="0" value="小明"/>
        <constructor-arg index="1" value="1"/>
    </bean>

在这里插入图片描述

如果像这样少写一个参数,那么就会报错,实体类中没有一个参数的有参构造

第二种:通过参数类型

<bean id="user" class="com.liu.pojo.User">
    <constructor-arg type="java.lang.String" value="小明"/>
    <constructor-arg type="int" value="1"/>
</bean>

但是这种方式有一个弊端,假设两个参数类型一样,那就有可能冲突
如果相同类型的参数按照参数列表顺序赋值,好像也没啥问题

第三种:直接通过参数名赋值

这种方法应该是最不容易出错的,也是最好用的

<bean id="user" class="com.liu.pojo.User">
    <constructor-arg name="name" value="小明"/>
    <constructor-arg name="age" value="1"/>
    <constructor-arg name="password" value="1234556"/>
</bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值