【初识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}
原文地址:https://www.cnblogs.com/flytree/p/11622685.html