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
使用方式类似,通常选择其中之一。 -
默认按类型注入,不支持
@Autowired
的required
属性(@Inject
不支持这个选项)。
@Resource
用途: 通过名称或类型注入 Bean。
场景:
-
用于根据名称或类型注入依赖。
当多个 Bean 实现了相同的接口时,你可以使用
@Resource
的name
属性来明确指定要注入哪个实现。 -
是 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 名称。
用法: 可以指定一个或多个名称。可以将
value
和name
视为等效,主要用于清晰的代码风格。示例:
@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 {
}