Bean实例化的三种方式

bean  实例化的三种方式实现:

第一种:使用类的无参数构造创建(第一种是重点,第二三种已经没太多人用了)

目录树:



1.首先定义一个 bean:

bean1.java:

package com.spring.demo;

public class Bean1 {
	public void print(){
		System.out.println("Bean1......");
	}
}
这个bean只有一个print方法

2.在Spring配置文件Bean.xml 中 配置 bean:

<?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="bean1" class="com.spring.demo.Bean1"></bean>

</beans>

<bean id = “bean1” class="com.spring.demo.Bean1"></bean>:

id 为 在 xml 里的这个 bean的标识。 class 为xml 里的这个bean 绑定的java类(bean)的全路径(包名+类名)

这个标签会自动寻找 Bean1类中的无参数构造函数来创建对象


3.测试代码从配置文件中取出Bean1对象:

package com.spring.demo;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TextIoc {
	@Test
	public void textUser()
	{
		//1.获取spring文件
		 ApplicationContext context = new ClassPathXmlApplicationContext("Bean.xml");
		 //2.由配置文件返回对象
		 Bean1 b = (Bean1)context.getBean("bean1");
		 System.out.println(b);
		 b.print();
	}
}

getBean() 返回的就是由spring 实例化的对象。

结果是:打印返回的对象b,和调用 b 的print()方法



第二种:使用静态工厂创建

1.定义一个bean:

bean2.java:(就是要创建这个类的对象)

package com.spring.demo;

public class Bean2 {
	public void print(){
		System.out.println("Bean2......");
	}
}
2.配置spring的配置文件
<?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="bean2" class="com.spring.demo.Bean2Factory" factory-method="getBean2"></bean>
	

</beans>
<bean id="bean2" class="com.spring.demo.Bean2Factory" factory-method="getBean2"></bean>:

表示创建的对象(bean)用bean2指代,使用到的class(类)为com.spring.demo 包 下的Bean2Factory类(作为工厂类)

factory-method = "getBean2"表示调用 class 下的 getBean2方法来创建对象(而且factory-method指定的方法必须为static静态方法)


3.定义静态工厂类

package com.spring.demo;

public class Bean2Factory {
	public static Bean2 getBean2(){
		return new Bean2();
	}
}

注意静态工厂类的创建对象方法为静态

4.测试代码:

public class TextIoc {
	@Test
	public void textUser()
	{
		//1.获取spring文件
		 ApplicationContext context = new ClassPathXmlApplicationContext("Bean.xml");
		 //2.由配置文件返回对象
		 Bean3 b = (Bean2)context.getBean("bean2");
		 System.out.println(b);
		 b.print();
	}
}



第三种:使用实例工厂创建

1.定义一个bean:

package com.spring.demo;

public class Bean3 {
	public void print(){
		System.out.println("Bean3......");
	}
}

2.配置spring的配置文件:

<?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="bean3factory" class="com.spring.demo.Bean3Factory"></bean>
	<bean id="bean3" factory-bean="bean3factory" factory-method="getBean3"></bean>
	

</beans>
第八行:<bean id="bean3factory" class="com.spring.demo.Bean3Factory"></bean>  :为在xml配置文件中定义一个bean,这个bean的id 为bean3factory ,创建所用到的类(class)为com.spring.demo 包下的 Bean3Factory类

第九行:<bean id="bean3"  factory-bean="bean3factory" factory-method="getBean3"></bean> :

在定义一个bean,id 为bean3,生产它的工厂类为 bean3factory,调用 bean3factory生产 bean3的方法为 (bean3factory的)getBean3()方法


3.(非静态)工厂类

package com.spring.demo;

public class Bean3Factory {
	public Bean3 getBean3(){
		return new Bean3();
	}
}

4.测试代码:

public class TextIoc {
	@Test
	public void textUser()
	{
		//1.获取spring文件
		 ApplicationContext context = new ClassPathXmlApplicationContext("Bean.xml");
		 //2.由配置文件返回对象
		 Bean3 b = (Bean3)context.getBean("bean3");
		 System.out.println(b);
		 b.print();
	}
}
运行:

打印出对象,和调用bean3的print方法


静态工厂类与非静态工厂类的区别是,前者不需要创建对象,直接可以调用静态方法创建bean;后者则要先创建对象,然后再通过对象调用其方法创建bean

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值