Spring创建对象的几种方式

1.Spring中创建对象的方式

1.1使用无参构造创建对象(默认)

spring中默认使用无参构造函数,

package com.wshy.pojo;

/**
 * @title: Hello
 * @Author: wshy
 */
public class Hello {
    private String str;

    public Hello(){
        System.out.println ("spring无参构造函数!");
    }

    public String getStr () {
        return str;
    }

    public void setStr (String str) {
        this.str = str;
    }

    @Override
    public String toString () {
        return "Hello{" +
                "str='" + str + '\'' +
                '}';
    }
}

main测试方法:

  public static void main (String[] args) {
        // 获取spring的上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext ("bean.xml");

        //我们的对象都在spring中管理了,我们要使用,直接去里面取就好了,取id为hello的Bean
        Hello hello = (Hello) context.getBean ("hello");
        System.out.println (hello.toString ());

    }

运行结果

image-20210808232846066

如果此时把无参构造方法去掉,添加有参构造函数,代码还会运行成功吗?

package com.wshy.pojo;

/**
 * @title: Hello
 * @Author: wshy
 */
public class Hello {
    private String str;

    public Hello(String str){
        System.out.println ("spring有参参构造函数!");
        this.str = str;
    }

    public String getStr () {
        return str;
    }

    public void setStr (String str) {
        this.str = str;
    }

    @Override
    public String toString () {
        return "Hello{" +
                "str='" + str + '\'' +
                '}';
    }
}

image-20210809094805319

image-20210809095712959

显然,当使用有参构造函数时,启动main函数会发生报错,提示Error creating bean with name 'hello' defined in class path创建hello对象失败,并且在xml配置文件中的class会有错误标红,因此可以得出结论:

Spring创建对象同new对象一致,都是默认调用无参构造函数创建对象!

当然也可以只用有参构造函数创建对象,有如下几种方式:

1.2使用有参构造器创建对象

package com.wshy.pojo;

/**
 * @title: User
 * @Author: wshy
 */
public class User {
    private String name;

    private int age;

    private String address;

    //public User () {
    //    System.out.println ("Spring-User无参构造函数!");
    //}

    public User (String name) {
        System.out.println ("Spring-User有参构造函数!");
        this.name = name;
    }

    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;
    }

    public String getAddress () {
        return address;
    }

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

1.2.1 使用下标赋值创建对象
<bean id="user" class="com.wshy.spring.User">
	<constructor-arg index="0" value="wshy"/>
</bean>

constructor-arg标签:根据下标赋值创建对象,此时index=0表示对User实体类表中的第一个字段值赋值,value表示显示值

image-20210809101630756

1.2.2 使用类型创建对象
<bean id="user" class="com.wshy.spring.User">
	<constructor-arg type="java.lang.String" value="wshy"/>
</bean>

constructor-arg标签:根据type类型创建对象,此时index="java.lang.String"表示对User有参构造函数的入参为String类型的字段赋值并创建对象,value表示显示值,但此时,如果有参构造函数中入参为多个时,并且都为String类型,根据类型创建对象就有局限性了!

image-20210809100918956

1.2.3 使用参数创建对象(推荐使用)
<bean id="user" class="com.wshy.pojo.User">
    <constructor-arg name="name" value="根据参数创建对象"/>
</bean>

constructor-arg标签:根据type类型创建对象,name为传入参数,value指定参数传入值

image-20210809101416399

另外,从上面运行结果,也可以看出,Spring创建对象时,会将bean.xml中配置的所有对象都创建出来!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值