在IoC容器中装配Bean

来源:互联网 发布:美国 苏联 知乎 编辑:程序博客网 时间:2024/06/15 23:58

Spring容器内部协作结构
Bean的配置信息是Bean的元数据信息,由以下4个方面组成:

  • Bean的实现类
  • Bean的属性信息,如数据源的连接数、用户名、密码等
  • Bean的依赖关系,Spring根据依赖关系配置完成Bean之间的装配
  • Bean的行为配置,如生命周期范围及生命周期各过程的回调函数

IoC注入方法

基于XML的配置

采用基于Schema配置方案

依赖注入

属性注入

属性注入指Setter方法注入Bean的属性值或依赖对象

构造函数注入

需要Bean提供带参的构造函数

工厂方法注入

  • 非静态工厂方法
  • 静态工厂方法

Bean作用域(scope)

Bean作用域类型

singleton作用域

单例模式,默认。

<bean id="car" class="com.smart.scope.Car" scope="singleton"/>

默认singleton,所以scope="singleton"无须显式指定

单例模式

Spring的ApplicationContext容器在启动时,自动实例化所有singleton的Bean并缓存于容器中。虽然启动花费一些时间,但带来两个好处:

  • 对Bean提前实例化操作会及早发现一些潜在的配置问题;
  • Bean以缓存的方式保存,当运行时用到该Bean就无须实例化了,提供了运行效率

prototype作用域

<bean id="car" class="com.smart.scope.Car" scope="prototype"/>

非单例模式

默认情况下,Spring容器启动时不实例化prototype的Bean。此外,Spring容器将prototype的Bean交给调用者后,就不再管理它的生命周期。

与Web应用环境相关的Bean作用域

  • request作用域
    对应一个HTTP请求和生命周期
<bean id="car" class="com.smart.scope.Car" scope="request"/>

每次HTTP请求调用car Bean时,Spring容器就会创建一个新的car Bean;请求处理完毕后,就会销毁这个Bean

  • session作用域
<bean id="car" class="com.smart.scope.Car" scope="session"/>

这样配置后,car Bean的作用域横跨整个HTTP Session,Session中所有HTTP请求都共享同一个car Bean,当HTTP Session结束后,实例才会被销毁

  • globalSession作用域
<bean id="car" class="com.smart.scope.Car" scope="globalsession"/>

类似于session作用域,不过尽在Portlet的Web应用中使用

基于注解的配置

Spring容器成功启动的三大要件分别是Bean定义信息、Bean实现类和Spring本身。采用基于XML的配置,则Bean定义信息和Bean实现类本身是分离的;而采用基于注解的配置文件,则Bean定义信息通过在Bean实现类上标注注解来实现。
@Component:通用的注解,Spring容器自动将POJO转换为容器管理的Bean
@Reposity:用于对DAO实现类标注
@Service:对Service实现类标注
@Controller:对Controller实现类标注

Component完全可以替换下面3个特殊的注解,不过推荐使用特定的注解标注特定的Bean,可以更清晰的表示标注类的用途

自动转配Bean

  • 使用@Autowired进行自动注入
    @Autowired默认按类型(byType)匹配的方式在容器中查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中

Bean的作用范围及生命过程方法

  • 作用域
    通过注解配置的Bean,默认作用范围是singleton。Spring为注解配置提供了@Scope注解,可以通过它显式指定Bean的作用范围如@Scope(prototype)
  • 生命过程方法
    在使用<bean>配置时,可以通过init-method和destory-method指定Bean的初始化及容器销毁前执行的方法。注解通过@PostConstruct@PreDestroy实现。

基于Java类的配置

JavaConfig是Spring的一个子项目,旨在通过Java类的方式提供Bean的定义信息。
普通POJO只要标注@Configuration注解,就可以为Spring容器提供Bean定义的信息。每个标注了@Bean的类方法都相当于提供了一个Bean的定义信息。

原创粉丝点击