🏆 作者简介:hh_hua,从0到1
🏆《头衔》:CDSN优秀文章收藏者、CSDN从不评论者
🏆《近期荣誉》:妈妈说我是个好孩子
🏆《博客内容》:从nothing到everything
🏆🎉欢迎 👍点赞✍评论⭐收藏
如有不足,请多多指教!!!
文章目录
🚀什么是注解?
🔎官方解释
注解(Annotation)是代码级别的说明,它是JDK 1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。注解是Java语言中的一种元数据形式,它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明。
🔎我的理解
官方的话总是那么官方,让人难以琢磨不透。简单理解:注解就是一种标签,根据相应的标签起着对应的作用。举例而言,“国民男神”标签就对应着帅气多金、有才华等属性。@Override注解着对应该方法是否继承自父类。
🔎注解的本质,即注解是如何实现特定的功能呢?
注解的本质:Java接口,自动继承java.lang.annotation.Annotation
接口。当我们使用注解时,编译器会在编译后的字节码中生成相应的注解信息,并在运行时通过反射机制获取信息并处理。
举例而言,Spring中的@Autowired
注解用于依赖注入。当Spring容器初始化时,会扫描所有的Bean,通过反射机制查找标注了@Autowired
的字段或方法,并注入相应的依赖对象。(详见:Spring源码注解篇一:注解的本质与工作原理)
🔎注解与注释的区别
两者表现形式不一致: 注解是以@xxx的方式呈现,而注释则是 //(单行注解)、/* /(多行注解)、/* */(文档注释)
两者目的不一致: 注解是给程序看,注释给人看。即注解的目的是让程序本身明白要完成什么,而注释则是让人知道某段代码做了什么。
🚀Spring的常见注解
🔎简单回顾Spring
Spring两大核心功能:IOC(控制反转)和AOP(面向切面),两者皆是思想和规范。
IOC容器就是管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系,其管理的对象被称为组件,其中包括JavaBean、Service、Repository等等。那么如何它们加载到容器中?则通过Spring注解方式或者Spring XML配置方式。(悄咪咪地告诉你:xml和注解最佳结合:xml用来管理bean,注解只负责完成属性的注入)
AOP是对某一类事情的集中处理, 其核心思想是将那些与业务逻辑无关, 但是被多处业务逻辑模块共享的代码(比如判断用户登录, 日志管理, 权限检查, 事务管理等)抽取出来集中处理, 这样开发者可以将更多的精力放在处理核心业务逻辑上。
🔎1.声明bean的注解
声明bean: 告诉spring,将该类交给spring管理。
@Component:将一个 Java 类标识为 Spring 的组件(Bean),从而使得任何一个普通的 Java 类可以享受到 Spring 提供的各种依赖注入、自动装配、AOP 等特性。
@Service :用于标记服务层(Service),表明该类是一个服务层组件,需要被扫描并加入到 Spring 容器中。
@Repository:用于标记持久层(DAO),表明该类与数据库相关,需要被扫描并加入到 Spring 容器中。
@Controller: 用于标记控制层(Controller),表明是 MVC 架构中的控制器组件,需要被扫描并加入到 Spring 容器中。
总结:@Service、@Service、@Controller
是@Component
注解衍生出来,用于表示不同类型的Bean,更加细粒度管理和控制应用程序中的组件。
🔎2.注入bean的注解
注入bean: 将依赖关系自动注入到类,用于自动装配一个类的成员变量、构造函数或者方法,以实现依赖注入(Dependency Injection)。
@Autowired:默认按照(byType)进行bean匹配。如果有多个类型一样的 Bean 候选者,需要配合 @Qualifier
按照(byName)进行装配。指定名称后,如果 Spring IOC 容器中没有对应的组件 bean 抛出 NoSuchBeanDefinitionException。也可以将该注解属性 required 配置为 false,找不到相应 bean 的时候,系统不再抛异常。
@Inject:是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合 @Named
。
@Resource:默认按照(byName)方式进行自动装配,找不到再按byType 去匹配。如果有多个类型一样的 Bean 候选者,则可以通过 name 属性指定进行注入。
注意事项:
- 如果指定了 name 或者 type 则根据指定的类型去匹配 bean。
- 如果指定了 name 和 type则根据指定的 name 和 type 去匹配 bean,任何一个不匹配都会报错。
🔎3.java配置类相关注解
配置类: 被@Configuration
注解修饰的类,其目的是扩展Bean的一种机制。
@Bean:用于将对象存入spring的ioc容器中,同@Service、@Service、@Controller、@Component
等注解都是负责将对象存入容器当中,区别在于@Bean
是用在方法上,将当前方法的返回值对象放到容器当中,而后者则是用在类上面的,然后将当前类通过无参构造函数创建对象然后放入容器。
@Configuration:声明一个类为配置类,用于取代bean.xml配置文件注册bean对象。
@ComponentScan:告诉 Spring 在指定的包或类路径下进行组件扫描,然后自动将被扫描到的组件注册到 Spring 容器中。
🔎4.切面(AOP)相关注解
@Aspect :把当前类标识为一个切面类
@After :后置通知, 在目标方法(切入点)执行之后执行一些代码
@Before :前置通知, 在目标方法(切入点)执行之前执行一些代码
@Around :环绕通知,在目标方法执行前后分别执行一些代码,类似拦截器,可以控制目标方法是否继续执行。通常用于统计方法耗时,参数校验等等操作。
@PointCut :切入点声明,即切入到哪些目标类的目标方法。既可以用 execution 切点表达式, 也可以是 annotation 指定拦截拥有指定注解的方法。
🔎5.@Bean的属性支持
@Scope :用来配置Bean实例的作用域对象
属性 | 范围 |
---|---|
singleton | 全局有且仅有一个实例 |
prototype | 每次获取Bean的时候会有一个新的实例 |
reqeust | 每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTPrequest内有效 |
session | 每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效 |
🔎6.@Value注解
@Value:可以用来将外部的值动态注入到 Bean 中,在 @Value 注解中,可以使${} 与 #{}
区别如下:
@Value(“${}”):可以获取对应属性文件中定义的属性值。
@Value(“#{}”):表示 SpEl 表达式通常用来获取 bean 的属性,或者调用 bean 的某个方法。
Spring中的@Value注解详解
🔎7.环境切换
@Profile:指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件。
@Conditional:通过实现Condition接口,并重写matches方法,从而决定该bean是否被实例化。
🔎8.异步相关
@EnableAsync:表明配置类中通过此注解开启对异步任务的支持
@Async:在实际执行的bean方法使用该注解来声明其是一个异步任务
总结:@EnableAsync
作用于类上所有方法或某个方法,@Async
作用于方法上
🔎9.定时任务相关
@EnableScheduling:在配置类上使用,开启计划任务的支持,作用于类上。
@Scheduled:表示这是个任务,具有cron,fixDelay,fixRate等类型。(方法上,需先开启计划任务的支持)
🔎10.@EnableXXX注解说明
以下注解用来开启对XXX的支持
@EnableAspectAutoProxy:开启对AspectJ自动代理的支持
@EnableAsync:开启异步方法的支持
@EnableScheduling:开启计划任务的支持
@EnableWebMvc:开启web MVC的配置支持
@EnableConfigurationProperties:开启对@ConfigurationProperties注解配置Bean的支持
@EnableJpaRepositories:开启对SpringData JPA Repository的支持
@EnableTransactionManagement:开启注解式事务的支持
@EnableCaching:开启注解式的缓存支持
🔎11.测试相关注解
@RunWith:用于指定测试类运行时要使用的测试运行器。JUnit默认的测试运行器是BlockJUnit4ClassRunner,它用于运行JUnit 4风格的测试类。
@ContextConfiguration:用来加载配置配置文件
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:/*.xml"})
public class CDPlayerTest {
}
@ContextConfiguration这个注解通常与@RunWith(SpringJUnit4ClassRunner.class)联合使用用来测试。
@ContextConfiguration括号里的locations = {“classpath*:/*.xml”}就表示将classpath路径里所有的xml文件都包括进来,自动扫描的bean就可以拿到,此时就可以在测试类中使用@Autowired注解来获取之前自动扫描包下的所有bean。
🔎使用说明
使用注解,必须开启注解的支持!!!
<context:component-scan base-package="com.guo"></context:component-scan> <context:annotation-config/>
🚀小结
不要重复造轮子,我们要在轮子上造车!不要仅停留在使用框架上,要学会开发框架!!!
如有不足,请多多指教!!!