在xml文件配置的bean,会被Spring转换成BeanDefinition对象。包括全限定的类名(class),对象的作用域(scope),对象生命周期回调函数(init-method,destory-method),延迟初始化(lazy-init)以及引用其他的bean等信息。
BeanFactory是管理所以bean对象的接口,Spring提供一个默认实现类DefaultListableBeanFactory。通过ApplicationContext的getAutowireCapableBeanFactory方法返回DefaultListableBeanFactory对象。这样可以通过BeanFactory进行代码注册bean。
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"spring/spring-parent.xml"});
DefaultListableBeanFactory factory = (DefaultListableBeanFactory) context.getAutowireCapableBeanFactory();
User user = new User("devin", '男');
factory.registerSingleton("test", user);
User test = context.getBean("test", User.class);
System.out.println(test);
Bean命名
通过属性id指定唯一的名字,也可以不指定。不指定名字的bean,Spring会生成一个名字,一般匿名bean不需要指定id。
在Spring3.1版本以前,id属性被定义成xsd:ID类型。在Spring3.1以后的版本中,id被定义成了xsd:string类型,id属性不在通过XML解析器限制为唯一,而是通过容器强制限制为唯一。
Bean的别名
可以使用name给指定其他名字,可以使用逗号(,),分号(;)或者空格来隔开方式,指定多个别名。
<bean id="user" class="com.devin.java.beans.User" name="user2,user3,user4"/>
也可以是alias标签指定别名,name指定存在的bean名字,alias指定别名
<alias name="user" alias="user5"/>
实例化Bean
通过class属性值有两种方式实例化Bean- 通过反射调用构造方法来创建Bean
- 通过工厂方法创建Bean
静态内部类,class属性使用$字符来分割外部类和内部类的名称。例如:com.epdc.java.Bar$Baz
构造函数实例化
需要Bean类提供默认构造方法,即无参数。
<bean id="user" class="com.devin.java.beans.User"/>
静态工厂实例化
factory-method属性指定为静态方法,Spring通过调用该方法返回对象
<!--静态工厂实例化-->
<bean id="userFactory" class="com.devin.java.factory.UserFactory" factory-method="createInstance"/>
public class UserFactory {
private static UserFactory userFactory = new UserFactory();
private UserFactory(){}
public static UserFactory createInstance(){
return userFactory;
}
public String test(){
return "hello static factory";
}
}
实例工厂实例化
class属性必须为空,factory-bean指定为其他bean对象,factory-method指定为其他bean对象的方法。然而Spring会调用这个bean对象的指定方法来实例化Bean<bean id="instanceFactory" class="com.devin.java.factory.InstanceFactory"/>
<!--实例工厂实例化-->
<bean id="userService" factory-method="createService" factory-bean="instanceFactory"/>
public class InstanceFactory {
public UserService createService(){
return new UserServiceImpl();
}
}