spring-framework (Version 5.2.9.RELEASE)-核心技术 bean

Bean 概览

一个 Spring IoC 窗口中管理着一个或者多个bean。这些bean根据我们提供的配置给窗口进行创建(如:xml中 的定义 )

在容器中,bean的定义是用 BeanDefinition 来表示,它包含以下的信息:

  1. 通过包来限定类名:通常,是用实现类来定义bean。
  2. Bean 行为配置的元素,它的状态体现在容器中(范围,生命周期的回调,等等)
  3. 一个bean要工作需要依赖其它bean。这种依赖关系我们叫作协作或者依赖。
  4. 其他配置,在新建对象之前 ,如:容器大小的限制,或者管理连接池bean连接数的限制。

元数据通过一系列属性标记定义。如下 :

PropertyExplained in…
ClassInstantiating Beans
NameNaming Beans
ScopeBean Scopes
Constructor argumentsDependency Injection]
PropertiesDependency Injection
Autowiring modeAutowiring Collaborators
Lazy initialization mode[Lazy-initialized Beans
Initialization methodInitialization Callbacks
Destruction methodDestruction Callbacks

实例化bean

一个bean的定义本质上可以用来创建一个或者多个对象。容器里查找配置当一个命名的bean被请求或者使用使用元数据进行封闭创建一个实际对象。

如果你是使用XML作为基础的配置,应该指定对象的类型用来实例化在 元素的class 属性。这个 class 属性( BeanDefinition 实例的 Class 属性)通常是强制的。(对于例外的情况:see Instantiation by Using an Instance Factory Method and Bean Definition Inheritance)使用 Class 属性的两种方式之一:

通常,指定bean class 在例子的构造,容器通过构造器方法反射创建bean,和java代码中使用 new 进行操作一样。

指定实体类包含 static 工厂方法,执行这个工厂方法创建对象,不常用的情况下,容器会执行一个 static 工厂方法基于class创建bean。这个对象的类型 static 工厂方法返回的类型可以是同一个类或者完全另外一个类。

  • 内部类命名

如果你配置的一个bean定义里面包含一个静态内部类,应该使用字节名命名内部类。

例如,有一个类叫SomeThing 在 com.example 这个包下,并且 SomeThing 这个类含有一个静态内部类叫 OtherThing, 在bean定义下 class 属性应该写成 com.example.SomeThing$OtherThing.

注意 使用 $ 字符来把外部类名和内部类名分隔开来。

  • 使用构造器进行实例化。

使用构造器方法创建bean时,所有通常的类都可以使用并且和Spring 兼容。即,类的开发不需要实现任何指定的接口或者指定的一种方式。简单的指定bean的class就足够。但是,Ioc容器指定bean的类型之后 ,有可能一个默认的空的构造方法。

Spring IoC容器实际上可以模拟管理所有的class你要它的管理类。它不限制于管理是真的JavaBean。大多数 Spring 用户更喜欢使用一个默认的空的构造方法和适当的 setter 和 getter 方法在容器上进行建模。在容器也有许多非bean风格的class。例如,如果你需要一个不符合javaBean规范的的连接池,Spring 也可以很好的管理。

使用xml进行配置,可以使用 bean的class 如下:

<bean id="exampleBean" class="examples.ExampleBean"/>
<bean name="anotherExample" class="examples.ExampleBeanTwo"/>
  • 使用静态工厂方法进行实例化

当要定义一个bean时也可以使用静态的工厂方法,使用 class 属性指定bean 的class 其中包容一个静态的工厂方法使用 factory-method 属性来指定工厂方法的名称。这个方法是要可以被指定的(带有可选的参数,在后面会进行描述)并且返回一个对象,它就相当是通过构造器方法进行创建的。这种创建方法,就是把bean定义创建放在静态工厂方法中。

下面bean的定义就是使用一个工厂方法进行创建的。这种声明方法不用声明返回对象的类型,这个类型包含在工厂方法。这个例子 , createInstance() 必须使用一个静态方法。下面例子展示如何使用工厂方法创建声明创建bean。

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

例子中,bean定义中指定class 的代码如下 :


public class ClientService {

private static ClientService clientService = new ClientService();

private ClientService() {}


public static ClientService createInstance() {
return clientService;
}
}
  • 使用一个实例化一个工厂方法实例化bean。

和使用 静态工厂方法一样,使用一个实例化工厂类执行一个非静态方法从容器中创建一个存在的bean。使用这个机制, class 属性可以是为空的,在 factory-bean 属性,指定当前容器中含有一个实例化方法用它来创建对象的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"/>

例子中相互交互class内容:


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"/>

例子中,class的代码如下 :


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;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值