当前位置: 首页 > news >正文

springboot-bean

-------------------------------------------------------------------------------------------------------

@Autowired 是 Spring 框架中用于依赖注入(Dependency Injection, DI)的核心注解,用于自动装配 Bean 之间的依赖关系,减少手动配置的工作量。以下是其详细使用说明:

1. 作用与原理

  • 作用:自动将 Spring 容器中已存在的 Bean 注入到当前类的属性、构造方法或方法中,无需手动创建对象。
  • 原理:Spring 容器启动时,会扫描带有 @Autowired 的位置,根据类型(默认)或名称查找匹配的 Bean 并注入。

2. 使用位置

@Autowired 可用于 属性、构造方法、普通方法 上:

(1)属性注入(最常用)

直接在类的属性上添加 @Autowired,Spring 会自动注入匹配的 Bean:
java
 
运行
 
 
 
 
@Service
public class UserService {// 自动注入 UserDao 类型的 Bean@Autowiredprivate UserDao userDao;public void addUser() {userDao.insert(); // 直接使用注入的 userDao}
}
 

(2)构造方法注入(推荐,尤其适合必填依赖)

在构造方法上添加 @Autowired,Spring 会在创建当前 Bean 时,通过构造方法传入依赖的 Bean:
java
 
运行
 
 
 
 
@Service
public class UserService {private final UserDao userDao;// 构造方法注入(Spring 4.3+ 中,若类只有一个构造方法,@Autowired 可省略)@Autowiredpublic UserService(UserDao userDao) {this.userDao = userDao;}
}
 
  • 优势:依赖在对象创建时就已初始化,避免 NullPointerException;便于单元测试时手动传入依赖。

(3)方法注入(包括 setter 方法)

在普通方法(如 setter 方法)上添加 @Autowired,Spring 会在 Bean 初始化时调用该方法,并注入参数对应的 Bean:
java
 
运行
 
 
 
 
@Service
public class UserService {private UserDao userDao;// setter 方法注入@Autowiredpublic void setUserDao(UserDao userDao) {this.userDao = userDao;}// 普通方法注入(可注入多个参数)@Autowiredpublic void init(UserDao userDao, RoleDao roleDao) {this.userDao = userDao;// 处理 roleDao...}
}
 

3. 注入规则

(1)默认按类型(Type)匹配

@Autowired 默认根据属性 / 参数的类型在 Spring 容器中查找对应的 Bean。若容器中存在 唯一 匹配类型的 Bean,则直接注入。

(2)类型不唯一时的处理

若容器中存在 多个同类型 的 Bean(如多个 UserDao 实现类),会抛出 NoUniqueBeanDefinitionException。此时需结合以下方式指定具体 Bean:
  • @Qualifier 注解:通过 Bean 的名称(默认是类名首字母小写)指定注入的 Bean:
    java
     
    运行
     
     
     
     
    @Service
    public class UserService {// 注入名称为 "userDaoImpl" 的 Bean@Autowired@Qualifier("userDaoImpl")private UserDao userDao;
    }
    
     
     
  • @Primary 注解:在多个同类型 Bean 中,用 @Primary 标记一个 “首选” Bean,@Autowired 会优先注入它:
    java
     
    运行
     
     
     
     
    @Repository
    @Primary // 首选 Bean
    public class UserDaoImpl implements UserDao { ... }@Repository
    public class UserDaoOtherImpl implements UserDao { ... }// 此时 @Autowired 会注入 UserDaoImpl
    
     
     

(3)非必需依赖(允许为 null)

默认情况下,@Autowired 要求依赖必须存在,否则会抛出 NoSuchBeanDefinitionException。若允许依赖为 null,可添加 required = false
java
 
运行
 
 
 
 
@Autowired(required = false) // 若没有匹配的 Bean,注入 null
private UserDao userDao;
 

4. 注意事项

  • 注入的是 Spring 容器管理的 Bean:被注入的类必须被 Spring 管理(如添加 @Component@Service@Repository 等注解,或通过 XML 配置)。
  • 避免循环依赖:若 A 依赖 B,B 又依赖 A,会导致循环依赖。Spring 可解决构造方法以外的循环依赖,但应尽量避免设计上的循环依赖。
  • 与 @Resource 的区别:@Resource 是 JDK 自带注解,默认按名称匹配,而 @Autowired 默认按类型匹配(需结合 @Qualifier 按名称匹配)。
  • 静态属性无法注入:@Autowired 不能用于静态属性,因为 Spring 注入的是对象实例,而静态属性属于类。

总结

@Autowired 是 Spring 依赖注入的核心工具,通过自动装配减少了手动管理依赖的代码。实际开发中,推荐使用 构造方法注入(明确依赖关系,便于测试),并在必要时结合 @Qualifier 或 @Primary 处理复杂依赖场景。
 
@Autowired private OrganizationMapper organizationMapper;
你提供的代码片段是使用 @Autowired 注解对 OrganizationMapper 类型的属性进行依赖注入,这在 Spring 或 Spring Boot 项目中非常常见,尤其在整合 MyBatis 或 MyBatis-Plus 时(Mapper 接口通常用于数据库操作)。

这段代码的含义与注意事项:

  1. 作用告诉 Spring 容器:在初始化当前类(比如 Service 层的类)时,自动从容器中查找 OrganizationMapper 类型的 Bean,并注入到 organizationMapper 属性中,无需手动创建实例。
  2. 前提条件
    • OrganizationMapper 必须是一个被 Spring 管理的 Bean。
       
      在 MyBatis 中,通常通过 @Mapper 注解标记 Mapper 接口,或在配置类中使用 @MapperScan 扫描 Mapper 所在包,使 Spring 自动生成其实现类(代理对象)并纳入容器管理。
       
      例:
      java
       
      运行
       
       
       
       
      @Mapper // 标记为 MyBatis Mapper,Spring 会生成代理 Bean
      public interface OrganizationMapper {// 数据库操作方法...
      }
      
       
       
  3. 可能的问题与解决
    • 若启动时报错 No qualifying bean of type 'OrganizationMapper' available:原因通常是 OrganizationMapper 未被 Spring 扫描到(比如缺少 @Mapper 注解,或 @MapperScan 路径配置错误)。解决:检查 Mapper 接口是否添加 @Mapper,或确保 @MapperScan("com.xxx.mapper") 扫描路径正确。
    • 若存在多个 OrganizationMapper 类型的 Bean(极少出现,除非自定义了多个实现):需结合 @Qualifier 指定具体 Bean 的名称(默认是接口名首字母小写,即 organizationMapper)。

推荐写法

虽然属性注入简洁,但更推荐 构造方法注入(尤其在实际开发中),原因是:
  • 依赖在对象创建时就初始化,避免 NullPointerException
  • 明确显示类的依赖关系,便于代码维护和单元测试。
示例:
java
 
运行
 
 
 
 
@Service
public class OrganizationService {private final OrganizationMapper organizationMapper;// 构造方法注入(Spring 会自动传入容器中的 OrganizationMapper Bean)@Autowiredpublic OrganizationService(OrganizationMapper organizationMapper) {this.organizationMapper = organizationMapper;}// 使用 organizationMapper 进行数据库操作...
}
 
(注:Spring 4.3+ 中,若类只有一个构造方法,@Autowired 可省略)
 
@ComponentScan(basePackages = {"ptr.oa"}) 是什么意思
@ComponentScan(basePackages = {"ptr.oa"}) 是 Spring 框架中用于指定组件扫描路径的注解,其核心作用是告诉 Spring 容器:去 ptr.oa 包及其子包下扫描并加载所有标注了特定注解的类(如 @Component@Service@Controller@Repository 等),并将这些类实例化为 Bean 纳入 Spring 容器管理。

详细说明:

  1. 注解作用Spring 容器启动时,会根据 @ComponentScan 指定的路径,自动扫描符合条件的类(被 @Component 及其派生注解标记的类),并将它们注册为容器中的 Bean,后续可通过 @Autowired 等注解进行依赖注入。
  2. basePackages 参数
    • basePackages = {"ptr.oa"} 表示扫描的根路径为 ptr.oa 包。
    • 扫描范围包括 ptr.oa 包下的所有类,以及该包的所有子包(如 ptr.oa.serviceptr.oa.controllerptr.oa.mapper 等)。
    例如:
    • 若存在类 ptr.oa.service.UserService 并标注 @Service,会被扫描并注册为 Bean;
    • 若存在类 ptr.oa.controller.OrgController 并标注 @Controller,也会被扫描并注册为 Bean。
  3. 使用场景该注解通常配合 @Configuration 使用(标注在配置类上),用于手动指定 Spring 的组件扫描范围。例如:
    java
     
    运行
     
     
     
     
    @Configuration
    @ComponentScan(basePackages = {"ptr.oa"})
    public class AppConfig {// 其他配置...
    }
    
     
     
    在 Spring Boot 项目中,主启动类上的 @SpringBootApplication 已内置 @ComponentScan,默认扫描主类所在包及其子包。若需要自定义扫描路径,可通过 @ComponentScan 额外指定(如扩展扫描其他包)。

注意事项:

  • 若不指定 basePackages,默认扫描当前类所在的包及其子包。
  • 可指定多个路径,如 basePackages = {"ptr.oa", "ptr.common"},表示同时扫描两个包。
  • 路径支持通配符,如 basePackages = {"ptr.oa.*.service"}(但不推荐过度使用,以免扫描范围混乱)。
通过该注解,Spring 可以自动管理项目中的组件,减少手动配置 Bean 的工作量,是 Spring 依赖注入机制的重要基础。
 
@ConfigurationProperties 是一个bean么
@ConfigurationProperties 本身不是一个 Bean,它是 Spring Boot 提供的一个注解,用于将外部配置(如 application.propertiesapplication.yml 等)绑定到 Java 类的属性上,实现配置的自动注入。

关键说明:

  1. 注解的作用@ConfigurationProperties 的核心功能是 “属性绑定”:通过指定前缀(如 @ConfigurationProperties(prefix = "myapp")),将配置文件中以该前缀开头的配置项(如 myapp.name=xxx)自动映射到当前类的对应属性上。
    示例:
    java
     
    运行
     
     
     
     
    // 配置类(需被 Spring 管理才能生效)
    @Component // 或 @Configuration 等,使其成为 Bean
    @ConfigurationProperties(prefix = "myapp")
    public class MyAppConfig {private String name; // 绑定配置 myapp.nameprivate int port;    // 绑定配置 myapp.port// getter/setter 必须存在,否则无法绑定
    }
    
     
     
  2. 为何它不是 Bean
    • 注解本身只是一个 “标记”,告诉 Spring Boot 该类需要进行属性绑定,但其自身并不具备 Bean 的特性(如被 Spring 容器管理、可被注入等)。
    • 被 @ConfigurationProperties 标注的类需要额外通过 @Component@Configuration 或在配置类中用 @EnableConfigurationProperties 注册,才能成为 Spring 容器中的 Bean。
  3. 成为 Bean 的条件只有当被 @ConfigurationProperties 标注的类同时被 Spring 容器扫描并注册为 Bean 时,它才是一个 Bean。常见方式:
    • 类上添加 @Component(或其派生注解如 @Service 等),结合 @ComponentScan 扫描;
    • 在配置类中通过 @EnableConfigurationProperties(MyAppConfig.class) 显式注册。

总结:

@ConfigurationProperties 是用于属性绑定的注解,本身不是 Bean,但被它标注的类可以通过 Spring 的组件扫描或显式注册成为 Bean,从而实现配置与 Java 类的自动映射。

-------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------

http://www.jsqmd.com/news/36268/

相关文章:

  • 基于88 DCT变换的图像压缩MATLAB实现
  • 2025年热门的非膨胀型防火涂料厂家最新推荐权威榜
  • 如何利用outlook大附件插件解决大文件传输难题?
  • 推荐一款专为APP而生的AI运动识别插件
  • 信创浪潮下 2025ITSM 厂商选型核心指南:从能用到好用的智能价值升级
  • 检查SSD是否开启了trim
  • 2025年玻璃钢厂家权威推荐榜单:玻璃钢缠绕管道/一体化泵站/玻璃钢消防水池源头厂家精选
  • ubuntu24.04: 安装python 3.10.19
  • 2025年口碑好的活性炭空气过滤器厂家最新TOP实力排行
  • 大文件跨国传输怎么合规,确保安全与高效的解决方案
  • AtCoder Beginner Contest 431 题解
  • 2025年轻钢龙骨厂家权威推荐榜单:龙骨/卡式龙骨/隔墙龙骨源头厂家精选
  • 常见的跨网文件安全交换系统解析及应用指南
  • 摄影提示词
  • 2025年比较好的蛇形帘厂家推荐及采购参考
  • 2025年靠谱的高定全品类五金厂家最新权威实力榜
  • firewalld防火墙关闭后telnet仍然不通的原因
  • 2025年11月北京律师推荐排名榜:行业白皮书视角下的十位优质律师
  • 2025年质量好的冰雕施工厂家推荐及选择参考
  • 2025年北京生态原产地保护产品认证机构权威推荐榜单:生态原产地保护产品认证证书/生态原产地保护产品认证管理办法/生态原产地保护产品认证办理时长源头机构精选。
  • 如何用 Calibre 轉化爲 PDF
  • 2025年,别让技术文档再“沉睡”了!手把手教你搭建一个会思考的AI文档库
  • 2025年11月北京律师推荐榜:权威评测十家律所与律师服务排行
  • 2025年热门的东莞平板硫化机最新TOP厂家排名
  • 2025 年 11 月防腐木厂家推荐排行榜,防腐木地板,防腐木花架,防腐木凉亭,防腐木围栏,防腐木批发公司推荐
  • 实用指南:Linux内核架构浅谈38-Linux页表结构:四级页表(PGD、PUD、PMD、PTE)的实现解析
  • 完整教程:大数据背景下时序数据库选型指南:国产开源技术的突破与实践
  • 解锁高效协作:好用的跨网文件安全交换系统来袭!
  • 2025 年 AI、机器学习与数据工程趋势报告 - 公众号
  • 2025年知名的发泡小便器厂家最新热销排行