首页 > 其他分享 >Spring 必备:常用注解的实例展示、用法详解与功能说明

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

时间:2024-12-25 09:56:47浏览次数:9  
标签:示例 Spring public Bean 详解 注解 用法 class

  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 {
        // 配置内容
    }
    
  • 用法:用于导入其他配置类或组件。可以将多个配置类整合在一起。
  • 说明:方便了配置的模块化,使得配置类可以根据功能或者模块进行拆分和组合。

标签:示例,Spring,public,Bean,详解,注解,用法,class
From: https://www.cnblogs.com/java-note/p/18629453

相关文章

  • 【Java教程】Day4-14 面向对象编程(OOP): Classpath详解与Jar包使用指南
    在Java编程中,我们经常接触到classpath这一概念。虽然很多文章讨论了如何设置classpath,但其中大部分并不完全准确。在这篇文章中,我们将深入探讨classpath的作用、如何正确配置它、以及如何使用jar包来管理Java项目。  1.什么是Classpath?Classpath是JVM(Java虚拟机)用来查找......
  • Java 开发之关键注解详细汇总
    一、JDK自带的基本注解@Override作用:用于标识方法重写。它告诉编译器这个方法是重写父类中的方法,如果父类没有这个方法或者方法签名不匹配,编译器会报错。示例:classParent{publicvoidprint(){System.out.println("Parentprint");}}classChilde......
  • 【Java基础面试题046】Java中的注解原理是什么?
    注解其实就是一个标记,是一种提供元数据的机制,用于给代码添加说明信息。可以标记在类上、方法上、属性上等,标记自身也可以设置一些值。注解本身不影响程序的逻辑执行,但可以通过工具或框架来利用这些信息进行特定的处理,如代码生成、编译时检查、运行时处理等。扩展知识自定义......
  • Python 列表(详解)
     列表列表的特点:有序,可重复,长度可变(增删改查),异构,可切片,可遍历。列表的基本语法:列表名=[元素]list=['apple','banana','pineapple']列表的作⽤是⼀次性存储多个数据,并且列表可以存储不同类型的数据一:列表的增删改查:增加:append():增加指定数据到列表中names=['1',......
  • springboot学生选课系统(代码+数据库+LW)
    摘 要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对学生选课信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用学生选课系统可以有效管理,使信息......
  • springboot社团管理系统(代码+数据库+LW)
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了社团管理系统的开发全过程。通过分析社团管理系统管理的不足,创建了一个计算机管理社团管理系统的方案。文章介绍了社团管理系统的系统分析部分,包括可行性分析等,系统设计部分......
  • 经典区间线段树详解:从原理到实践
    线段树(SegmentTree)是一种非常高效的树形数据结构,用于解决区间查询和修改问题。本文将通过分步骤讲解,带领读者熟练掌握线段树的原理与实现,并探索其应用场景。引言:数组区间修改问题在一些经典问题中,比如给定一个数组,频繁地需要进行以下操作:区间查询:查询数组某一子区间内的最大......
  • 基于Springboot的数码产品抢购系统
    博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实实在在的写点程序。......
  • Java设计模式 —— 【结构型模式】组合模式(透明组合模式、安全组合模式)详解
    文章目录一、概述二、结构三、案例实现四、安全组合模式五、优缺点一、概述组合模式又名整体-部分模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形......
  • 【附源码】springboot 大学生兼职平台设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......