Spring中的Bean注入注解有什么区别?应该怎么选择?

spring的bean注入注解详解

@Autowired

用途: 自动注入依赖。

场景:

  • 用于自动装配 Spring 容器中的 Bean。

  • 可以用在构造函数、字段、或者 setter 方法上。

示例

 @Autowired
 private UserService userService;

说明:

  • Spring 会自动注入 UserService 类型的 Bean。

  • 默认按照类型进行注入。如果有多个匹配的 Bean,可以通过 @Qualifier 注解指定具体的 Bean。

  • required属性

    required = true: 表示依赖是必须的,Spring 容器在找不到合适的 Bean 时会抛出异常。true 是默认值。

    required = false: 表示依赖是可选的,如果找不到合适的 Bean,Spring 容器不会抛出异常,而是将依赖项设置为 null

@Inject

用途: 标准 Java 注入注解。

场景:

  • @Autowired 类似,用于自动注入依赖。

  • 是 JSR-330 标准的一部分,提供与 @Autowired 相似的功能。

示例:

 @Inject
 private UserService userService;

说明:

  • @Inject@Autowired 使用方式类似,通常选择其中之一。

  • 默认按类型注入,不支持 @Autowiredrequired 属性(@Inject 不支持这个选项)。

@Resource

用途: 通过名称或类型注入 Bean。

场景:

  • 用于根据名称或类型注入依赖。

    当多个 Bean 实现了相同的接口时,你可以使用 @Resourcename 属性来明确指定要注入哪个实现。

  • 是 JSR-250 标准的一部分。

    当你需要精确控制 Bean 的名称时,使用 @Resource 可以避免使用默认的名称自动注入 Bean。

示例:

@Resource(name="userService")
 private UserService userService;

说明:

  • 默认按名称注入,如果找不到匹配名称的 Bean,则按类型注入。

  • 可以通过 name 属性指定 Bean 的名称。

Bean的名称可以通过以下注解添加:

@Component("customName")

@Service("myService")

@Bean(name = "userService")

@Qualifier

用途: 与 @Autowired 结合使用,用于指定具体的 Bean。

场景:

  • 用于解决当有多个 Bean 实现时,指定注入的 Bean。

示例:

 @Autowired
 @Qualifier("specificUserService")
 private UserService userService;

说明:

  • 用于指定具体的 Bean 名称,从而避免多个 Bean 类型匹配时的歧义。

在这里你可能就有疑问了,既然@Autowired需要加个@Qualifier("specificUserService")才能解决接口多继承问题,那我直接@Resource(name = "specificUserService")使用不更香?

@Resource注解的局限性:

  • 不支持复杂注入: @Resource 只支持基于名称或类型的注入,缺乏 @Autowired 的灵活性。

  • 配置较少: 不能像 @Autowired 那样配合其他注解(如 @Qualifier)来实现更复杂的注入逻辑。

  • 不支持 required 属性: @Resource 没有 required 属性,所有依赖都被视为可选的(如果找不到 Bean,注入的将是 null)。

@Bean

用途: 在配置类中定义 Bean。

场景:

  • 用于在 Java 配置类中显式地定义和配置 Bean。

  • 用于创建 Spring 管理的 Bean 实例。

示例:

 @Configuration
 public class AppConfig {
     @Bean
     public UserService userService() {
         return new UserServiceImpl();
     }
 }

说明:

  • 方法上的 @Bean 注解表明该方法返回的对象应由 Spring 容器管理。

  • 适用于需要程序化配置 Bean 的场景。

属性详解

  • value 属性

    功能: value 属性是 name 属性的别名,用于指定 Bean 的名称。

    用法: 可以在声明 Bean 时直接使用 value 来指定 Bean 的名称。例如:@Bean("customBeanName")

    示例:

     @Bean("customBeanName")
     public MyService myService() {
         return new MyServiceImpl();
     }
  • name 属性

    功能: 用于指定 Bean 的名称或多个名称。Bean 的名称是 Spring 容器中唯一标识该 Bean 的标识符。如果不指定,Spring 默认使用方法名作为 Bean 名称。

    用法: 可以指定一个或多个名称。可以将 valuename 视为等效,主要用于清晰的代码风格。

    示例:

     @Bean(name = {"myService", "myServiceBean"})
     public MyService myService() {
         return new MyServiceImpl();
     }
  • autowire 属性(已废弃)

    功能: 指定 Bean 的自动注入模式(基于名称或类型)。此属性在 Spring 5.1 中被标记为废弃,因为 @Autowired 处理机制已经替代了这一功能。

  • autowireCandidate 属性

    功能: 指定 Bean 是否作为自动注入的候选项。默认值为 true,表示该 Bean 可以被自动注入。

    用法: 如果某个 Bean 是内部委托 Bean 或者不希望它被注入到其他 Bean 中,可以将此属性设置为 false

    示例:

     @Bean(autowireCandidate = false)
     public MyService myService() {
         return new MyServiceImpl();
     }
  • initMethod 属性

    功能: 指定一个初始化方法的名称,该方法在 Bean 完成初始化后被调用。

    用法: 用于在 Bean 创建之后执行一些额外的初始化逻辑。

    示例:

     @Bean(initMethod = "init")
     public MyService myService() {
         return new MyServiceImpl();
     }
     public class MyServiceImpl {
         public void init() {
             // 初始化逻辑
         }
     }
  • destroyMethod 属性

    功能: 指定一个销毁方法的名称,该方法在应用程序上下文关闭时被调用。Spring 会自动调用此方法以进行 Bean 的清理。

    用法: 用于在 Bean 销毁前执行清理逻辑。可以指定自定义的销毁方法,或者使用空字符串以禁用自动销毁方法。

    示例:

     @Bean(destroyMethod = "cleanup")
     public MyService myService() {
         return new MyServiceImpl();
     }
     public class MyServiceImpl {
         public void cleanup() {
             // 清理逻辑
         }
     }

@Component, @Service, @Repository, @Controller

用途: 标识 Spring 管理的 Bean 类型。

场景:

  • @Component: 通用的组件注解,适用于任何 Spring 管理的组件。

    缺点:

    通用性同时也是@Component的缺陷:缺乏语义性、代码可读性差

    @Component 仅仅标记类为 Bean,它不支持 Bean 的详细配置或生命周期管理。

    在某些情况下,@Component 可能与其他注解存在冲突或冗余。尤其是在使用 Spring Boot 的自动配置时,默认配置可能会覆盖手动配置的 Bean。

  • @Service: 特定于服务层的 Bean,用于标识服务层组件。

  • @Repository: 特定于数据访问层的 Bean,用于标识数据访问层组件。

  • @Controller: 特定于 Web 层的 Bean,用于标识控制器组件。

示例:

 @Component
 public class MyComponent {
 }
 ​
 @Service
 public class MyService {
 }
 ​
 @Repository
 public class MyRepository {
 }
 ​
 @Controller
 public class MyController {
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码冬梅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值