IoC容器(二)

84 阅读1分钟

容器中的bean定义是以BeanDefinition对象的形式呈现的。包含如下信息:

  • 需要被实例化类的全限定类名

  • bean的作用域以及生命周期回调等

  • bean的依赖

  • 其他设置,如连接数,大小限制等

ApplicationContext的实现允许我们自行注册容器之外的对象到容器中。示例代码如下:

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext();
applicationContext.getBeanFactory().registerSingleton("dog", new Dog());

可以给bean去别名,bean的name属性可以为bean同时指定多个名字,名字之间用逗号,分或者空格隔开。

<bean id="dog" name="dog1,dog2,dog3" class=""/>

为指定名称的bean定义别名

<alias name="myApp-dataSource" alias="subsystemA-dataSource"/>
<alias name="myApp-dataSource" alias="subsystemB-dataSource"/>

通过静态工厂方法定义bean

<bean id="clientService"
    class="examples.ClientService"
    factory-method="createInstance"/>


public class ClientService {
    private static ClientService clientService = new ClientService();
    private ClientService() {}

    public static ClientService createInstance() {
        return clientService;
    }
}

通过实例工厂方法定义bean

<!-- the factory bean, which contains a method called createInstance() -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
    <!-- inject any dependencies required by this locator bean -->
</bean>

<!-- the bean to be created via the factory bean -->
<bean id="clientService"
    factory-bean="serviceLocator"
    factory-method="createClientServiceInstance"/>

public class DefaultServiceLocator {

    private static ClientService clientService = new ClientServiceImpl();

    public ClientService createClientServiceInstance() {
        return clientService;
    }
}

可以指定多个工厂方法

<bean id="serviceLocator" class="examples.DefaultServiceLocator">
    <!-- inject any dependencies required by this locator bean -->
</bean>

<bean id="clientService"
    factory-bean="serviceLocator"
    factory-method="createClientServiceInstance"/>

<bean id="accountService"
    factory-bean="serviceLocator"
    factory-method="createAccountServiceInstance"/>

public class DefaultServiceLocator {

    private static ClientService clientService = new ClientServiceImpl();

    private static AccountService accountService = new AccountServiceImpl();

    public ClientService createClientServiceInstance() {
        return clientService;
    }

    public AccountService createAccountServiceInstance() {
        return accountService;
    }
}

可以通过BeanFactory.getType获取bean的运行时类型

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
applicationContext.getType("dog");