在 Spring 框架中,Bean 的注入方式主要有以下几种,其中一些是自动注入的。以下是详细说明:
1. 构造函数注入 (Constructor Injection)
自动注入:使用 @Autowired
注解时,Spring 容器会自动调用带有 @Autowired
注解的构造函数,并传入所需的依赖对象。
@Component
public class MyService {private final MyRepository repository;@Autowiredpublic MyService(MyRepository repository) {this.repository = repository;}
}
2. Setter 注入 (Setter Injection)
自动注入:使用 @Autowired
注解时,Spring 容器会在创建 Bean 实例后,调用带有 @Autowired
注解的 setter 方法,并传入所需的依赖对象。
@Component
public class MyService {private MyRepository repository;@Autowiredpublic void setRepository(MyRepository repository) {this.repository = repository;}
}
3. 字段注入 (Field Injection)
自动注入:使用 @Autowired
注解时,Spring 容器会自动将依赖注入到带有 @Autowired
注解的字段中。
@Component
public class MyService {@Autowiredprivate MyRepository repository;
}
4. 基于配置文件的注入 (XML-based Configuration)
手动配置:通过 XML 配置文件来定义 Bean 及其依赖关系,不是自动注入。
<bean id="myService" class="com.example.MyService"><property name="repository" ref="myRepository" />
</bean><bean id="myRepository" class="com.example.MyRepository" />
5. 基于 Java 配置的注入 (Java-based Configuration)
手动配置:使用 @Configuration
和 @Bean
注解来配置 Bean 及其依赖关系,不是自动注入。
@Configuration
public class AppConfig {@Beanpublic MyRepository myRepository() {return new MyRepository();}@Beanpublic MyService myService(MyRepository repository) {return new MyService(repository);}
}
6. @Resource
自动注入:@Resource
注解是 JSR-250 标准的一部分,Spring 也支持它。它可以用于字段、setter 方法或构造函数,Spring 容器会自动注入依赖。
@Component
public class MyService {@Resourceprivate MyRepository repository;
}
7. @Inject
自动注入:@Inject
注解是 JSR-330 标准的一部分,Spring 也支持它。它可以用于字段、setter 方法或构造函数,Spring 容器会自动注入依赖。
@Component
public class MyService {@Injectprivate MyRepository repository;
}
总结
自动注入:
构造函数注入(使用 @Autowired
)
Setter 注入(使用 @Autowired
)
字段注入(使用 @Autowired
)
字段、setter 方法或构造函数注入(使用 @Resource
或 @Inject
)
手动配置:
基于配置文件的注入(XML 配置)
基于 Java 配置的注入(@Configuration
和 @Bean
)