从Spring3.0开始,spring容器提供了两种配置Bean的方式
(1)基于XML
(2)基于注解
使用一个或者多个xml作为配置文件,Spring配置文件的根元素是。
bean的实例化方式有3种:默认构造、静态工厂、实例工厂
(1)默认构造
id="" class="">
(2)静态工厂
常用与spring整合其他框架(工具)
静态工厂:用于生成实例对象,所有的方法必须是static
"" class="工厂全限定类名(包名+类名)" factory-method="静态方法">
例子:
1.工厂 MyBeanFactory.java
public class MyBeanFactory {
/**
* 创建实例
* @return
*/
public static UserService createService(){
return new UserServiceImpl();
}
}
2.Spring配置 bean.xml
<bean id="userServiceId" class="com.spring.MyBeanFactory" factory-method="createService">bean>
3.Test
public void demo02(){
//spring 工厂
String xmlPath = "com/factory/beans.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
//userService.class 强转
UserService userService = applicationContext.getBean("userServiceId"
,UserService.class);
userService.addUser();
}
(3)实例工厂
实例工厂:必须先有工厂实例对象,通过实例对象创建对象。提供所有的方法都是“非静态”的。
例子:
1.MyBeanFactory.java
/**
* 实例工厂,所有方法非静态
*/
public class MyBeanFactory {
/**
* 创建实例
* @return
*/
public UserService createService(){
return new UserServiceImpl();
}
}
2.Spring配置 bean.xml
因为不是静态方法,所以要new一个MyBeanFactory的实例来调用createService方法
<bean id="myBeanFactoryId" class="com.spring.MyBeanFactory">bean>
<bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService">bean>
3.Test
public void demo02(){
//spring 工厂
String xmlPath = "comfactory/beans.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
UserService userService = applicationContext.getBean("userServiceId"
,UserService.class);
userService.addUser();
}
1)普通bean:之前操作的都是普通bean。,spring直接创建A实例,并返回
2) FactoryBean:是一个特殊的bean,具有工厂生成对象能力,只能生成特定的对象。
bean必须使用 FactoryBean接口,此接口提供方法getObject()用于获得特定bean。
先创建FB实例,使用调用getObject()方法,并返回方法的返回值
FB fb = new FB();
return fb.getObject();
BeanFactory和FactoryBean对比?
BeanFactory:工厂,用于生成任意bean。
FactoryBean:特殊bean,用于生成另一个特定的bean。
例如:ProxyFactoryBean,此工厂bean用于生产代理。
< bean id=”” class=”….ProxyFactoryBean” >获得代理对象实例。AOP使用
作用域:用于确定spring创建bean实例个数
Spring提供“singleton”和“prototype”两种基本作用域,另外提供“request”、“session”、“global session”三种web作用域;
取值:
singleton 单例,Bean只会在每个Spring IoC容器中存在一个实例,默认值。
prototype 多例,每执行一次getBean将获得一个实例。
配置信息
<bean id="userServiceId" class="com.UserServiceImpl" scope="prototype" >bean>
TEST:多例,输出两个不同的userService
public void demo02(){
//spring 工厂
String xmlPath = "com/itheima/d_scope/beans.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
UserService userService = applicationContext.getBean("userServiceId" ,UserService.class);
UserService userService2 = applicationContext.getBean("userServiceId" ,UserService.class);
System.out.println(userService);
System.out.println(userService2);
}