前言刚学Spring的时候是不是被一大堆XML配置搞疯了写一个类就要加一个bean标签依赖多了之后XML文件动辄几百行改个配置还要翻半天维护起来简直是噩梦。还好Spring早就提供了注解式开发的能力从Spring 2.5开始支持注解驱动到现在SpringBoot全注解开发已经成了行业主流一行XML都不用写就能玩转IOC和DI。今天这篇文章就带大家从零开始搞定Spring基于注解的IOC和DI从配置步骤、核心注解到新手踩坑指南全给你安排得明明白白看完就能直接上手告别XML配置的痛苦一、注解式IOC前置准备一行配置开启注解新世界想要用Spring的注解第一步必须告诉Spring你要去哪个包里扫描注解。不然你加再多注解Spring也看不到根本不会生效1. 核心配置开启包扫描我们只需要在Spring的application.xml配置文件里加上这一行配置配置说明base-package指定Spring要扫描的包路径Spring会扫描这个包以及它下面所有子包中的类识别类上的注解。举个例子你配置了base-packagecom.hg那么com.hg.dao、com.hg.service、com.hg.controller这些子包都会被扫描到。新手踩坑点90%的新手都踩过这个坑——包路径配错了比如你的类在com.hg.service里结果你配成了com.hg.dao那注解肯定不生效2. 包扫描到底做了什么Spring启动的时候会读取这个配置遍历指定包下的所有class文件识别出类上添加了IOC相关注解的类自动把这些类注册成Bean放到IOC容器里再也不用我们一个个写bean标签了简直不要太爽二、Bean注册四大注解Component全家桶告别bean标签开启包扫描之后我们只需要在类上加上对应的注解Spring就会自动把这个类注册成容器里的Bean不用再写繁琐的XML配置了。这四个注解核心功能完全一致——都是把类交给Spring容器管理只是语义不同用来区分不同的架构层级让我们的代码结构更清晰、可读性更高。1. 四大注解详解注解适用场景核心说明RepositoryDao层数据访问层标注在数据访问层的实现类上比如Mapper、Dao实现类ServiceService层业务逻辑层标注在业务逻辑层的实现类上用于处理业务逻辑ControllerController层控制层标注在Spring MVC的控制器类上用于处理前端请求Component三层架构之外的通用组件通用的组件注解不属于上面三层的工具类、通用组件都用这个2. 代码示例一看就会1Dao层实现类添加Repository注解2Service层实现类添加Service注解3. 自定义Bean的名称默认情况下Spring给Bean生成的名称是类名首字母小写比如UserServiceImpl对应的beanName是userServiceImpl。如果你想自定义Bean的名称直接在注解里指定即可这样我们通过getBean(userService)就能精准拿到这个对象了。4. 配合Scope指定Bean的作用域之前我们讲过Bean的5大作用域用注解开发的时候直接用Scope注解就能指定无需在XML里配置scope属性。示例Scope里的取值和XML里的scope属性完全一致singleton、prototype、request、session、application都可直接使用。三、依赖注入DI三大注解告别set方法一行注解搞定注入Bean注册到容器里了那依赖怎么注入呢比如Service层要注入Dao层的对象以前我们要在XML里写property属性还要手写set方法现在用注解一行代码就搞定了Spring提供了3个核心的DI注解分别应对不同的注入场景我们一个个讲透。1. Autowired按类型注入最常用这是我们日常开发中用得最多的注入注解核心特性是默认按Bean的类型进行依赖注入。用法示例核心说明只要容器里有唯一一个对应类型的Bean就能自动注入成功连set方法都不用写超级方便。踩坑解决方案如果容器里有多个同一个类型的BeanAutowired会直接报错因为它不知道该注入哪一个。这时候配合Qualifier注解按名称指定要注入的Bean即可2. Resource按名称注入也能按类型这个注解不是Spring提供的而是JSR-250规范里的官方注解Spring做了完美支持。它的核心特性是默认按Bean的名称注入找不到对应名称时会自动降级按类型注入。用法示例面试常问Autowired和Resource的核心区别这个也是Java面试的高频考点记住这几个核心差异面试不翻车来源不同Autowired是Spring官方提供的专属注解Resource是Java EE的规范注解来自JSR-250标准。注入规则不同Autowired默认按类型注入必须配合Qualifier才能实现按名称注入Resource默认按名称注入名称匹配不到才会降级按类型注入。兼容性不同Autowired只有Spring框架支持Resource是Java标准规范所有兼容JSR-250的框架都能支持。3. Value注入基本类型和String上面两个注解都是用来注入容器里的Bean对象的那我们要注入基本数据类型、String类型甚至配置文件里的配置值怎么办用Value注解就对了用法示例Value注解非常灵活不仅能注入固定值还能读取配置文件、环境变量、系统属性里的内容日常开发中使用频率极高。四、注解开发新手必踩的5个坑避坑指南很多同学刚用注解的时候会遇到各种“注解不生效”、“注入失败报空指针”的问题90%都是踩了下面这些坑今天给大家全部列出来帮大家提前避坑坑1包扫描路径配错了这是最常见的坑你的类加了注解但是Spring的包扫描路径没有包含这个类所在的包Spring根本扫描不到注解自然就不生效了。解决办法检查context:component-scan的base-package确保包含了你所有加注解的类的包路径。坑2注解加在了接口上而不是实现类上很多新手会把Service、Repository加在接口上比如记住Spring是给类创建实例、注册Bean的注解必须加在实现类上接口上加了等于白加坑3Autowired注入时容器里没有对应类型的Bean比如你要注入UserDao但是UserDao的实现类没加Repository注解容器里根本没有这个类型的BeanAutowired就会直接报错。解决办法检查要注入的类有没有添加对应的注解有没有被Spring的包扫描覆盖到。坑4单例Bean注入多例Bean多例直接失效这个我们之前也提过单例Bean只会在容器启动时创建一次依赖注入也只会执行一次就算你注入的是多例Bean也只会注入一次后续不会自动更新新的实例导致多例完全失效。解决办法可以使用lookup-method注入或者每次使用时直接从容器中getBean获取不要直接注入。坑5Autowired注入的对象报空指针异常很多时候你明明加了Autowired但是运行的时候对象是null大概率是因为你自己new了这个类的对象而不是从Spring容器里获取的。比如你在代码里写了UserService userService new UserServiceImpl();这个对象是你自己new出来的Spring根本管不着里面的Autowired自然不会生效肯定是null。解决办法所有要用到的Bean都从Spring容器里获取绝对不要自己手动new受Spring管理的类总结看完这篇文章相信大家已经能感受到Spring注解式开发的香了。对比传统的XML配置注解开发不仅代码量更少可读性更高维护起来也更方便注解和业务代码放在一起改起来也不用来回翻XML文件。今天我们完整讲了注解开发的前置配置包扫描的配置方式和核心作用注册Bean的四大注解Component全家桶的用法、区别和最佳实践依赖注入的三大注解Autowired、Resource、Value的用法和坑点注解开发新手最容易踩的5个坑帮大家提前避坑。现在的企业级开发不管是传统SSM还是SpringBoot、SpringCloud基本都是全注解开发掌握这些注解是Java开发的必备基本功。