spring 创建bean的三种方式.

转载 2012年03月28日 13:37:09
创建bean通常有如下方法:
    1.调用构造器创建一个bean实例。
    2.BeanFactory调用某个类的静态工厂方法创建bean.
    3.BeanFactory调用实例工厂方法创建bean.
    
    先来说说---调用构造器创建一个bean实例。
        通过“new”关键字创建bean实例是最常见的情形,如果采用设值注入的方式,则要求该类提供无参数的构造器。
        BeanFactory将调用该构造器来创建bean实例,该实例是个默认的实例。
        接下来,BeanFactory会根据配置文件来决定依赖关系:首先实例化依赖的bean,然后为bean注入依赖关系;最后将一个完整的Bean实例返回给程序。

        for example:
---------------------------------------------------------------------------------    

            package org.viking.spring.itf;

            public interface Person 
            {
                 public void useAxe();
            }

----------------------------------------------------------------------------------

package org.viking.spring.imp;

import org.viking.spring.itf.Axe;
import org.viking.spring.itf.Person;

public class Chinese implements Person {

 private Axe axe;
 
 public Chinese()
 {
  System.out.println("Spring 实例化主调bean: chinese实例....");
 }
 
 public void useAxe()
 {
  System.out.println(axe.chop());
 }

 public void setAxe(Axe axe)
 {
  System.out.println("spring 执行依赖关系注入....");
  this.axe = axe;
 }

 public Axe getAxe() {
  return axe;
 }

}
----------------------------------------------------------------------------------

package org.viking.spring.itf;

public interface Axe
{
 public String chop();
}

----------------------------------------------------------------------------------

package org.viking.spring.imp;

import org.viking.spring.itf.Axe;

public class SteelAxe implements Axe {

 public SteelAxe()
 {
  System.out.println("Spring 实例化依赖bean: SteelAxe实例...");
 }
 
 public String chop()
 {
  return "钢斧砍材真快";
 }

}

----------------------------------------------------------------------------------
applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
 
 <bean id="chinese" class="org.viking.spring.imp.Chinese">
  <property name="axe">
      <ref local="steelAxe"/>
  </property>
 </bean>
</beans>
----------------------------------------------------------------------------------

package org.viking.spring.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.viking.spring.itf.Being;
import org.viking.spring.itf.People;
import org.viking.spring.itf.Person;

import junit.framework.TestCase;

public class BeanTest extends TestCase
{
 public void testNewBean()throws Exception
 {
  ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
  System.out.println("程序已经实例化BeanFactory...");
  Person p = (Person)app.getBean("chinese");
  System.out.println("程序中已经完成了chinese bean 的实例化...");
  p.useAxe();
 }

}
----------------------------------------------------------------------------------
执行结果清楚地反应了执行过程:
    (1)创建BeanFactory实例。
    (2)调用Chinese类的默认构造器创建默认实例。
    (3)根据配置文件注入依赖关系:先实例化依赖bean,然后将依赖bean注入。
    (4)返回一个完整的javabean实例。

    接下来说说---使用静态工厂方法创建bean
        反正这种方法,按书上我是没验证通过,去CSDN上求解,也毫无结果!但是还是写出来吧!
        
        使用静态工厂方法创建bean实例时,class属性也时必须的,但此时class属性并不是该实现类,而是静态工厂类。由于spring需要知道由哪个静态工厂方法来创建bean实例,因此使用factory-method属性来确定静态工厂方法名,在之后的过程中,spring的处理步骤与采用其他方法的创建完全一样。
        注意:这个Bean定义并没有指定返回对象的类型,只指定静态工厂类。该方法必须是静态的,如果静态工厂方法需要参数,则使用<constructor-arg>元素将其导入。
        下面是书上的代码---我没成功!
---------------------------------------------------------------------------------
package   org.viking.spring.itf;

public   interface   Being  
{
public   void   testBeing();
}
-----------------------------------------------------------------------------------
package   org.viking.spring.imp;

import   org.viking.spring.itf.Being;

public   class   Cat   implements   Being   {

private   String   msg;


public   void   testBeing()  
{
System.out.println(msg   +   "猫爱吃鱼! ");
}


public   void   setMsg(String   msg)  
{
this.msg   =   msg;
}

}
-------------------------------------------------------------------------
package   org.viking.spring.imp;

import   org.viking.spring.itf.Being;

public   class   Dog   implements   Being   {

private   String   msg;

public   void   setMsg(String   msg)   {
this.msg   =   msg;
}

public   void   testBeing()
{
System.out.println(msg   +   "狗爱啃骨头! ");
}

}
--------------------------------------------------------------
package   org.viking.spring.factory;

import   org.viking.spring.imp.Cat;
import   org.viking.spring.imp.Dog;
import   org.viking.spring.itf.Being;

public   class   BeingFactory
{
public   static   Being   getBeing(String   arg)
{
if(arg.equalsIgnoreCase( "dog "))
return   new   Dog();
else
return   new   Cat();
}
}
-----------------------------------------------------------
applicationContext.xml:

<?xml   version= "1.0 "   encoding= "UTF-8 "?>
<!DOCTYPE   beans   PUBLIC   "-//SPRING//DTD   BEAN//EN "   "http://www.springframework.org/dtd/spring-beans.dtd ">
<beans>
        <bean   id= "dog "   class= "org.viking.spring.factory.BeingFactory "   factory-method= "getBeing ">
<constructor-arg>
<value> dog </value>
</constructor-arg>
<property   name= "msg ">
<value> 我是狗 </value>
</property>
</bean>

<bean   id= "cat "   class= "org.viking.spring.factory.BeingFactory "   factory-method= "getBeing ">
<constructor-arg>
<value> cat </value>
</constructor-arg>
<property   name= "msg ">
<value> 我是猫 </value>
</property>
</bean>
</beans>
---------------------------------------------------------------------------------------------------------
package   org.viking.spring.test;

import   java.io.FileInputStream;
import   java.io.InputStream;

import   org.springframework.beans.factory.xml.XmlBeanFactory;
import   org.springframework.context.ApplicationContext;
import   org.springframework.context.support.ClassPathXmlApplicationContext;
import   org.springframework.core.io.InputStreamResource;
import   org.viking.spring.itf.Being;
import   org.viking.spring.itf.Person;

import   junit.framework.TestCase;

public   class   BeanTest   extends   TestCase  
{
public   void   testStaticFactoryBean()
{
ApplicationContext   context=   new   ClassPathXmlApplicationContext( "applicationContext.xml ");
System.out.println( "程序已经实例化BeanFactory... ");
Being   b1   =   (Being)context.getBean( "dog ");
b1.testBeing();
Being   b2   =   (Being)context.getBean( "cat ");
b2.testBeing();
}
}
-------------------------------------------------------------------------
吼吼,还请高手指点一下,看看上面的代码要怎么改?
对了,是applicationContext.xml出现小红叉,提示:
No setter found for property 'msg' in class 'org.viking.spring.factory.BeingFactory'

好,来说说最后一种方式---调用实例工厂方法创建bean
        实例工厂方法必须提供工厂实例,因此必须在配置文件中配置工厂实例,而bean元素无需class属性。
        采用实例工厂方法创建bean的配置需要如下两个属性:
           1、factory-bean:该属性的值为工厂bean的id.
           2、factory-method:该方法负责生成bean实例。

           for example:
-----------------------------------------------------------------------------

package org.viking.spring.itf;

public interface People
{
 public void sayHello();
 
 public void sayGoodBye();
}

-----------------------------------------------------------------------------

package org.viking.spring.imp;

import org.viking.spring.itf.People;

public class AmericanPeople implements People {

 private String name;
 
 public void sayGoodBye()
 {
  System.out.println(name + " , Hello!");
 }

 public void sayHello()
 {
  System.out.println(name + ", GoodBye!");
 }

 public void setName(String name) {
  this.name = name;
 }

}

-----------------------------------------------------------------------------

package org.viking.spring.imp;

import org.viking.spring.itf.People;

public class ChinesePeople implements People {
 
 private String name;
 
 public void sayGoodBye()
 {
  System.out.println(name + ",您好!");
 }

 public void sayHello()
 {
  System.out.println(name + ",再见!");
 }

 public void setName(String name) {
  this.name = name;
 }

}


-----------------------------------------------------------------------------

package org.viking.spring.factory;

import org.viking.spring.imp.AmericanPeople;
import org.viking.spring.imp.ChinesePeople;
import org.viking.spring.itf.People;

public class PeopleFactory
{
 public People getPeople(String people)
 {
  if(people.equalsIgnoreCase("china"))
   return new ChinesePeople();
  else
   return new AmericanPeople();
 }
}
-----------------------------------------------------------------------------
applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
   
 <bean id="peopleFactory" class="org.viking.spring.factory.PeopleFactory"></bean>
 
 <bean id="getChinesePeople" factory-bean="peopleFactory" factory-method="getPeople">
  <constructor-arg>
   <value>china</value>
  </constructor-arg>
  <property name="name">
   <value>张三</value>
  </property>
 </bean>
 
 <bean id="getAmericanPeople" factory-bean="peopleFactory" factory-method="getPeople">
  <constructor-arg>
   <value>1</value>
  </constructor-arg>
  <property name="name">
   <value>sum</value>
  </property>
 </bean>
</beans>
-----------------------------------------------------------------------------
调用实例工厂方法创建bean,与调用静态工厂方法创建bean的用法基本相似。区别如下:
    1.调用实例工厂方法创建bean时,必须将实例工厂配置成bean实例。而静态工厂方法则无需配置工厂bean.
    2.调用实例工厂方法创建bean时,必须使用factory-bean属性来确定工厂bean.而静态工厂方法则使用class元素确定静态工厂类。
相同之处:
    1.都需要使用factory-method属性指定生产bean实例的工厂方法。
    2.工厂方法如果需要参数,都使用constructor-arg属性确定参数值。
    3.其他依赖注入属性,都使用property元素确定参数值。

Spring bean的三种创建方式

1、创建Spring工程 使用eclipse创建一个Spring工程,一个简单的方法就是先创建一个Java工程,然后将Spring的Jar包全部放入到工程里面即可开始编写基于Spring框架的程序。...
  • LucienDuan
  • LucienDuan
  • 2016年05月07日 00:12
  • 7062

Spring:创建Bean的几种方式

Spring创建工厂的三种方式
  • VipMao
  • VipMao
  • 2016年06月04日 17:42
  • 5094

Spring IoC容器实例化bean的三种方式

先来看一下工程目录结构 下面是接口及其实现类和实体类 package com.luhy.spring.hello; public interface HelloApi { publ...
  • lu8000
  • lu8000
  • 2013年05月30日 00:20
  • 3487

Spring(IOC) 对象创建三种方式、对象bean起别名

IOC(控制翻转) 概念 把对象的创建、初始化、销毁等工作交给spring容器来做 helloWorld案例步骤:1、写一个HelloWorld类 2、写一个配置文件 ...
  • qq_20261343
  • qq_20261343
  • 2016年02月09日 15:09
  • 2195

Spring-6.创建bean的三种方式

Spring支持使用三种方式创建bean (1)调用构造器创建bean (2)静态工厂方法 (3)实例工厂方法 一、构造器创建 给定class属性,bean提供无参构造器(或构造器注入时有参),以反射...
  • answer100answer
  • answer100answer
  • 2017年06月01日 15:42
  • 153

Spring的三种实例化Bean的方式

  • 2016年10月16日 20:57
  • 3.23MB
  • 下载

Spring中的Bean实现的创建三种方式

Spring中的Bean实现的创建方式 1.调用构造器"new"一个Bean实现  
  • itpinpai
  • itpinpai
  • 2012年11月04日 19:02
  • 4029

02 Spring框架 简单配置和三种bean的创建方式

上一节学习了如何搭建SpringIOC的环境,下一步我们就来讨论一下如何利用ioc来管理对象和维护对象关系。 ...
  • qq_39266910
  • qq_39266910
  • 2017年08月30日 22:40
  • 95

spring创建bean的三种方式

引言 近几年在java web项目中到处都是spring的身影,的确spring的出现给我的编程带来了翻天覆地的变化,尤其 是在AOP出现以后spring的地位更是独占鳌头了,所以对于jav...
  • u013045437
  • u013045437
  • 2016年10月16日 20:50
  • 573

spring学习之---创建Bean的三种方式

1.使用构造器创建Bean实例如果不采用构造注入,spring底层会调用Bean类的无参构造器来创建实例,因此要求该Bean提供无参构造器,在这种情况下,class元素时必需的,class属性的值就是...
  • StrongHYQ
  • StrongHYQ
  • 2017年07月21日 21:15
  • 127
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring 创建bean的三种方式.
举报原因:
原因补充:

(最多只允许输入30个字)