[Spring学习]04 Spring IOC创建Bean的几种方式

一、调用构造器创建Bean对象

通过调用构造器创建Bean对象是我们在实际开发中最常用的方式,而构造器创建Bean对象又有两种方式:

1)通过无参构造方法创建

其本质是 SpringContext 利用无参的构造函数创建一个对象,然后利用setter方法进行赋值,所以要提供无参数构造函数,并定义对应字段的setter方法。如果无参构造函数不存在,Spring上下文创建对象的时候便会报错。
类User.java示例代码:

package priv.ioc.bean;

public class User {
	
	private String name;
	public User() {
        System.out.println("User的无参构造方法");
    }
	public void setName(String name) {
        System.out.println(name);
        this.name = name;
    }
	
}

xml配置bean时使用:

<property  name="属性名"  value="值" ></property>

标签对属性进行赋值。

Bean.xml示例代码:

 <!--无参构造,执行set方法-->
    <bean id="user" class="priv.ioc.bean.User">
        <property name="name" value="张三"/>
    </bean>

好像是执行的有参构造,但其实是执行了无参构造方法,然后通过set方法将name赋值进去的,类似执行了这样的代码:

User user = new User();
user.setName("张三");

2)通过有参构造方法创建

通过有参构造方法创建,有三种方式:

  1. 通过参数下标进行赋值

类User.java示例代码:

package priv.ioc.bean;

public class User {
	
	private String name;
	private int age;
	public User(String name, int age) {
        System.out.println("User的有参构造方法");
        this.name = name;
        this.age = age;
    }
	
}

Bean.xml示例代码:

    <!--有参构造:下标进行赋值-->
    <bean id="user" class="priv.ioc.bean.User">
         <constructor-arg index="0" value="张三"/>
         <constructor-arg index="1" value="28"/>
    </bean>
  1. 通过参数名称进行赋值

类User.java示例代码:

package priv.ioc.bean;

public class User {
	
	private String name;
	private int age;
	public User(String name, int age) {
        System.out.println("User的有参构造方法");
        this.name = name;
        this.age = age;
    }
	
}

Bean.xml示例代码:

    <!--有参构造:名称进行赋值-->
    <bean id="user" class="priv.ioc.bean.User">
         <constructor-arg name="name" value="张三"/>
         <constructor-arg name="age" value="28"/>
    </bean>
  1. 通过参数类型进行赋值

类User.java示例代码:

package priv.ioc.bean;

public class User {
	
	private String name;
	private int age;
	public User(String name, int age) {
        System.out.println("User的有参构造方法");
        this.name = name;
        this.age = age;
    }
	
}

Bean.xml示例代码:

    <!--有参构造:类型进行赋值-->
    <bean id="user" class="priv.ioc.bean.User">
         <constructor-arg type="java.lang.String" value="张三"/>
         <constructor-arg type="java.lang.Integer" value="28"/>
    </bean>

二、调用静态工厂方法创建Bean对象

类User.java示例代码:

package priv.ioc.bean;

public class User {
	
	private String name;
	private int age;
	public User(String name, int age) {
        System.out.println("User的有参构造方法");
        this.name = name;
        this.age = age;
    }
	
}

定义静态工厂方法:

package priv.ioc.factory;

import priv.ioc.bean.User;

public class UserFactory {

	public static User createPerson(String name,Integer age) {
		return new User(name, age);
	}
}

Bean.xml示例代码:

    <!-- 静态工厂方法 -->
	<bean id="user" class="priv.ioc.factory.UserFactory" factory-method="createPerson">
	    <constructor-arg name="name" value="张三" />
	    <constructor-arg name="age" value="28" />
	</bean>

class:priv.ioc.factory.UserFactory,指定静态工厂的实现类( 即包名.类名 )

factory-method:createPerson,该属性指定静态工厂的方法(方法名)

三、调用实例(动态)工厂方法创建Bean对象

类User.java示例代码:

package priv.ioc.bean;

public class User {
	
	private String name;
	private int age;
	public User(String name, int age) {
        System.out.println("User的有参构造方法");
        this.name = name;
        this.age = age;
    }
	
}

定义动态工厂方法:

package priv.ioc.factory;

import priv.ioc.bean.User;

public class UserFactory {

	public User createPerson(String name,Integer age) {
		return new User(name, age);
	}
}

Bean.xml示例代码:

     <!-- 先配置工厂Bean,class指定该工厂的实现类,该Bean负责产生其他Bean实例 --> 
	 <bean id="userFactory" class="priv.ioc.factory.UserFactory"/> 
	 
	 <!-- 再引用工厂Bean来配置其它的Bean -->
	 <bean id="user"  factory-bean="userFactory"  factory-method="createPerson">
	    <constructor-arg name="name" value="张三" />
	    <constructor-arg name="age" value="28" />
	 </bean>

factory-bean :userFactory,该属性指定工厂Bean的id

factory-method:createPerson,该属性指定实例工厂的方法(方法名)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

joinclear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值