Spring IOC容器bean实例化

本文介绍了Spring框架中IOC容器的三种Bean实例化方法:构造器实例化、静态工厂实例化及实例工厂实例化,并提供了详细的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传统程序中采用new方法和反射机制来实例化对象,在IOC容器中采用.xml中bean的配置数据配合反射机制来实例化bean。Spring IOC实例化Bean的方法有三种:

  1. 使用构造器实例化bean
  2. 使用静态工厂实例化bean
  3. 使用实例工厂实例化bean

下面是三种方法的代码实现:(我的bean类包名为com.yangwan.beans,配置文件为application-config.xml)


  • 使用构造器实例化bean

public class Car {
	String brand;
	double price;
	public Car(String brand,double price){
		this.brand = brand;
		this.price = price;
	}
	public void printCarInformation(){
		System.out.println("brand: "+this.brand+"  price: "+price);
	}
}
注解:Car有一个带参数的构造函数,在xml文件中对bean进行配置,利用constructor-arg来配置对象的参数。如果使用无参数构造器实例化bean,在类的代码中必须实习类的无参数构造函数,通常情况下,不写构造函数,JVM会自动为对象实现构造函数,如果参数无参数构造器实例化bean,类中重载了构造函数的情况下,必须手动实现无参数构造函数。


.xml配置文件代码,带参数构造器

<bean id="car" class="com.yangwan.beans.Car">
     <constructor-arg type="double" value="333233"></constructor-arg>
    	<constructor-arg type="String" value="大众"></constructor-arg>
    </bean>
注解:这里配置带参数的构造器有多种写法,也可以使用index,和name属性。如下:

 <bean id="car" class="com.yangwan.beans.Car">
    	<constructor-arg index="0" value="大众"></constructor-arg>
    	<constructor-arg index="1" value="88888"></constructor-arg>
    </bean>

使用属性设置也可以实例化bean

public class Bicycle {
	String brand;
	double price;
	public Bicycle(){
		
	}
	public Bicycle(String brand,double price){
		this.brand = brand;
		this.price = price;
	}
	public String getBrand() {
		return brand;
	}
	public void setBrand(String brand) {
		this.brand = brand;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public void printBicycleInformation(){
		System.out.println("brand: "+this.brand+"  price: "+price);
	}
}
注解:实现属性的getter & setter方法,通过配置文件中的property属性可以实例化bean。该类重载构造函数是为了实现第三章实例化bean方法的带参数实例化。
<bean id="bicycle" class="com.yangwan.beans.Bicycle">
    	<property name="brand" value="Ferfly"></property>
    	<property name="price" value="389.4"></property>
    </bean>


  • 使用静态工厂实例化bean

package com.yangwan.beans;
//静态工厂方法返回实例
public class CarFactory {
	public static Car getInstance(String brand,double price){
		return new Car(brand,price);
	}
}
注解:CarFactory中只有一个静态方法,用来返回一个Car实例。


.xml配置文件代码

bean id="carstaticfactory" class="com.yangwan.beans.CarFactory" factory-method="getInstance">
		<constructor-arg index="0" value="奥迪"></constructor-arg>    
		<constructor-arg index="1" value="78872"></constructor-arg>
    </bean>
注解:静态工厂实例化bean要设置bean对象的factory-method实例bean对象的方法名。

  • 使用实例工厂实例化bean

package com.yangwan.beans;

public class BicycleInstanceFactory {
	public Bicycle getInstance(String brand,double price){
		return new Bicycle(brand,price);
	}
}

.xml配置文件代码

 <!-- 定义实例工厂 -->
    <bean id="bicycleinstancefactory" class="com.yangwan.beans.BicycleInstanceFactory"></bean>
    <!-- 利用实例工厂创建bean -->
    <bean id="bicycleinstance" factory-bean="bicycleinstancefactory" factory-method="getInstance">
    	<constructor-arg index="0" value="HariErfi"></constructor-arg>    
		<constructor-arg index="1" value="899"></constructor-arg>
    </bean>

  • 三种方法的测试函数

package com.yangwan.test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;

import com.yangwan.beans.Bicycle;
import com.yangwan.beans.Car;
public class Main {
	public static void main(String[] args) {
		Resource resource = new FileSystemResource("src/main/resources/spring/application-config.xml");
		BeanFactory beanFactory = new XmlBeanFactory(resource);
		Car tempCar = beanFactory.getBean("car",Car.class);
		tempCar.printCarInformation();
		Bicycle bicycle = beanFactory.getBean("bicycle",Bicycle.class);
		bicycle.printBicycleInformation();
		Car carTemp = beanFactory.getBean("carstaticfactory",Car.class);
		carTemp.printCarInformation();
		
		Bicycle bicycleTemp = beanFactory.getBean("bicycleinstance",Bicycle.class);
		bicycleTemp.printBicycleInformation();
	}

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值