IOC装配Bean
(1)Spring框架Bean实例化的方式提供了三种方式实例化Bean
- 构造方法实例化(默认无参数,用的最多)
- 静态工厂实例化
- 实例工厂实例化
下面先写这三种方法的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" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- Bean的三种实例化方式=================== --> <!-- 2.1 使用无参的构造器 --> <bean id="bean1" class="com.study.spring.b_instance.Bean1"></bean> <!-- 2.2使用静态工厂方法 factory-method 是工厂提供的静态方法 --> <bean id="bean2" class="com.study.spring.b_instance.Bean2" factory-method="createInstance"></bean> <!-- 2.3配置实例化工厂的方法 --> <bean id="bean3Factory" class="com.study.spring.b_instance.Bean3Factory"></bean> <bean id="bean3" factory-bean="bean3Factory" factory-method="getInstance"></bean> <!-- end.Bean的三种实例化方式==================== --></div>
Bean1类
public class Bean1 { //必须提供无参的构造函数 系统有默认无参的构造函数 }</div>
Bean2类
public class Bean2 { private static Bean2 Bean2 = new Bean2(); private Bean2() { } public static Bean2 createInstance() { return Bean2; } }</div>
Bean3类
public class Bean3 { }</div>
Bean3Factory类
public class Bean3Factory { private Bean3Factory(){ } public Bean3 getInstance(){ return new Bean3(); } }</div>
测试类InstanceDemo
import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class InstanceDemo { //实例化工厂方法 @Test public void demo3(){ //加载配置文件 创建工厂 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); Bean3 bean3 =(Bean3) applicationContext.getBean("bean3"); System.out.println(bean3); } //静态工厂方法 @Test public void demo2(){ //加载配置文件 创建工厂 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); Bean2 bean2 =(Bean2) applicationContext.getBean("bean2"); System.out.println(bean2); } //构造方法得到bean对象 @Test public void demo1(){ //加载配置文件 创建工厂 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); Bean1 bean1 =(Bean1) applicationContext.getBean("bean1"); System.out.println(bean1); } } /* * 这三个都得到类似于com.study.spring.b_instance.Bean1@7229c204 的内存地址 */</div>
(2).Bean的其他配置:
一般情况下,装配一个Bean时,通过指定一个id属性作为Bean的名称
id 属性在IoC容器中必须是唯一的
id 的命名要满足XML对ID属性命名规范 必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号
如果Bean的名称中含有特殊字符,就需要使用name属性 例如: <bean name="#person" class="cn.itcast.bean.Person"/>
因为name属性可以相同,所以后出现Bean会覆盖之前出现的同名的Bean
id和name的区别:
id遵守XML约束的id的约束.id约束保证这个属性的值是唯一的,而且必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号
name没有这些要求
如果bean标签上没有配置id,那么name可以作为id.
Bean的scope属性
<!-- 3.Bean的scope属性==================== --> <bean id="product" class="com.study.spring.c_scope.Product" scope="singleton"></bean> <!-- end.Bean的scope属性=========== --></div>
* singleton :单例的.(默认的值.)
* prototype :多例的.
* request :web开发中.创建了一个对象,将这个对象存入request范围,request.setAttribute();
* session :web开发中.创建了一个对象,将这个对象存入session范围,session.setAttribute();
* globalSession :一般用于Porlet应用环境.指的是分布式开发.不是porlet环境,globalSession等同于session;
3.Bean属性的依赖注入
前面已经知道如何获得对象,那我们接下来要知道如果给对象对象的属性赋值。
下面通过举例说明:
Car 类
public class Car { private String name; private double price; public Car(String name, double price) { super(); this.name = name; this.price = price; } @Override public String toString() { return "Car [name=" + name + ", price=" + price + "]"; } }</div>
Car2类
public class Car2 { private String name; private double price; public void setName(String name) { this.name = name; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "Car2 [name=" + name + ", price=" + price + "]"; } }</div>
CarInfo类
public class CarInfo { public String getName(){ return "哈弗H6"; } public double caculatePrice(){ return 110000; } }</div>
CollectionBean类
import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; public class CollectionBean { private String name; private Integer age; private List<String> hobbies; private Set<Integer> numbers; private Map<String, String> map; private Properties properties; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public List<String> getHobbies() { return hobbies; } public void setHobbies(List<String> hobbies) { this.hobbies = hobbies; } public Set<Integer> getNumbers() { return numbers; } public void setNumbers(Set<Integer> numbers) { this.numbers = numbers; } public Map<String, String> getMap() { return map; } public void setMap(Map<String, String> map) { this.map = map; } public Properties getProperties() { return properties; } public void setProperties(Properties properties) { this.properties = properties; } @Override public