java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring Boot常用注解

Spring Boot常用注解有哪些?一文搞懂@Controller等核心注解用法

作者:仲夏那片海

还在为Spring注解记不住而烦恼吗?本文为你梳理了Spring开发中最常用的核心注解,包括@Controller、@RequestMapping、@Autowired等,覆盖Web层、业务层、数据层和AOP,助你快速掌握Spring注解的用法和场景

@Controller

解释:

@RequestMapping

解释:

@GetMapping、@PostMapping等组合注解

解释:

@ResponseBody

解释:

   @Controller
   @RequestMapping("/api/user")
   public class UserApiController {
       @GetMapping("/{id}")
       @ResponseBody
       public User getUserById(@PathVariable("id") Long id) {
           // 根据id查询用户
           User user = userService.getUserById(id);
           return user;
       }
   }

这个方法返回一个User对象,Spring 会将其转换为 JSON 格式(假设配置了 Jackson)发送给客户端。

@PathVariable

解释:

   @Controller
   @RequestMapping("/product")
   public class ProductController {
       @GetMapping("/{productId}")
       public String getProduct(@PathVariable("productId") Long id) {
           // 根据产品id查询产品信息
           Product product = productService.getProductById(id);
           // 处理产品信息并返回视图
           return "productDetails";
       }
   }

@RequestParam

解释:

   @Controller
   @RequestMapping("/search")
   public class SearchController {
       @GetMapping
       public String search(@RequestParam("keyword") String keyword) {
           // 根据关键字进行搜索
           List<Product> products = productService.searchProducts(keyword);
           // 处理搜索结果并返回视图
           return "searchResults";
       }
   }

上述代码中,search方法获取名为keyword的请求参数,用于执行产品搜索。

如果请求中没有keyword参数,会抛出异常,除非设置为非必需参数。

@Autowired

解释:

@Controller
public class OrderController {
    @Autowired
    private OrderService orderService;
    // 处理订单相关的方法
}

@Service

解释:

@Service
public class UserService {
    public User getUserById(Long id) {
        // 从数据库或其他数据源获取用户的逻辑
        return userRepository.findById(id).orElse(null);
    }
}

这里UserService类提供了获取用户的业务逻辑,并且可以被注入到其他组件中使用。

@Repository

解释:

   @Repository
   public class UserRepositoryImpl implements UserRepository {
       @Autowired
       private JdbcTemplate jdbcTemplate;
       public User findById(Long id) {
           // 使用JdbcTemplate从数据库查询用户的逻辑
           String sql = "SELECT * FROM users WHERE id =?";
           User user = jdbcTemplate.queryForObject(sql, new Object[]{id}, new UserRowMapper());
           return user;
       }
   }

这个UserRepositoryImpl类实现了数据访问的逻辑,通过JdbcTemplate从数据库中查询用户信息,并且可以被UserService等上层组件注入和使用。

@ComponentScan

解释:

   @Configuration
   @ComponentScan("com.example.myapp")
   public class AppConfig {
       // 可以在这里添加其他配置方法
   }

上述配置会扫描com.example.myapp及其子包下的所有组件,并将它们注册到 Spring 容器中。

@Configuration

解释:

   @Configuration
   public class DatabaseConfig {
       @Bean
       public DataSource dataSource() {
           // 配置数据源的逻辑,如返回一个DruidDataSource实例
           DruidDataSource dataSource = new DruidDataSource();
           dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
           dataSource.setUsername("root");
           dataSource.setPassword("password");
           return dataSource;
       }
   }

这个DatabaseConfig类是一个配置类,其中dataSource方法定义了一个DataSource类型的 Bean,Spring

会将这个方法返回的对象注册到容器中作为一个 Bean。

@Qualifier

解释:

@Configuration
public class AppConfig {
    @Bean("dataSource1")
    public DataSource dataSource1() {
        // 配置第一个数据源的逻辑
        return new DruidDataSource();
    }
    @Bean("dataSource2")
    public DataSource dataSource2() {
        // 配置第二个数据源的逻辑
        return new HikariDataSource();
    }
    @Service
    public class UserService {
        @Autowired
        @Qualifier("dataSource1")
        private DataSource dataSource;
        // 使用指定的数据源进行用户相关的业务逻辑
    }
}

在UserService中,通过@Qualifier(“dataSource1”)指定要注入的是名为dataSource1的数据源。

@ExceptionHandler

解释:

   @Controller
   public class MyController {
       @RequestMapping("/operation")
       public String doOperation() {
           // 可能抛出异常的操作
           throw new MyBusinessException("业务操作出错");
       }
       @ExceptionHandler(MyBusinessException.class)
       public String handleBusinessException(MyBusinessException ex) {
           // 处理业务异常,如记录日志、返回错误页面等
           return "errorPage";
       }
   }

当doOperation方法抛出MyBusinessException时,handleBusinessException方法会被调用,返回errorPage视图给客户端。

@InitBinder

解释:

   @Controller
   public class MyController {
       @InitBinder
       public void initBinder(WebDataBinder binder) {
           binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy - MM - dd"), true));
       }
       @RequestMapping("/date")
       public String processDate(Date date) {
           // 处理日期参数的逻辑
           return "success";
       }
   }

这里initBinder方法注册了一个自定义的日期编辑器,用于将请求中的日期字符串按照yyyy - MM - dd的格式转换为Date类型,以便正确地绑定到processDate方法的Date参数上。

@Before、@After、@Around等 AOP 通知注解

解释:

//After示例:
@Aspect
@Component
public class ResourceCleanupAspect {
    @After("execution(* com.example.dao..*.*(..))")
    public void cleanUpAfter(JoinPoint joinPoint) {
        System.out.println("方法执行后进行资源清理");
        // 可以在这里进行数据库连接关闭、文件流关闭等资源清理操作
    }
}

//@Around
@Aspect
@Component
public class TransactionAspect {
    @Around("execution(* com.example.service..*.*(..))")
    public Object manageTransaction(ProceedingJoinPoint pjp) throws Throwable {
        try {
            // 开启事务
            System.out.println("开启事务");
            Object result = pjp.proceed();
            // 提交事务
            System.out.println("提交事务");
            return result;
        } catch (Exception e) {
            // 回滚事务
            System.out.println("回滚事务");
            throw e;
        }
    }
}

在这个TransactionAspect的@Around示例中,在目标服务方法执行前开启事务,方法执行后根据情况提交或回滚事务,实现了事务管理的 AOP 切面。

@Profile

解释:

@Configuration
@Profile("dev")
public class DevDatabaseConfig {
    @Bean
    public DataSource dataSource() {
        // 配置开发环境下的数据源,如使用本地数据库
        return new DruidDataSource();
    }
}

@Transactional

解释:

@Service
public class AccountService {
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
    public void transferMoney(Account from, Account to, BigDecimal amount) {
        from.setBalance(from.getBalance().subtract(amount));
        to.setBalance(to.getBalance().add(amount));
        accountRepository.save(from);
        accountRepository.save(to);
    }
}

@Valid和@Validated

解释:

@Controller
public class UserController {
    @RequestMapping("/user")
    public String addUser(@Valid User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return "userForm";
        }
        userService.addUser(user);
        return "success";
    }
}

这里@Valid用于验证User对象的参数。如果验证不通过,BindingResult会包含错误信息,然后可以根据这些信息返回错误页面。

@Service
@Validated
public class UserService {
    public void addUser(@Validated(AddUserGroup.class) User user) {
        // 添加用户的逻辑
    }
}

假设定义了AddUserGroup验证分组,@Validated(AddUserGroup.class)用于按照这个分组的验证规则来验证User对象。

@Value

解释:

@Component
public class MyComponent {
    @Value("${myapp.config.key}")
    private String configValue;
    // 可以在方法中使用configValue
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文