• Spring装配构造方法


    并不是每一个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());
        }
    }
    作者:xwdreamer
    欢迎任何形式的转载,但请务必注明出处。
    分享到:
  • 相关阅读:
    hadoop学习--搜索引擎面临的数据和计算难题
    解析excel
    sql批量入库
    tomcat-nginx配置
    友链
    Vue+ElementUI搭建一个后台管理框架
    OnePill本地保存用户的结构
    Android集成JPush(极光推送)
    Android三种风格的底部导航栏
    Android实现EditText插入表情、超链接等格式
  • 原文地址:https://www.cnblogs.com/xwdreamer/p/2297092.html
Copyright © 2020-2023  润新知