Spring和Spring Boot框架通过丰富的注解集简化了Java开发,使得配置更加简洁且易于理解。
下面是一些常用的Spring和Spring Boot注解及其使用方式的简介:
目录
17. @PostConstruct 和 @PreDestroy
概述: @Component
是一个通用的Spring管理的Bean注解。
使用场景: 任何Spring管理的组件都可以使用@Component
,但通常使用其特化注解(如@Service
、@Repository
、@Controller
)来更明确地表达组件的角色。
- @Component
- public class MyComponent {
- public void doSomething() {
- System.out.println("Doing something...");
- }
- }
概述: @Service
是@Component
的特化,专门用于标识服务层的组件。
使用场景: 标识业务逻辑层的组件,表明该类承担业务服务功能。
- @Service
- public class MyService {
- public void performService() {
- System.out.println("Performing service...");
- }
- }
概述: @Repository
是@Component
的特化,通常用于数据访问层。
使用场景: 用于DAO层,表明该类负责数据库操作,并启用自动异常转换。
- @Repository
- public class MyRepository {
- public void save() {
- System.out.println("Saving data...");
- }
- }
概述: @Controller
是@Component
的特化,标识Spring MVC的控制器类。
使用场景: 用于标识控制器类,处理HTTP请求并返回视图。
- @Controller
- public class MyController {
- @GetMapping("/hello")
- @ResponseBody
- public String sayHello() {
- return "Hello, World!";
- }
- }
概述: @RestController
是@Controller
和@ResponseBody
的组合注解。
使用场景: 用于创建RESTful web服务,返回JSON或XML响应。
- @RestController
- public class MyRestController {
- @GetMapping("/greet")
- public String greet() {
- return "Greetings!";
- }
- }
概述: @Autowired
用于自动注入依赖。
使用场景: 在需要依赖注入的地方(构造函数、字段、方法)使用,Spring会自动满足依赖需求。
- @Component
- public class MyComponent {
- private final MyService myService;
-
- @Autowired
- public MyComponent(MyService myService) {
- this.myService = myService;
- }
-
- public void execute() {
- myService.performService();
- }
- }
概述: @Value
用于注入属性值。
使用场景: 注入配置文件中的值或系统环境变量。
- @Component
- public class MyComponent {
- @Value("${my.property}")
- private String myProperty;
-
- public void printProperty() {
- System.out.println("Property value: " + myProperty);
- }
- }
概述: @Configuration
标识配置类,相当于XML配置文件。
使用场景: 定义Bean并进行配置。
- @Configuration
- public class AppConfig {
- @Bean
- public MyService myService() {
- return new MyService();
- }
- }
概述: @Bean
用于定义一个Bean。
使用场景: 在配置类中使用,用于显式声明一个Bean。
- @Configuration
- public class AppConfig {
- @Bean
- public MyService myService() {
- return new MyService();
- }
- }
概述: @SpringBootApplication
是@Configuration
、@EnableAutoConfiguration
和@ComponentScan
的组合注解。
使用场景: 标识Spring Boot主配置类,并启动自动配置和组件扫描。
- @SpringBootApplication
- public class MySpringBootApplication {
- public static void main(String[] args) {
- SpringApplication.run(MySpringBootApplication.class, args);
- }
- }
概述: @EnableAutoConfiguration
让Spring Boot基于类路径中的依赖自动配置Spring应用上下文。
使用场景: 启用自动配置功能,大多数情况下不需要单独使用,因为@SpringBootApplication
已经包含它。
- @Configuration
- @EnableAutoConfiguration
- public class MyAutoConfiguration {
- }
概述: @ComponentScan
用于扫描指定包中的组件。
使用场景: 在配置类中使用,指定要扫描的包路径。
- @Configuration
- @ComponentScan(basePackages = "com.example")
- public class MyComponentScanConfig {
- }
概述: @Conditional
根据条件决定是否实例化一个Bean。
使用场景: 在配置类中使用,配合条件类实现按条件装配。
- @Configuration
- public class ConditionalConfig {
- @Bean
- @Conditional(MyCondition.class)
- public MyService myService() {
- return new MyService();
- }
- }
概述: @Profile
根据环境配置加载特定的Bean。
使用场景: 在开发、测试、生产等不同环境下加载不同的Bean。
- @Configuration
- public class ProfileConfig {
- @Bean
- @Profile("dev")
- public MyService devService() {
- return new MyService("Development Service");
- }
-
- @Bean
- @Profile("prod")
- public MyService prodService() {
- return new MyService("Production Service");
- }
- }
概述: @Scope
定义Bean的作用域(单例、原型等)。
使用场景: 在需要特定作用域的Bean定义中使用。
- @Component
- @Scope("prototype")
- public class MyPrototypeBean {
- // Bean will have prototype scope
- }
概述: @Lazy
指定Bean的延迟初始化。
使用场景: 在需要懒加载的Bean定义中使用,减少启动时间。
- @Component
- @Lazy
- public class MyLazyBean {
- public MyLazyBean() {
- System.out.println("MyLazyBean initialized");
- }
- }
概述: @PostConstruct
和@PreDestroy
分别用于在Bean初始化后和销毁前执行特定方法。
使用场景: 在Bean生命周期的特定点执行自定义逻辑。
- @Component
- public class MyComponent {
- @PostConstruct
- public void init() {
- System.out.println("MyComponent initialized");
- }
-
- @PreDestroy
- public void destroy() {
- System.out.println("MyComponent about to be destroyed");
- }
- }
这些注解在Spring和Spring Boot中有机地结合在一起,形成了一个功能丰富、易于使用的框架体系,极大地简化了Java应用的开发。