前言
在当今的软件开发领域,Spring框架已经成为了Java开发中不可或缺的重要工具之一。其优秀的设计和丰富的功能使得开发者能够更加高效地构建出稳健、可扩展的企业级应用程序。而Spring框架的注解机制,则是其灵活性和便捷性的重要体现之一。
本文将深入探讨Spring框架中常用的注解,分析其功能和用法,并结合实例进行详细说明。通过学习和理解这些注解,读者将能够更好地利用Spring框架的强大功能,提高自己的开发效率和代码质量。
1.组件扫描和声明相关的注解
@Component:通用组件注解表明是受spring管理的组件。
三个Component的按三层架构分类的三个衍生注解(功能完全相同):
@Controller:控制层
@Service:业务层
@Repository:数据层
2.依赖注入相关注解:
@Autowried:按类型自动装配bean,底层使用了暴力反射,没有setter方法也可以注入
@Qualifier:配合Autowried使用,如果多个该类型的bean,使用该注解声明名称注入
@Primary:配合AutoWried使用,如果多个该类型的bean,声明本注解的bean为主要的bean
@Resource:自动装配,按照名称注入,名称不存在按照类型注入
下面说说二者之间的差异:
实现方式不同:上述已经讲解注入的类型
兼容性:
@Autowired
:是 Spring 提供的注解,依赖于 Spring 框架,对 Java EE 平台没有依赖。@Resource
:是 Java EE 规范提供的注解,在 Java EE 平台上具有更好的兼容性,但也可以在 Spring 中使用。
3.配置相关注解:
@Configuration:定义该类是一个配置类,代替了xml的配置文件。
@Bean:用于管理第三方bean,主要用于将第三方库或外部组件集成到 Spring 应用程序中。
原理:
当 Spring 应用启动时,Ioc容器会扫描所有的配置类,识别其中的 @Bean 注解,并根据这些注解定义的方法来创建对应的 Bean。主要是原理还是反射来创建配置类的对象,在反射@Bean注解的方法,然后将方法的返回值的对象注册为bean,从而完成 Bean 的定义和加载过程。
@ComponentScan:扫描@Component配置的bean,扫描到了就注册到Ioc容器,参数为扫描路径。
@Import:实现组件化开发,用来在 Spring 配置类中引入其他配置类或普通类,并将其中声明的 Bean 导入到当前配置类中。
@EnableAspectJAutoProxy:告诉 Spring 启用基于注解的 AOP 支持
@Conditional:可以根据条件动态地决定某个 Bean 是否被创建,从而实现配置的灵活性。
@Lazy: 声明bean是否延时加载。1.在配置类注解上配置类中所有的 @Bean 方法,2.在@Bean方法上,表示第三方延时加载,3.在@Compoent组件上,表明该组件是一个延时加载bean
延时加载bean:bean的延时加载就是使用到bean的时候再去加载
非延时加载bean:在 Spring 容器启动时会立即进行实例化和初始化,无论是否在应用中被使用。这意味着当 Spring 容器启动时,非延迟加载的 Bean 将被创建,并准备好在需要时立即使用。
@PropertySource:
- 用于指定外部属性文件的位置。
- 可以通过
value
属性指定属性文件的路径。 - 在属性文件中定义的属性可以通过
@Value
注解注入到 Bean 的属性中。
4.配置注入相关的注解
@Value
: 注入属性值,通常从配置文件中读取。
5.Aop相关的注解、
作用:在不惊动原始设计的基础上做功能增强。这就是spring的无侵入式编程。
@Aspect
: 声明一个切面。@Pointcut
: 定义一个切入点。
@Pointcut("execution(* com.example.UserService.*(..))")定义一个切入点表达式@Before
: 在方法执行前执行通知。@AfterReturning
: 在方法执行后返回结果后执行通知。@AfterThrowing
: 在方法抛出异常后执行通知。@Around
: 包围一个方法的通知
这个是五大通知中最重要的方法,可以动态的声明在方法执行前还是执行后
public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("环绕通知前");Object ret = pjp.proceed();System.out.println("环绕通知后");return ret;
}
AOP的主要原理:
动态代理,获取bean是代理对象的时候,会根据代理对象的运行模式,运行原始方法与增加的内容完成操作。
6.Web相关注解:
@Controller
: 标识一个类为MVC控制器。@RequestMapping
: 映射HTTP请求到处理方法。@ResponseBody
: 将方法的返回值直接写入HTTP响应体中。@PathVariable
: 获取请求路径中的参数值。@RequestParam
: 获取请求参数的值。@ResponseStatus
: 设置HTTP响应的状态码和原因
7.事务相关的注解
@Transactional
: 声明一个方法或类为事务性操作。
@EnableTransactionManagement
: 启用 Spring 的事务管理功能。
@ReadOnly
: 声明一个方法是只读的,即不会修改数据库中的数据,可用于优化性能。
@Propagation
: 用于定义事务的传播行为,包括REQUIRED
、SUPPORTS
、MANDATORY
、REQUIRES_NEW
、NOT_SUPPORTED
、NEVER
和NESTED
。@Propagation.REQUIRED
: 指定方法必须在一个事务中执行,如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。@Propagation.REQUIRES_NEW
: 指定方法必须在一个新的事务中执行,如果当前存在事务,则挂起该事务。
总结
Spring框架中的注解为开发者提供了一种便捷、灵活的编程方式,大大简化了开发过程。通过本文的介绍,我们了解了各种功能分类下的常用注解,包括依赖注入、组件扫描与声明、配置、属性注入、AOP、Web等方面的注解,并通过实例进行了详细讲解。
掌握Spring框架中的注解,可以使开发者更加轻松地实现各种功能,提高代码的可读性和可维护性。希望本文能够对读者在Spring框架的学习和应用中起到一定的指导作用,为他们的项目开发提供帮助和启发。