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实例化的三种方式