Spring管理Bean的三种方式
一、Spring对Bean管理的三种方式
1.基于XML实例化配置Bean
- 基于构造方法实例化对象
- 基于静态工厂实例化对象
- 基于工厂实例方法实例化对象
2.基于注解实例化配置Bean
基于注解配置IOC容器
3.基于Java代码实例化配置Bean(Java Config)
基于Java Config配置IOC容器
二、基于XML对Bean进行配置
1.默认构造方法实例化对象
<!-- bean标签通过默认构造方法创建对象 -->
<bean id="apple1" class="com.learn.spring.ioc.entity.Apple"></bean>
public static void main(String[] args) {
// 初始化IOC容器并实例化对象
ApplicationContext context = new
ClassPathXmlApplicationContext
("classpath:applicationContext-initIOC.xml");
}
2.有参构造方法实例化对象
<bean id="sweetApple" class="com.learn.spring.ioc.entity.Apple">
<constructor-arg name="title" value="红富士"/>
<constructor-arg name="origin" value="欧洲"/>
<constructor-arg name="color" value="红色"/>
<constructor-arg name="price" value="9.8"/>
</bean>
3.构造方法参数位置实例化对象
<bean id="sweetApple" class="com.learn.spring.ioc.entity.Apple">
<constructor-arg index="0" value="红富士"/>
<constructor-arg index="1" value="欧洲"/>
<constructor-arg index="2" value="红色"/>
<constructor-arg index="3" value="9.8"/>
</bean>
4.基于静态工厂实例化对象
<!-- 利用静态工厂获取对象 -->
<bean id="apple4" class="com.learn.spring.ioc.factory.AppleStaticFactory" factory-method="createSweetApple" />
package com.learn.spring.ioc.factory;
import com.learn.spring.ioc.entity.Apple;
/* 静态工厂通过静态方法创建对象,隐藏创建对象的细节 */
public class AppleStaticFactory {
public static Apple createSweetApple(){
Apple apple = new Apple();
apple.setTitle("红富士");
apple.setOrigin("欧洲");
apple.setColor("红色");
return apple;
}
}
5.基于工厂实例方法实例化对象
工厂实例方法创建对象是指IOC容器对工厂类进行实例化并调用对应的实例方法创建对象的过程
<!-- 利用工厂实例方法获取对象 -->
<bean id="factoryInstance" class="com.learn.spring.ioc.factory.AppleFactoryInstance"/>
<bean id="apple5" factory-bean="factoryInstance" factory-method="createSweetApple"/>
package com.learn.spring.ioc.factory;
import com.learn.spring.ioc.entity.Apple;
/* 工厂实例方法创建对象是指IOC容器对工厂类进行实例化并调用对应的实例方法创建对象的过程 */
public class AppleFactoryInstance {
public Apple createSweetApple(){
Apple apple = new Apple();
apple.setTitle("红富士");
apple.setOrigin("欧洲");
apple.setColor("红色");
return apple;
}
}
三、从IOC容器获取Bean
1. 使用getBean(“beanId”, Bean.class) 【推荐】
Apple sweetApple = context.getBean("sweetApple", Apple.class);
2.使用getBean(“beanId”)
Apple sweetApple = (Apple)context.getBean("sweetApple");
3.id属性与name属性
-
相同点:
bean id 与name都是设置对象在IOC容器中的唯一标识
两者在同一配置文件中都不允许出现重复
两者允许在多个配置文件中出现重复,新对象覆盖旧对象
-
不同点:
id要求更为严格,一次只能定义一个对象(推荐)
name更为宽松,一次允许定义多个对象标识
id与name的命名要求有意义,按驼峰命名书写