Bootstrap

spring web项目中常用的注解

@Controller

解释:用于标记一个类是 Spring MVC 中的控制器。控制器负责处理 HTTP 请求并返回响应。它是 Spring Web 应用程序中处理用户请求的核心组件。

@RequestMapping

解释:用于将 HTTP 请求映射到控制器的处理方法上。它可以应用在类级别和方法级别。在类级别上,它定义了一个基本的请求路径前缀,在方法级别上,它定义了具体的请求路径和请求方法(如 GET、POST 等)。

@GetMapping、@PostMapping等组合注解

解释:这些是@RequestMapping的变体。@GetMapping用于处理 HTTP GET 请求,@PostMapping用于处理 HTTP POST 请求,还有@PutMapping(处理 PUT 请求)、@DeleteMapping(处理 DELETE 请求)等。它们使代码更加简洁,提高了可读性。

@ResponseBody

解释:用于将控制器方法返回的对象转换为 HTTP 响应体。通常用于返回 JSON 数据等非视图相关的内容。当一个方法被标注了@ResponseBody,Spring 会使用合适的消息转换器(如 Jackson)将返回对象转换为 JSON 或其他格式发送给客户端。

   @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

解释:用于从请求路径中获取参数值。当请求路径中有变量部分时,如/user/{id},可以使用@PathVariable来获取{id}的值并将其作为方法参数。

   @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

解释:用于自动装配 Spring 管理的 Bean。它可以应用在字段、构造函数或方法上。Spring 会根据类型自动查找并注入匹配的 Bean 实例。

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

@Service

解释:用于标注业务逻辑层(Service 层)的类。它是一个构造型(stereotype)注解,将一个类标记为 Spring 容器中的一个 Bean,主要用于实现业务逻辑。被标注的类可以被其他组件(如控制器)通过@Autowired等方式进行注入和使用。

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

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

@Repository

解释:用于标注数据访问层(DAO 层)的类,它也是一个构造型注解。通常用于对数据库或其他持久化存储进行操作的类。它的主要作用是将数据访问层的类标记为 Spring 容器中的 Bean,并且可以处理一些与数据访问相关的异常转换(如将原生的持久化异常转换为 Spring 的DataAccessException体系)。

   @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

解释:用于指定 Spring 应该扫描哪些包来查找组件(如@Controller、@Service、@Repository等标注的类)。它通常在配置类(用@Configuration标注)中使用,可以自动发现和注册 Bean 到 Spring 容器中,减少了手动配置 Bean 的工作量。

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

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

@Configuration

解释:用于标记一个类为 Spring 的配置类。在这个类中可以定义 Bean、导入其他配置类、设置属性源等。它可以替代传统的 XML 配置文件,通过 Java 代码的方式来配置 Spring 容器。

   @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

解释:当有多个相同类型的 Bean 存在于 Spring 容器中时,@Qualifier用于指定要注入的具体 Bean。它与@Autowired一起使用,通过名称来区分不同的 Bean。

@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

解释:用于在控制器类中统一处理异常。当控制器方法抛出指定类型的异常时,被@ExceptionHandler标注的方法会被调用,用于返回合适的响应给客户端,如返回错误信息页面或者错误 JSON 数据等。

   @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

解释:用于在控制器中自定义数据绑定。可以用于注册自定义的属性编辑器(Property Editor)或者格式化器(Formatter),对请求参数进行转换和格式化,以便正确地绑定到控制器方法的参数上。

   @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 通知注解

解释:

  • @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

解释:用于根据不同的环境配置(如开发环境、测试环境、生产环境)来加载不同的 Bean 或者配置。可以将 Bean 或者配置类标记为特定的环境配置文件相关。在运行时,可以通过设置活动的环境配置文件(如通过spring.profiles.active属性)来决定启用哪些被@Profile标注的组件。

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

@Transactional

解释:用于在方法或类级别上声明事务。当应用在方法上时,该方法的执行会被包含在一个事务中;当应用在类级别上时,类中的所有公共方法都会被包含在事务中。可以设置事务的属性,如传播行为(Propagation)、隔离级别(Isolation)、超时时间(Timeout)和是否只读(Read - only)等。

@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

解释:
@Valid:这是 Java Bean Validation(JSR 303)规范中的注解,用于标记一个方法参数或返回值应该被验证。它通常和验证注解(如@NotNull、@Size等)一起使用,用于对请求参数进行验证。Spring MVC 会自动检测被@Valid标注的参数,并触发验证逻辑。
@Validated:这是 Spring 提供的注解,它是@Valid的增强版。除了支持 JSR 303 验证外,还支持 Spring 特有的验证分组功能。可以通过定义不同的验证分组来对同一对象在不同场景下进行有针对性的验证。

@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

解释:用于注入外部配置的值,如属性文件中的配置项或者环境变量的值。它可以直接注入基本数据类型(如String、int、boolean等)的值到 Bean 的字段或者方法参数中。

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