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}
    
  • 相关阅读:
    (二分查找 拓展) leetcode 69. Sqrt(x)
    (二分查找 拓展) leetcode 162. Find Peak Element && lintcode 75. Find Peak Element
    (链表) lintcode 219. Insert Node in Sorted Linked List
    (二分查找 拓展) leetcode 34. Find First and Last Position of Element in Sorted Array && lintcode 61. Search for a Range
    (最短路 Floyd) P2910 [USACO08OPEN]寻宝之路Clear And Present Danger 洛谷
    (字符串 数组 递归 双指针) leetcode 344. Reverse String
    (二叉树 DFS 递归) leetcode 112. Path Sum
    (二叉树 DFS 递归) leetcode 101. Symmetric Tree
    (二叉树 递归) leetcode 144. Binary Tree Preorder Traversal
    (二叉树 递归 DFS) leetcode 100. Same Tree
  • 原文地址:https://www.cnblogs.com/flytree/p/11622685.html
Copyright © 2011-2022 走看看