Spring 必备:常用注解的实例展示、用法详解与功能说明

  1. @Component

    • 示例
      @Component
      public class MyComponent {
          // 组件的功能方法
      }
      
    • 用法:用于将一个普通的Java类标记为Spring容器中的组件。Spring在扫描时会自动发现并实例化这个类,将其作为一个Bean管理。
    • 说明:这是一个通用的注解,是其他如@Service、@Repository和@Controller注解的基础。当组件没有明确的分层归属时,可以使用@Component。
  2. @Service

    • 示例
      @Service
      public class UserService {
          // 用户服务相关的业务方法,如用户注册、登录等
      }
      
    • 用法:用于标记业务逻辑层的类。它可以让开发人员更清晰地识别出哪些类是用于处理业务逻辑的。
    • 说明:在分层架构中,将业务逻辑相关的操作封装在被@Service注解标记的类中,方便进行单元测试和代码维护。
  3. @Repository

    • 示例
      @Repository
      public class UserDaoImpl implements UserDao {
          // 数据库操作方法,如查询用户、插入用户数据等
      }
      
    • 用法:用于数据访问层的类,特别是用于与数据库交互的类。它还可以与Spring的数据访问异常处理机制结合,将底层的数据库异常(如SQLException)转换为Spring的DataAccessException。
    • 说明:这种异常转换使得在业务层处理异常时,可以统一处理数据访问异常,而不需要关心具体的数据库实现细节。
  4. @Controller

    • 示例
      @Controller
      public class UserController {
          @Autowired
          private UserService userService;
          // 处理HTTP请求的方法,如获取用户信息、更新用户等
      }
      
    • 用法:在Spring MVC应用中,用于标记控制器类。这些类处理来自客户端的HTTP请求,将请求映射到具体的处理方法,并返回响应。
    • 说明:控制器类通常会调用业务层的服务来完成请求的处理,并且会根据请求的类型(如GET、POST等)和路径进行方法映射。
  5. @Configuration

    • 示例
      @Configuration
      public class AppConfig {
          @Bean
          public MyBean myBean() {
              return new MyBean();
          }
      }
      
    • 用法:用于定义一个配置类,在这个类中可以通过方法返回值的方式来定义Bean,并且可以使用其他注解来配置Bean的属性等。
    • 说明:可以替代传统的XML配置文件,使得配置更加面向对象和易于维护。配置类中的方法可以返回各种类型的Bean,这些Bean会被注册到Spring容器中。
  6. @Bean

    • 示例
      @Configuration
      public class AppConfig {
          @Bean
          public MyBean myBean() {
              return new MyBean();
          }
      }
      
    • 用法:用于在@Configuration注解的类中定义一个Bean。方法的返回值就是要注册到Spring容器中的Bean对象。
    • 说明:可以对Bean的创建过程进行更精细的控制,例如可以在方法中进行参数设置、依赖注入等操作。
  7. @Autowired

    • 示例
      @Service
      public class UserService {
          @Autowired
          private UserDao userDao;
          // 使用userDao进行业务操作
      }
      
    • 用法:用于自动装配Bean。Spring容器会根据类型自动将合适的Bean注入到带有@Autowired注解的字段、方法或构造函数参数中。
    • 说明:如果有多个相同类型的Bean,可能会导致歧义。此时可以结合@Qualifier注解来指定具体要注入的Bean。
  8. @Qualifier

    • 示例
      @Service
      public class UserService {
          @Autowired
          @Qualifier("userDaoImpl1")
          private UserDao userDao;
          // 使用userDao进行业务操作
      }
      
    • 用法:当存在多个相同类型的Bean时,用于指定要注入的具体Bean。通常与@Autowired一起使用。
    • 说明:可以通过指定Bean的名称或者自定义的限定符来明确需要注入的Bean。
  9. @Resource

    • 示例
      @Service
      public class UserService {
          @Resource(name = "userDaoImpl1")
          private UserDao userDao;
          // 使用userDao进行业务操作
      }
      
    • 用法:它是Java标准的依赖注入注解(来自JSR - 250),也可以用于在Spring中进行Bean的注入。与@Autowired不同的是,@Resource默认是按照名称进行注入的,如果没有指定名称,则按照字段名或属性名进行匹配。
    • 说明:在一些情况下,特别是在整合其他非Spring框架的代码时,@Resource可能会更加方便。
  10. @PostConstruct

  • 示例
    @Component
    public class MyComponent {
        @PostConstruct
        public void init() {
            System.out.println("MyComponent is initialized.");
        }
    }
    
  • 用法:用于标记一个方法,这个方法会在Bean初始化完成后被调用。它可以用于执行一些初始化的操作,如设置默认值、加载资源等。
  • 说明:这种初始化方法的调用是由容器管理的,确保在Bean可以正常使用之前完成必要的初始化工作。
  1. @PreDestroy
  • 示例
    @Component
    public class MyComponent {
        @PreDestroy
        public void cleanUp() {
            System.out.println("MyComponent is about to be destroyed.");
        }
    }
    
  • 用法:与@PostConstruct相对应,用于标记一个方法,这个方法会在Bean被销毁之前被调用。可以用于释放资源、清理缓存等操作。
  • 说明:在容器关闭或者Bean不再需要时,会自动调用这个方法,进行资源的清理工作。
  1. @Value
  • 示例
    @Component
    public class MyComponent {
        @Value("${my.property}")
        private String myProperty;
        // 使用myProperty进行操作
    }
    
  • 用法:用于将外部的值注入到Bean的属性中,这些外部值可以来自配置文件(如application.properties或application.yml)、环境变量等。
  • 说明:可以方便地配置Bean的属性,使得应用的配置更加灵活,不需要修改代码就可以改变应用的行为。
  1. @Scope("singleton")
  • 示例
    @Component
    @Scope("singleton")
    public class MySingletonBean {
        // 单例Bean的内容
    }
    
  • 用法:这是默认的作用域,一个Spring容器中只会存在一个该Bean的实例。用于指定Bean为单例模式。
  • 说明:单例模式可以节省资源,并且在整个应用中保证了对象的一致性。
  1. @Scope("prototype")
  • 示例
    @Component
    @Scope("prototype")
    public class MyPrototypeBean {
        // 原型Bean的内容
    }
    
  • 用法:每次从Spring容器中获取这个Bean时,都会创建一个新的实例。用于指定Bean为原型模式。
  • 说明:在需要为每个请求或者操作创建独立的对象时很有用,比如用于存储用户请求相关的数据。
  1. @ComponentScan
  • 示例
    @Configuration
    @ComponentScan("com.example.myapp")
    public class AppConfig {
        // 配置内容
    }
    
  • 用法:用于指定Spring扫描组件的包路径。Spring会在指定的包及其子包中查找带有@Component、@Service、@Repository和@Controller等注解的类,并将它们注册为Bean。
  • 说明:可以精确地控制Spring扫描的范围,避免扫描不必要的包,提高应用的启动速度。
  1. @EnableAspectJAutoProxy
  • 示例
    @Configuration
    @EnableAspectJAutoProxy
    public class AppConfig {
        // 配置内容
    }
    
  • 用法:开启AspectJ自动代理,用于AOP编程。使得Spring能够自动创建代理对象来实现切面功能。
  • 说明:这是使用AspectJ进行面向切面编程的关键注解,开启后可以方便地在应用中实现横切面的功能,如日志记录、权限验证等。
  1. @Aspect
  • 示例
    @Aspect
    public class LoggingAspect {
        // 切面的方法和切入点定义
    }
    
  • 用法:标记一个类为切面类,用于AOP。在这个类中可以定义各种通知(如@Before、@After等)和切入点(@Pointcut)。
  • 说明:切面类将横切面的功能(如日志记录、事务管理等)集中在一起,提高了代码的可维护性和复用性。
  1. @Before
  • 示例
    @Aspect
    public class LoggingAspect {
        @Before("execution(* com.example.myapp.service.UserService.*(..))")
        public void logBefore(JoinPoint joinPoint) {
            System.out.println("Before method execution: " + joinPoint.getSignature().getName());
        }
    }
    
  • 用法:在AOP中,定义在目标方法执行之前执行的通知。可以在这个通知中进行一些前置操作,如参数验证、日志记录等。
  • 说明:切入点表达式(如execution(* com.example.myapp.service.UserService.*(..)))用于确定哪些方法应用这个通知。
  1. @After
  • 示例
    @Aspect
    public class LoggingAspect {
        @After("execution(* com.example.myapp.service.UserService.*(..))")
        public void logAfter(JoinPoint joinPoint) {
            System.out.println("After method execution: " + joinPoint.getSignature().getName());
        }
    }
    
  • 用法:在目标方法执行之后执行的通知。可以用于清理资源、记录方法执行时间等操作。
  • 说明:不管目标方法是否抛出异常,@After通知都会执行。
  1. @AfterReturning
  • 示例
    @Aspect
    public class LoggingAspect {
        @AfterReturning(pointcut = "execution(* com.example.myapp.service.UserService.*(..))", returning = "result")
        public void logAfterReturning(JoinPoint joinPoint, Object result) {
            System.out.println("After returning from method: " + joinPoint.getSignature().getName() + ", result: " + result);
        }
    }
    
  • 用法:在目标方法正常返回后执行的通知。可以对返回值进行处理或者记录。
  • 说明:如果目标方法抛出异常,这个通知不会执行。
  1. @AfterThrowing
  • 示例
    @Aspect
    public class LoggingAspect {
        @AfterThrowing(pointcut = "execution(* com.example.myapp.service.UserService.*(..))", throwing = "ex")
        public void logAfterThrowing(JoinPoint joinPoint, Exception ex) {
            System.out.println("After throwing an exception from method: " + joinPoint.getSignature().getName() + ", exception: " + ex.getMessage());
        }
    }
    
  • 用法:在目标方法抛出异常后执行的通知。可以用于记录异常信息、进行异常处理或者通知监控系统。
  • 说明:只有当目标方法抛出异常时,这个通知才会执行。
  1. @Around
  • 示例
    @Aspect
    public class LoggingAspect {
        @Around("execution(* com.example.myapp.service.UserService.*(..))")
        public Object logAround(ProceedingJoinPoint pjp) throws Throwable {
            System.out.println("Before around method execution: " + pjp.getSignature().getName());
            Object result = pjp.proceed();
            System.out.println("After around method execution: " + pjp.getSignature().getName());
            return result;
        }
    }
    
  • 用法:环绕通知,可在目标方法执行前后进行自定义操作。可以控制目标方法是否执行,以及对执行结果进行修改等。
  • 说明:是最强大的AOP通知类型,通过ProceedingJoinPoint可以完全控制目标方法的执行过程。
  1. @Pointcut
  • 示例
    @Aspect
    public class LoggingAspect {
        @Pointcut("execution(* com.example.myapp.service.UserService.*(..))")
        public void userServiceMethods() {}
        @Before("userServiceMethods()")
        public void logBefore(JoinPoint joinPoint) {
            System.out.println("Before method execution: " + joinPoint.getSignature().getName());
        }
    }
    
  • 用法:在AOP中定义切入点表达式,用于确定哪些方法应用通知。可以将切入点表达式提取出来作为一个方法,方便复用。
  • 说明:提高了AOP代码的可读性和可维护性,避免了在多个通知中重复编写相同的切入点表达式。
  1. @Lazy
  • 示例
    @Component
    @Lazy
    public class MyLazyBean {
        // 懒加载Bean的内容
    }
    
  • 用法:延迟加载Bean,只有在第一次使用时才创建。适用于一些资源消耗较大或者初始化时间较长的Bean。
  • 说明:可以优化应用的启动时间,避免在应用启动时就初始化所有的Bean。
  1. @DependsOn
  • 示例
    @Component
    @DependsOn("anotherBean")
    public class MyBean {
        // 依赖于anotherBean的Bean内容
    }
    
  • 用法:定义Bean的依赖关系,指定当前Bean依赖的其他Bean。可以确保依赖的Bean在当前Bean之前被初始化。
  • 说明:在复杂的Bean依赖关系中,用于控制Bean的初始化顺序。
  1. @Primary
  • 示例
    @Component
    @Primary
    public class MyPrimaryBean implements MyInterface {
        // 实现MyInterface的主要Bean内容
    }
    
  • 用法:当有多个相同类型的Bean时,优先选择被标记为@Primary的Bean进行注入。
  • 说明:在存在多个候选Bean的情况下,为自动注入提供了一个默认的选择。
  1. @Order
  • 示例
    @Aspect
    @Order(1)
    public class LoggingAspect {
        // 切面的内容
    }
    
  • 用法:用于定义Bean的加载顺序或AOP通知的执行顺序。数字越小,优先级越高。
  • 说明:在多个切面或者多个相同类型的Bean存在顺序依赖关系时很有用。
  1. @Profile("profileName")
  • 示例
    @Component
    @Profile("dev")
    public class MyDevComponent {
        // 仅在dev环境下创建的Bean内容
    }
    
  • 用法:根据指定的环境配置文件(profile)来决定是否创建Bean。可以用于在不同的环境(如开发、测试、生产)下加载不同的组件。
  • 说明:通过激活不同的profile,可以灵活地切换应用的配置和行为。
  1. @Conditional
  • 示例
    @Configuration
    public class AppConfig {
        @Bean
        @Conditional(MyCustomCondition.class)
        public MyBean myBean() {
            return new MyBean();
        }
    }
    
  • 用法:根据特定条件来决定是否创建Bean,可自定义条件。条件类需要实现Condition接口。
  • 说明:提供了一种灵活的方式来根据应用的状态或者环境来控制Bean的创建。
  1. @Import
  • 示例
    @Configuration
    @Import(AnotherConfig.class)
    public class AppConfig {
        // 配置内容
    }
    
  • 用法:用于导入其他配置类或组件。可以将多个配置类整合在一起。
  • 说明:方便了配置的模块化,使得配置类可以根据功能或者模块进行拆分和组合。
posted @ 2024-12-25 09:46  软件职业规划  阅读(19)  评论(0编辑  收藏  举报