Bean的配置信息是Bean的元数据信息,由以下4个方面组成:
- Bean的实现类
- Bean的属性信息,如数据源的连接数、用户名、密码等
- Bean的依赖关系,Spring根据依赖关系配置完成Bean之间的装配
- Bean的行为配置,如生命周期范围及生命周期各过程的回调函数
基于XML的配置
采用基于Schema配置方案
依赖注入
属性注入
属性注入指Setter方法注入Bean的属性值或依赖对象
构造函数注入
需要Bean提供带参的构造函数
工厂方法注入
- 非静态工厂方法
- 静态工厂方法
Bean作用域(scope)
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的定义信息。