Spring装配构造方法

来源:互联网 发布:知乎 礼节 编辑:程序博客网 时间:2024/05/15 15:42

并不是每一个JavaBean都只有一个无参数的构造方法,如果一个JavaBean的构造方法的参数有一个或多个,就需要使用<constructor-reg>标签来为这些构造方法设置相应的参数值。

ConstructorBean.java

package chapter22;public class ConstructorBean {    private String name;    private String message;    private int number;        public ConstructorBean(String name) {        super();        this.name = name;        System.out.println("ConstructorBean(String name) 构造函数被调用");    }    public ConstructorBean(String name, int number) {        super();        this.name = name;        this.number = number;        System.out.println("ConstructorBean(String name,int number) 构造函数被调用");    }    public ConstructorBean(String name, String message) {        super();        this.name = name;        this.message = message;        System.out.println("ConstructorBean(String name,String message) 构造函数被调用");    }        public String getName() {        return name;    }    public String getMessage() {        return message;    }    public int getNumber() {        return number;    }}

TestConstructorBean.java

package chapter22;import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;public class TestConstructorBean {    public static void main(String args[])    {        ApplicationContext ctx=new FileSystemXmlApplicationContext("src//ConstructorBean.xml");        //ApplicationContext ctx=new FileSystemXmlApplicationContext("src//a.xml");        ConstructorBean cb=(ConstructorBean)ctx.getBean("constructor1");        System.out.println(cb.getName());        System.out.println("--------------------------------");                cb=(ConstructorBean)ctx.getBean("constructor2");        System.out.println("name:"+cb.getName());        System.out.println("message:"+cb.getMessage());        System.out.println("number:"+cb.getNumber());        System.out.println("--------------------------------");        //指定        cb=(ConstructorBean)ctx.getBean("constructor3");        System.out.println("name:"+cb.getName());        System.out.println("message:"+cb.getMessage());        System.out.println("number:"+cb.getNumber());        System.out.println("--------------------------------");        //指定第二个参数类型为int型。这样会匹配第2个构造函数。        cb=(ConstructorBean)ctx.getBean("constructor4");        System.out.println("name:"+cb.getName());        System.out.println("message:"+cb.getMessage());        System.out.println("number:"+cb.getNumber());        System.out.println("--------------------------------");        //通过使用<consturctor-arg>标签的index属性来改变传递参数的顺序        cb=(ConstructorBean)ctx.getBean("constructor5");        System.out.println("name:"+cb.getName());        System.out.println("message:"+cb.getMessage());        System.out.println("number:"+cb.getNumber());    }    }

constructor.xml

<?xml version="1.0" encoding="UTF-8"?><beans    xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:p="http://www.springframework.org/schema/p"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><!--要使用第1个构造方法创建ConstructorBean对象非常简单,Spring会自动寻找ConstructorBean类中只有一个参数的构造方法。-->    <bean id="constructor1" class="chapter22.ConstructorBean">        <constructor-arg>            <value>Michael</value></constructor-arg></bean>
<!--这里第二个参数是20,一般认为Spring会自动匹配第二种方法。但是实现上确实调用了第3中方法。因为在Spring中搜索Bean的构造方法时,会先将参数值当成String类型数据来看。-->    <bean id="constructor2" class="chapter22.ConstructorBean">        <constructor-arg>            <value>bill</value></constructor-arg>        <constructor-arg>            <value>20</value></constructor-arg></bean>
<!--这里的第二个参数使用了类型限定,即指定第二个参数所对应的类型是int,因此Spring会匹配第2中方法。-->    <bean id="constructor3" class="chapter22.ConstructorBean">        <constructor-arg>            <value>bill</value></constructor-arg>        <constructor-arg type="int">            <value>20</value>        </constructor-arg></bean>
<!--默认情况下Spring匹配构造函数是按参数的顺序匹配的。-->    <bean id="constructor4" class="chapter22.ConstructorBean">        <constructor-arg>            <value>bike</value></constructor-arg>        <constructor-arg>            <value>John</value>        </constructor-arg></bean>
<!--但是可以通过index属性来表示构造方法参数的位置,从0开始。-->    <bean id="constructor5" class="chapter22.ConstructorBean">        <constructor-arg index="1">            <value>bike</value>        </constructor-arg>        <constructor-arg index="0">            <value>John</value>        </constructor-arg></bean></beans>

Spring装配多个配置文件的方法

TestTwoConfigueFile.java

package chapter22;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;public class TestTwoConfigueFile {    public static void main(String args[])    {        //使用FileSystemXmlApplicationContext        //ApplicationContext ctx=new FileSystemXmlApplicationContext(new String[]{"src//applicationContext.xml","src//ConstructorBean.xml"});        //使用ClassPathXmlApplicationContext        ApplicationContext ctx=new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml","ConstructorBean.xml"});        System.out.println("--------------------------------");        MyBean mb=(MyBean)ctx.getBean("myBean");        //System.out.println(mb.getHello());        System.out.println(mb.getHello().getGreeting());        System.out.println(mb.getStrName());        System.out.println("--------------------------------");        ConstructorBean cb=(ConstructorBean)ctx.getBean("constructor1");        System.out.println(cb.getName());    }}
原创粉丝点击