Spring Bean的实现方式

Spring Bean的实现方式主要有三种。

(1)使用类的无参构造函数实例化(90%通常使用的一个方法)

1.首先定义一个bean。

package com.spring.demo;

public class Bean {
     //默认构造方法
     Bean(){}
     public void print(){
	 System.out.println("Bean......");
     }
}

如果不指定构造方法的话,类的默认构造方法就是没有方法体的无参构造方法。

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="bean" class="com.spring.demo.Bean"></bean>
 
</beans>

<bean id = "bean" class="com.spring.demo.Bean"></bean>:

id是bean的标识符,每个bean都有一个唯一的标识用来区分不同的bean。 class为xml里的这个bean要实例化的java类,class中要指定类的的全路径(包名+类名)

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

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

package com.spring.demo;
 
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class TextBean {
	@Test
	public void textUser()
	{
	  //1.获取spring文件
	  ApplicationContext context = new   ClassPathXmlApplicationContext("Bean.xml");
	  //2.由配置文件返回对象
	  Bean b = (Bean)context.getBean("bean");
	  System.out.println(b);
	  b.print();
	}
}

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

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

(2)使用静态工厂方法实例化

1.定义一个Bean。

package com.spring.demo;

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

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="bean" class="com.spring.demo.BeanFactory" factory-method="getBean"></bean>
	
 
</beans>

<bean id="bean" class="com.spring.demo.BeanFactory" factory-method="getBean"></bean>

id表示创建的是bean对象的实例,class表示使用到的类为com.spring.demo包下的BeanFactory类(作为工厂类)。

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

3.下面就是创建静态工厂类。

package com.spring.demo;
 
public class BeanFactory {
	public static Bean getBean(){
		return new Bean();
	}
}

4.测试代码。

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

结果: 

 3.使用实例化工厂方法实例化

1.首先还是先定义一个Bean。

package com.spring.demo;

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

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="beanfactory" class="com.spring.demo.BeanFactory"></bean>
	<bean id="bean" factory-bean="beanfactory" factory-method="getBean"></bean>
	
</beans>

<bean id="beanfactory" class="com.spring.demo.BeanFactory"></bean>就是在xml配置文件中定义一个工厂对象,这个工厂对象的id 为beanfactory,工厂对象的实例为com.spring.demo 包下的BeanFactory类。
<bean id="bean"  factory-bean="beanfactory" factory-method="getBean"></bean>是定义一个由工厂对象创建的Bean对象,id 为bean,生产它的工厂类为 beanfactory,调用 beanfactory生产bean的方法为工厂对象的getBean( )方法。

3.下面就创建工厂对象,该工厂类创建Bean的方法是非静态方法。

package com.spring.demo;
 
public class BeanFactory {
	public Bean getBean(){
		return new Bean();
	}
}

4.测试类。 

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

结果:

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

参考:Bean实例化的三种方式

猜你喜欢

转载自blog.csdn.net/kongmin_123/article/details/82025867