Ioc之Bean基础

在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();
    }

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值