当前位置: 首页 > news >正文

深入剖析 Spring 常用注解:功能与差异的全景洞察

《深入剖析 Spring 常用注解:功能与差异的全景洞察》

在当今的 Java 开发领域,Spring 框架无疑是最广泛使用的框架之一。而在 Spring 中,注解的运用极大地简化了开发流程,提高了代码的可读性和可维护性。本文将深入探讨 Spring 中一些常用的注解,并详细阐述它们之间的区别,通过实际的例子帮助您更好地理解和运用。

一、组件相关注解

1. @Component

@Component 是一个基础且通用的组件注解,用于标识一个普通的 Spring Bean 组件。当 Spring 容器在扫描组件时,会将被 @Component 标注的类实例化为一个 Bean,并纳入 Spring 的管理范围。

例:

@Component
public class CommonComponent {public void commonMethod() {System.out.println("这是一个通用组件的方法");}
}

2. @Service

@Service 注解通常用于标注业务逻辑层的组件,其本质上也是 @Component 的一种特殊形式,用于更明确地强调该类是一个提供业务服务的类。

例:

@Service
public class UserService {public User getUserById(Long id) {// 从数据库或其他数据源获取用户信息return new User();}
}

3. @Repository

@Repository 注解主要用于标注数据访问层(DAO)的组件,例如与数据库进行交互的类。它的使用有助于区分数据访问相关的逻辑。

例:

@Repository
public class UserRepository {@Autowiredprivate JdbcTemplate jdbcTemplate;public User findUserById(Long id) {String sql = "SELECT * FROM users WHERE id =?";return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) -> {User user = new User();user.setId(rs.getLong("id"));user.setName(rs.getString("name"));return user;});}
}

4. @Controller

@Controller 注解用于标注控制层的组件,主要处理用户的请求并返回相应的响应。

例:

@Controller
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/user")public ModelAndView getUser() {User user = userService.getUserById(1L);ModelAndView modelAndView = new ModelAndView("user");modelAndView.addObject("user", user);return modelAndView;}
}

二、依赖注入相关注解

1. @Autowired

@Autowired 注解用于按照类型自动装配依赖的对象。Spring 容器会根据类型在容器中查找匹配的 Bean 并进行注入。

例:

@Service
public class OrderService {@Autowiredprivate OrderRepository orderRepository;public void createOrder(Order order) {orderRepository.save(order);}
}

2. @Resource

@Resource 注解也用于依赖注入,它既可以通过名称也可以通过类型来查找要注入的 Bean。

例:

@Service
public class UserService {@Resource(name = "userRepository")private UserRepository userRepository;public void updateUser(User user) {userRepository.update(user);}
}

三、配置相关注解

1. @Configuration

@Configuration 注解用于标识一个类是配置类,Spring 会将该类中的配置信息进行处理和应用。

例:

@Configuration
public class AppConfig {@Beanpublic DataSource dataSource() {// 配置数据源return new DriverManagerDataSource();}
}

2. @Bean

@Bean 注解在配置类中用于定义一个 Bean,通过方法的返回值来创建和配置 Bean。

例:

@Configuration
public class AppConfig {@Beanpublic UserService userService() {return new UserServiceImpl();}
}

四、切面编程(AOP)相关注解

1. @Aspect

@Aspect 注解用于标识一个类是切面类,该类中可以定义各种切面逻辑。

例:

@Aspect
public class LoggingAspect {// 切面逻辑
}

2. @Before

@Before 注解用于定义在目标方法执行前执行的切面逻辑。

例:

@Before("execution(* com.example.service.*.*(..))")
public void beforeMethod(JoinPoint joinPoint) {System.out.println("在方法执行前:" + joinPoint.getSignature().getName());
}

3. @After

@After 注解用于定义在目标方法执行后执行的切面逻辑。

例:

@After("execution(* com.example.service.*.*(..))")
public void afterMethod(JoinPoint joinPoint) {System.out.println("在方法执行后:" + joinPoint.getSignature().getName());
}

4. @Around

@Around 注解用于定义环绕目标方法执行的切面逻辑,可以灵活地控制目标方法的执行过程。

例:

@Around("execution(* com.example.service.*.*(..))")
public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("环绕前");Object result = joinPoint.proceed();System.out.println("环绕后");return result;
}

五、事务管理相关注解

1. @Transactional

@Transactional 注解用于标识一个方法是事务性的,确保方法内的数据库操作要么全部成功提交,要么全部回滚。

例:

@Service
public class UserServiceImpl implements UserService {@Transactionalpublic void updateUser(User user) {// 更新用户信息// 如果在此过程中出现异常,事务将自动回滚}
}

六、相似注解的区别

!!!相似注解的区别**:

  • @Autowired@Resource
    • @Autowired 主要按照类型进行自动装配,如果存在多个相同类型的 bean ,需要结合 @Qualifier 按名称指定。
    • @Resource 可以按名称或类型装配,若同时指定名称和类型,则优先按名称查找。
  • @Component@Controller@Service@Repository
    • 功能上都是标识组件以便被 Spring 管理,但在分层架构中用于区分不同的层次,具有语义上的差异。
http://www.lryc.cn/news/421378.html

相关文章:

  • 【隐私计算篇】隐私计算使用不当也会泄露原始数据
  • C++第一讲:开篇
  • OceanBase V4.2特性解析:MySQL模式下GIS空间表达式的场景及能力解析
  • HSL模型和HSB模型,和懒人配色的Color Hunt
  • 什么是云原生?(二)
  • pytorch 47 模型剪枝实战|基于torch-pruning库代码对yolov10n模型进行剪枝
  • LeetCode_sql_day15(262.行程与用户)
  • 【MySQL】详解数据库约束、聚合查询和联合查询
  • bug积累
  • 版本控制案例:全球虚拟制片领导者Dimension借助Perforce Helix Core简化多供应商协作,控制访问权限,确保数据资产安全(下)
  • Anaconda配置envs和pcks路径
  • 推荐10个在线搭建框架平台
  • Linux Shell--函数
  • 漏洞复现-CVE-2023-42442:JumpServer未授权访问漏洞
  • 【数据结构之带头双向循环链表的实现】
  • 【docker】docker数据卷与网络部署服务
  • Spring MVC框架学习笔记
  • LeetCode 100道题目和答案(面试必备)(一)
  • OpenGL投影矩阵
  • Linux中的`make`与`Makefile`:项目自动化构建工具
  • GitHub开源项目精选:轻量级预约/预订日历组件,用React和TypeScript构建
  • 闲钱放在哪里?收益稳定且又高!
  • 【Linux】简易线程池项目
  • 基于vue框架的NBA球星管理系统1878g(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • 【docker】Dockerfile练习
  • 数据可视化的魔法:Python Matplotlib库的奇妙之旅
  • Python数据科学的秘密武器:Pandas库的深度解析
  • 云计算实训24——python基本环境搭建、变量和数据类型、数据集合、py脚本
  • 深入了解网络性能监控(NPM):优化网络性能的关键
  • Vue引入使用iconfont字体图标