主要介绍内容:
- Spring 对于加载Bean的优化发展历程
- 常用的Spring Bean装载方式
- 动态装配Bean:@Enable***模块驱动模式
- 外部Bean装配:SPI机制
- 条件装配Bean:Condition
Spring Bean装载发展阶段
纵观Spring发展历程,关于Bean的装载,Spring一直在去XML化、简单化。
Spring 发展阶段 | Bean 装载发展变化 |
---|---|
Spring 1.x阶段 | Spring 1.2.0是个分水岭,当时Java 5刚刚发布,业界正兴起使用Annotation的技术风格 Spring自然也提供了支持,比如:@Transactional等注解,但是是当时候,还是以XML配置方式为主。 |
Spring 2.x阶段 | 在Annotation中添加了@Required 、@Repository 以及AOP相关的@Aspect 等注解同时也提升了XML配置能力,也就是可扩展的XML,比如:Dubbo等开源框架就是基于Spring XML的扩展集成Spring,从而降低了Dubbo使用的门槛。 Spring 2.5版本是个分水岭, 它引入了一些很核心的Annotation 1、 @Autowired 依赖注入2、 @Qualifier 依赖查找3、 @Component 、@Service 组件声明4、 @Controller 、@RequestMappring 等spring mvc的注解尽管Spring 2.x时代提供了不少注解,但仍然没有脱离XML配置驱动,比如<context:annotation-config context:componet-scan/> |
Spring 3.x阶段 | Spring Framework3.0是个里程碑时代,在功能特性出现非常大的扩展,比如:全面拥抱Java5、以及Spring Annotation。 大量增加注解,实现去XML配置,例如: 1、 @Configuration 、@Bean 2、 @Component-Scan 、@Service 、@Repository 、@Controller 3、 @Import 4、 @Enable 模块驱动功能5、 同时还引入了Spring SPI机制,加载第三方组件 |
Spring 4.x阶段 | 引入@Conditional 条件装配 |
Spring 5.x阶段 | 引入@Indexed 注解 |
Spring Bean装配方式
基本的Bean装配方式
早期使用Spring我们多是通过XML配置文件方式去装载Bean
<bean id="user" class="com.study.mypriject.model.User">
<property name="id" value="1"/>
<property name="userName" value="张三"/>
<property name="age" value="18"/>
</bean>
从Spring 3.x开始,注解是编程方式逐渐兴起,对于Bean的装载,也逐渐实现去XML化,到现在我们则是使用一些特殊注解的+配置Bean的方式去声明我们需要托管给Spring IOC的Bean:
@Configuration
public class Config {
@Bean(name="user")
public StudentService studentService(){
User user = new User();
user.setId(1);
user.setUserName("张三");
user.setAge(18);
return user;
}
}
一些常用的注解:
@Component
、@Controller
、@Service
、@Mapper
、@Repository
、@Import…….等等
动态装配Bean:@Enable模式
以上这里几种方式是我们使用Spring时最常用的声明Bean的方式。除此之外,Spring提供了一系列以@Enable
开头的注解,就是@Enable**
模式,例如:@EnableCaching
、@EnableAsyne
、@EnableScheduling
、@EnableAspectJAutoProxy
等等。这些注解本质上是激活Spring的某些管理功能。
@Enable**
注解里都包含一个@Import
注解,**@Import
注解:表示要导入的一个或多个配置类。**提供与Spring XML中的元素等效的功能,它允许导入的对象有:
- @Configuration类
- ImportSelector接口的实现
- ImportBeanDefinitionRegistrar接口的实现
- 以及常规组件类。
@Import在4.2之前只支持导入配置类,在4.2以后@Import支持导入普通java类并将其声明成一个bean。
@Configuration类
这种方式和我们自定义一个@Configuration配置类的使用方式一样,例如:
@EnableScheduling
就是声明导入配置类SchedulingConfiguration
指定导入配置类:SchedulingConfiguration.class