
基于XML配置Bean
基于注解配置Bean
基于Java代码配置Bean
基于构造方法对象实例化
基于静态工厂实例化
基于工厂实例方法实例化
applicationContext.xml

如果bean标签里没有写任何配置信息的话,默认基于默认构造方法进行创建。
<bean id="apple1" class="com.ql.spring.ioc.entity.Apple">
</bean>
public Apple() {
System.out.println("Apple对象已创建,"+this);
}
/*
Apple对象已创建,com.ql.spring.ioc.entity.Apple@531be3c5
*/
XML方式创建IoC容器

利用构造方法参数名实例化

虽然在配置文件中以字符的形式编写,但是Spring会自动的进行类型转换
<bean id="apple2" class="com.ql.spring.ioc.entity.Apple">
<constructor-arg name="title" value="红富士"/>
<constructor-arg name="origin" value="欧洲"/>
<constructor-arg name="color" value="红色"/>
<constructor-arg name="price" value="19.9"/>
</bean>
public Apple(String title, String color, String origin, Float price) {
System.out.println("通过带参构造方法创建对象,"+this);
this.title = title;
this.color = color;
this.origin = origin;
this.price = price;
}
如果参数个数或名称写错都会报错。
利用构造方法参数位置实例化(不推荐)

在com.ql.spring.ioc.factory包下创建AppleStaticFactory类
package com.ql.spring.ioc.factory;
import com.ql.spring.ioc.entity.Apple;
/**
* 静态工厂通过静态方法创建对象,隐藏创建对象的细节
*/
public class AppleStaticFactory {
public static Apple createSweetApple(){
Apple apple = new Apple();
apple.setTitle("红富士");
apple.setOrigin("欧洲");
apple.setColor("红色");
return apple;
}
}
然后在applicationContext.xml中添加配置
<!--利用静态工厂获取对象-->
<bean id="apple4" class="com.ql.spring.ioc.factory.AppleStaticFactory"
factory-method="createSweetApple"/>
然后就可以从IoC获取这个对象了
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
Apple apple4 = context.getBean("apple4", Apple.class);
System.out.println("apple4:"+apple4.getTitle());
/**
apple4:红富士
*/
在com.ql.spring.ioc.factory包下创建AppleFactoryInstance类
package com.ql.spring.ioc.factory;
import com.ql.spring.ioc.entity.Apple;
/**
* 工厂实例方法创建对象是指IoC容器对工厂类进行实例化并调用对应的实例方法创建对象的过程
*/
public class AppleFactoryInstance {
public Apple createSweetApple(){
Apple apple = new Apple();
apple.setTitle("红富士");
apple.setOrigin("欧洲");
apple.setColor("红色");
return apple;
}
}
然后在applicationContext.xml中添加配置
<!--利用工厂实例方法获取对象-->
<bean id="factoryInstance" class="com.ql.spring.ioc.factory.AppleFactoryInstance"/>
<bean id="apple5" factory-bean="factoryInstance" factory-method="createSweetApple"/>
然后就可以从IoC获取这个对象了
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
Apple apple5 = context.getBean("apple5", Apple.class);
System.out.println("apple5:"+apple5.getTitle());
/**
apple5:红富士
*/

bean id与name都是设置对象在IoC容器中唯一标识。
两者在同一个配置文件中都不允许出现重复。
两者允许在多个配置文件中出现重复,新对象覆盖旧对象。
id要求更为严格,一次只能定义一个对象标识(推荐)
name更为宽松,一次允许定义多个对象标识。
tips:id与name的命名要求有意义,按驼峰命名书写。
在resources目录下再创建一个配置类applicationContext-1.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 name="apple2,apple7" class="com.ql.spring.ioc.entity.Apple">
<constructor-arg name="title" value="红富士2号"/>
<constructor-arg name="origin" value="欧洲"/>
<constructor-arg name="color" value="红色"/>
<constructor-arg name="price" value="19.9"/>
</bean>
<bean class="com.ql.spring.ioc.entity.Apple">
<constructor-arg name="title" value="红富士3号"/>
<constructor-arg name="origin" value="欧洲"/>
<constructor-arg name="color" value="红色"/>
<constructor-arg name="price" value="19.9"/>
</bean>
</beans>
然后在SpringApplication中获取两个配置文件的容器
String[] configLocations = new String[]{"classpath:applicationContext.xml","classpath:applicationContext-1.xml"};
ApplicationContext context1 = new ClassPathXmlApplicationContext(configLocations);
Apple apple2 = context1.getBean("apple2", Apple.class);
System.out.println(apple2.getTitle());
Apple apple7 = context1.getBean("apple7", Apple.class);
System.out.println(apple7.getTitle());
Apple apple3 = context1.getBean("com.ql.spring.ioc.entity.Apple", Apple.class);
System.out.println(apple3.getTitle());
/*
红富士2号
红富士2号
红富士3号
*/

其中classpath:为类路径,源代码中的resources并不是类路径,真实运行的为target目录的classes才是类路径。


