zoukankan      html  css  js  c++  java
  • 【初识Spring】对象(Bean)实例化及属性注入(xml方式)


    title: 【初识Spring】对象(Bean)实例化及属性注入(xml方式)
    date: 2018-08-29 17:35:15
    tags: [Java,Web,Spring]

    #初识Spring之Bean实例化及属性注入

    1.通过xml配置的方式进行实例化。

    • 配置文件中bean标签的常用属性
    • 通过无参构造(常用)
    • 使用静态工厂进行创建
    • 使用实例工厂进行创建

    2.属性注入。

    • 使用有参数构造方法注入属性
    • 使用set方法注入属性(常用)
    • 注入对象类型属性
    • 注入复杂类型属性

    xml配置的方式进行实例化

    • 配置文件中bean标签的属性

    (1)id属性:起名称,id属性值名称任意命名

    • id属性值,不能包含特殊符号
    • 根据id值得到配置对象

    (2)class属性:创建对象所在类的全路径

    (3)name属性:功能和id属性一样的,id属性值不能包含特殊符号,但是在name属性值里面可以包含特殊符号

    (4)scope属性

    • singleton:默认值,单例

    • prototype:多例

    • 无参构造实例化对象

    //phone类:
    package com.test.vo;
    public class Phone {
    	public void printTest() {
    		System.out.print("Phone.......");
    	}
    }
    
    <!--applicationContext.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"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="phone" class="com.test.vo.Phone"></bean>
    	</beans>
    
    
    //测试类
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Test {
    	public static void main(String[] args) {
    		//加载配置文件,创建对象
    		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    		//得到配置创建的对象
    		Phone Phone = (Phone) context.getBean("phone");
    		//调用对象方法
    		Phone.printTest();
    	}
    }
    
    

    注:java类中默认有无参构造方法,若类中已声明了有参构造,则需手动声明无参构造方法。

    • 使用静态工厂进行创建
    //静态工厂类
    package com.test.utils;
    import com.test.vo.Phone;
    
    public class BeanFactory {
    	//静态方法,返回Phone对象
    	public static Phone getPhone() {
    		return new Phone();
    	}
    
    }
    
    
    //创建的对象为Phone类对象不变
    //配置文件改为:
    <!--applicationContext.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"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
            <!--class为静态工厂的路径,factory-method为工厂的方法-->
       <bean id="phoneFa" class="com.test.utils.BeanFactory" factory-method="getPhone"></bean>
    	</beans>
    
    //测试类
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Test {
    	
    	public static void main(String[] args) {
    		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    		Phone Phone = (Phone) context.getBean("phoneFa");
    		Phone.printTest();
    	}
    }
    
    • 使用实例工厂进行创建
    //实列工厂类:
    import com.test.vo.Phone;
    
    public class BeanUFactory {
    	//普通方法,返回Phone对象
    	public Phone getPhone() {
    		return new Phone();
    	}
    }
    
    
    	配置文件修改:
    	<!-- 1.先创建工厂对象 -->
    	<!-- 2.再创建Phone对象 -->
    	<bean id="BeanUFactory" class="com.test.utils.BeanUFactory"></bean>
    	<bean id="phoneUFa" factory-bean="BeanUFactory" factory-method="getPhone"></bean>
    
    //测试类:
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Test {
    	
    	public static void main(String[] args) {
    		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    		Phone Phone = (Phone) context.getBean("phoneUFa");
    		Phone.printTest();
    	}
    }
    
    

    属性注入

    • 使用有参数构造方法注入属性:

    Phone类改写为:

    public class Phone {
    	private String name;
    	//显示声明无参构造
    	public Phone() {}
    	//有参构造
    	public Phone(String name) {
    		this.name=name;
    	}
    	public void printTest() {
    		System.out.print(name+"Phone.......");
    	}
    }
    
    

    applicationContext.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"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
            <!--class为静态工厂的路径,factory-method为工厂的方法-->
       <bean id="phoneFa" class="com.test.utils.BeanFactory" factory-method="getPhone">
       <!--name为构造方法的参数名,value为要将其设置的值-->
       <constructor-arg name="name" value="诺基亚"></constructor-arg>
       </bean>
    	</beans>
    

    测试类:

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Test {
    	
    	public static void main(String[] args) {
    		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    		Phone Phone = (Phone) context.getBean("phoneFa");
    		Phone.printTest();
    	}
    }
    

    结果:

    诺基亚Phone.......
    
    • 使用set方法注入属性:

    Phone类改写为:

    public class Phone {
    	private String name;
    	//set方法
    	public void setName(String name) {
    		this.name = name;
    	}
    	public void printTest() {
    		System.out.print(name+"Phone.......");
    	}
    }
    
    

    applicationContext.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"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
            <!--class为静态工厂的路径,factory-method为工厂的方法-->
       <bean id="phoneFa" class="com.test.utils.BeanFactory" factory-method="getPhone">
       <!--name为要注入的属性的名称,value为要将其设置的值-->
       <property name="name" value="三星"></property>
       </bean>
    	</beans>
    

    结果:

    三星Phone.......
    
    • 注入对象类型属性

    新建Person类:

    public class Person {
    	private String name;
    	private String sex;
    	private String age;
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getSex() {
    		return sex;
    	}
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    	public String getAge() {
    		return age;
    	}
    	public void setAge(String age) {
    		this.age = age;
    	}	
    }
    

    Phone类修改为:

    package com.test.vo;
    
    public class Phone {
    	private String name;
    	private Person person;
    	
    	//set方法
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public void setPerson(Person person) {
    		this.person = person;
    	}
    	
    	public void printTest() {
    		System.out.print(person.getName()+"::"+person.getAge()+"::"+person.getSex());
    	}
    }
    
    

    配置文件作如下修改:

    <?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="person" class="com.test.vo.Person" scope="prototype">
    		<property name="name" value="小王"></property>
    		<property name="sex" value="man"></property>
    		<property name="age" value="11"></property>
    	</bean>
    	<bean id="phone" class="com.test.vo.Phone">
    		<!-- 因注入的是对象写ref属性 -->
    		<property name="person" ref="person"></property>
    	</bean>
    	</beans>
    
    

    测试方法不变,结果为:

    小王::11::man
    
    • 注入复杂类型属性

    Phone类修改为:

    package com.test.vo;
    
    import java.util.Arrays;
    import java.util.List;
    import java.util.Map;
    
    public class Phone {
    	private String arr[];
    	private List<Integer> list;
    	private Map<String,String> map;	
    	
    	//set方法
    	public void setArr(String[] arr) {
    		this.arr = arr;
    	}
    
    	public void setList(List<Integer> list) {
    		this.list = list;
    	}
    
    	public void setMap(Map<String, String> map) {
    		this.map = map;
    	}
    	public void printTest() {
    		System.out.println("arr:"+Arrays.toString(arr));
    		System.out.println("list:"+list);
    		System.out.println("map:"+map);
    	}
    }
    

    配置文件作如下修改:

    <?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="phone" class="com.test.vo.Phone">
    		<!-- 数组 -->
    		<property name="arr">
    			<list>
    				<value>小米</value>
    				<value>中兴</value>
    				<value>华为</value>
    			</list>
    		</property>
    		<!-- list集合 -->
    		<property name="list">
    			<list>
    				<value>1</value>
    				<value>2</value>
    				<value>3</value>
    			</list>
    		</property>
    		<!-- map集合 -->
    		<property name="map">
    			<map>
    				<entry key="aa" value="lucy"></entry>
    				<entry key="bb" value="bob"></entry>
    				<entry key="cc" value="jerry"></entry>
    			</map>
    		</property>
    	</bean>
    	</beans>
    

    结果如下:

    arr:[小米, 中兴, 华为]
    list:[1, 2, 3]
    map:{aa=lucy, bb=bob, cc=jerry}
    
  • 相关阅读:
    CS academy Binary Flips(dp)
    [POJ 1637] Sightseeing tour(网络流)
    Codeforces 346D Robot Control(01BFS)
    BZOJ 2069: [POI2004]ZAW(Dijkstra + 二进制拆分)
    驱动之SPI,UART,I2C的介绍与应用20170118
    USB驱动之CDC类的介绍与应用20160905
    uCOS-II之移植20160823
    java之面向对象20160818
    Java之基础20160806
    Android之框架20160721
  • 原文地址:https://www.cnblogs.com/flytree/p/11622685.html
Copyright © 2011-2022 走看看