知乎百万浏览:曾经那些Java框架疯狂使用xml,为啥现在又回归“硬编码“了?

今天我们聊一个老程序员们都能感同身受的话题:Java世界的“去XML化”趋势。曾经那段到处都是xml文件的日子,真的令人“怀念”……啊不,准确说是“噩梦”。

图片

从Spring、Struts到Hibernate,无论走到哪里,总有几百行xml文件等着你慢慢调试。现在回想起来,那时候的我们仿佛在和xml“纠缠不清”,心里只有一个想法:我还能写代码吗?全是xml啊!

大家当时都在推崇这种“松耦合”的方式,似乎不用硬编码就能达到解耦的巅峰。结果没几年,Spring Boot这种“硬编码”配注解的风潮又卷土重来,把XML撂在了一边。这到底是怎么回事?XML真的走了弯路吗?

图片

先回到十多年前的Java开发,那时候我们做项目,基本上XML就是主力配置语言。像Spring、Struts这些框架都狂热地拥抱XML配置,光是Spring项目的配置文件就能有几百上千行,特别是在早期Spring项目中,Bean的配置都写在applicationContext.xml里。那段时间,我们调试出错了大半时间是花在看XML配置文件上的。很多老程序员(比如我自己)都被XML折磨得不轻。

用XML做配置的好处是显而易见的:可扩展、语言无关、松耦合。想想当时的Java环境,我们说的“硬编码”问题,其实指的是如果所有依赖关系都直接写在代码里,那么项目改动起来非常麻烦。XML相当于是把这些依赖抽离出来,以文本的形式呈现,方便修改和维护。

最经典的例子,可能就是Spring的依赖注入(Dependency Injection)。通过在XML文件里配置各个Bean的依赖关系,开发者可以轻松更换实现类,而不用动一行业务代码。这听起来是不是很美?这种通过配置文件来做解耦的思路,当时几乎成了“正确开发姿势”的标准。

<!-- Bean配置示例 -->
<bean id="userService" class="com.example.UserServiceImpl">
    <property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.example.UserDaoImpl"/>

这种配置方式很“优雅”,表面看似乎不碰代码,换个配置就能运行。可是,实际用起来并不总是那么顺利。随着项目规模的增长,XML文件也越来越臃肿,成了维护的噩梦,特别是新手开发者接手时,容易被搞得一头雾水。再加上,每次修改配置都得重启应用,这效率就更低了。

随着Java 5的发布,注解(Annotations)登上历史舞台,给Java开发带来了全新的玩法。XML方式虽然有它的灵活性和解耦优势,但实际使用时,太多的XML文件让项目变得异常复杂。于是,Java社区开始反思:能不能让配置更直观一点,少点XML的“仪式感”?

答案就是注解。用注解代替XML来做配置,不仅避免了大量的XML配置文件,还让配置和业务逻辑的关系更加紧密,变得一目了然。Spring 2.5开始支持注解,到了Spring 3.x,注解已经成为主流。开发者只需要通过简单的注解,就可以实现依赖注入和切面编程,极大简化了配置文件。

举个例子,以前用XML配置一个Bean,可能需要写一大段配置文件,现在只要在类上加个注解就行:

// 使用注解的方式配置Bean
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    
    public void createUser(User user) {
        userDao.save(user);
    }
}

看到了吧?相比XML,注解的代码更直观,而且因为它就是代码,开发工具可以帮助你自动补全和检查,出错的几率也小很多。更重要的是,注解在类定义时就能搞定依赖,减少了运行时的复杂配置加载过程。

进入Spring Boot时代,XML更是被彻底“抛弃”了。Spring Boot的口号之一就是“约定优于配置”,通过默认的约定,尽量减少开发者的配置工作。几乎所有的配置都可以通过注解和Java类来实现,特别是@Configuration@Bean注解,替代了大量的XML配置。

来看看一个典型的Spring Boot配置例子:

// 配置类示例
@Configuration
public class AppConfig {
    
    @Bean
    public UserService userService() {
        return new UserServiceImpl();
    }

    @Bean
    public UserDao userDao() {
        return new UserDaoImpl();
    }
}

Spring Boot的出现,直接把开发者从繁琐的配置中解救出来。默认情况下,项目的配置都在application.propertiesapplication.yml中,简洁、明了,不需要像过去那样到处翻找XML文件。

那么问题来了,XML是不是走了弯路?其实并不能这么说。每种技术的诞生都有它的历史背景和原因。最早使用XML时,是因为Java语言本身在可描述性和动态性方面存在局限,缺乏注解等元编程能力。而XML具备良好的表达能力和语言无关性,非常适合做配置文件。

在那个年代,Java开发的首要问题是如何解耦,如何让项目具有可扩展性。XML作为一种独立于代码的配置手段,正好契合了当时的需求。但随着Java语言的进化和注解、Lambda表达式等新特性的加入,XML的角色逐渐变得“可有可无”。

然而,这并不意味着XML毫无价值。实际上,很多复杂的企业级应用和老旧系统仍然依赖XML,尤其是在服务集成(如SOAPWSDL)或一些特定的场景中,XML仍然是不可替代的。只是相对于现在主流的开发模式,它显得过于笨重和低效。

注解的好处显而易见,但它也不是完美的。过度使用注解,会让代码变得难以维护。当一个类上贴满了各种注解时,逻辑其实已经变得和XML一样混乱了。特别是当多个注解之间产生冲突时,调试起来同样让人抓狂。

再来一个例子:

@Transactional
@Service
public class OrderServiceImpl implements OrderService {
    
    @Autowired
    private OrderDao orderDao;
    
    @Cacheable("orders")
    public Order getOrderById(Long id) {
        return orderDao.findById(id);
    }
}

上面的代码用了@Transactional@Cacheable注解,看似很清晰,但当项目复杂到一定程度时,各种注解的相互作用可能会导致一些诡异的Bug,而且调试起来并不比调试XML容易多少。

XML和注解之间的选择,归根到底是权衡的问题。XML提供了更高的灵活性,但代价是复杂性;注解则让代码更加简洁明了,但过度使用也会带来维护上的麻烦。

我觉得,技术本身没有对错,只有合适不合适。现在的Java开发更注重“快”和“灵活”,因此注解和配置类成为了主流。但在一些特定场景下,XML依然有它的用武之地。

总之,Java开发世界的发展就是这样,走了许多弯路,但每个弯路都为技术进步贡献了力量。希望这篇文章能帮你更好地理解XML、注解和配置类的演进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值