基于XML配置的方式很好地完成了对象声明周期的描述和管理,但是随着项目规模不断扩大,XML的配置也逐渐增多,使得配置文件难以管理。另一方面,项目中依赖关系越来越复杂,配置文件变得难以理解。这个时候迫切需要一种方式来解决这类问题。
随着JDK1.5带来的注解支持,Spring从 2.x 开始,可以使用注解的方式来对Bean进行声明和注入,大大减少了XML的配置量。
记得当时大家争议的话题是:Spring采用注解配置和XML配置那个更好?
Spring升级到 3.x 后,提供了JavaConfig的能力,它可以完全取代XML,通过Java代码的方式来完成Bean的注入。所以,现在我们使用的Spring Framework 或者 Spring Boot ,已经看不到XML配置的存在了。
JavaConfig的出现给开发者带来了很多的变化
- XML配置形式的变化
在早期的Spring中,我们会基于XML配置文件来描述Bean及Bean的依赖关系:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--bean 的描述-->
<beans>
使用JavaConfig形式之后,只需要使用@Configuration注解即可,它等同于XML的配置形式:
@Configuration
public class SpringConfigClass {
// Bean 的描述
}
- Bean装载方式的变化
基于XML形式的装载方式:
<bean id="beanDefine" class="com.bilibili.spring.BeanDefine"/>
基于JavaConfig的配置形式,可以通过@Bean注解来将一个对象注入IoC容器中,默认情况 下采用方法名称作为该Bean的id
@Configuration
public class SrpingConfigClass {
// Bean 的描述
@Bean
public BeanDefine beanDefine() {
return new BeanDefine();
}
}
- 依赖注入的变化
在XML形式中,可以通过三种方式完成依赖注入,比如setter方式注入:
<Bean id="beanDefine" class="com.bilibili.spring.BeanDefine">
<property name="dependencyBean" ref="dependencyBean"/>
</Bean>
<bean id="dependencyBean" class="com.bilibili.spring.depencyBean"/>
在JavaConfig中,可以这样来表述:
@Configuration
public class SpringConfigClass{
@Bean
public BeanDefine beanDefine() {
BeanDefine beanDefine = new BeanDefine();
beanDefine.setDependencyBean(dependencyBean());
return beanDefine;
}
@Bean
public DependencyBean dependencyBean() {
return new DependencyBean();
}
}
- 其他配置的变化
除了前面说的几种配置,还有其他常见的配置,比如:
@ComponentScan对应XML形式的<context:component-scan base-package="" />,它会扫 描指定包路径下带有@Service 、 @Repository、@Controller、@Component 等注解的类, 将这些类装载到IoC容器。
@Import 对应XML形式的<import resourse="" />,导入其他的配置文件
虽然通过注解的方式来装配Bean,可以在一定程度上减少XML配置带来的问题,但是从某一方面来说它知识换汤不换药,本质问题仍然没有解决,比如:
- 依赖太多。Spring可以整合几乎所有常见的技术框架,比如JSON,MyBatis,Redis,Log等不同的依赖包的版本很容易导致版本兼容的问题。
- 配置太多。以Spring使用JavaConfig方式整合MyBatis为例,需要配置注解驱动、配置数据源、配置MyBatis、配置事务管理器等,这些只是集成一个技术组件需要的基础配置,在一个项目中这类配置很多,开发者需要做很多类似的重复工作。
- 运行和部署很烦琐。需要先把项目打包,再部署到容器上。
思考
如何让开发者不再需要关注这些问题,而专注于业务呢?