前言
分析Spring的常用注解之前,需先了解何为注解?注解是用于给Java代码附加元数据,可在编译或运行时解析并处理这些元数据。注解是一种分散式的元数据,与源代码紧紧绑定。提到注解,就不得不提XML,XML同样也是用于给Java代码附加元数据,也可在编译或运行时解析并处理这些元数据。不同的是XML是一种集中式的元数据,与源代码无绑定。
那么,在Spring开发时为什么更多使用注解而非XML?
首先,注解具有独特的优势:保存在 class 文件中,降低维护成本。 无需工具支持,无需解析。 编译期即可验证正确性,查错容易。 提升开发效率。
其次,XML使用具有一定局限性:需要解析工具或类库的支持,解析XML势必会影响应用程序性能,占用系统资源。 配置文件过多导致管理变得困难。 编译期无法对其配置项的正确性进行验证,或要查错只能在运行期。 IDE无法验证配置项的正确性,查错困难。开发人员需同时维护代码和配置文件,开发效率变得低下。 配置项与代码间存在潜规则,改变了任何一方都有可能影响另外一方。
接下来,我们共同探讨Spring的常用注解及其含义。
一、将类声明成Bean的注解:
@Component:通用的注解,可标注任意类为Spring组件。如果一个 Bean 不知道属于哪个层,可以使用@Component注解标注。
@Repository :对应持久层即DAO层,主要用于数据库相关操作。
@Service :对应业务层,主要涉及一些复杂的逻辑,需要调用DAO层。
@Controller :对应Spring MVC 控制层,主要用户接受用户请求,并调用Service层返回数据给前端页面。
二、基于注解的自动装配:
@Component:声明组件。
@Componentscan:组件扫描。
@Autowired :按类型自动注入,启用自动装配。
@Qualifier:按名称自动注入,不能单独使用,与@Autowired联合使用。
@Primary:标示首选的bean。
@Resource:默认按名称注入,当无法找到与之匹配的名称时转为按类型注入。
@Value:注入数据,只能注入基本类型与String。
三、基于Java代码的显式装配
@Configuration :声明配置类。
@Bean:方法级别注解,声明配置该方法所产生的对象为Spring中的Bean。
四、配置类相关注解
@Import:导入其他配置类。
@ImportResource:导入其他XML配置文件。
@Scope:表示bean的作用域。其设置类型包括:
- singleton (单例模式,一个Spring容器中只有一个Bean实例,默认模式)
- protetype(每次都会创建一个新的Bean实例)
- request (为每个HTTP请求创建一个Bean实例)
- session(为每个HTTP会话创建一个Bean实例)
- application (为每个ServletContext创建一个Bean实例)
- websocket (为每个Websocket 创建一个Bean实例)
@WishlyConfiguration 为@Configuration与@ComponentScan的组合注解,可以替代这两个注解。
五、AOP和AspectJ相关注解
@Aspect:声明切面,作用是把当前类标识为一个切面供容器读取。
@PointCut :声明切点,是植入Advice(通知)的触发条件。
@Around:通知方法会将目标方法封装起来。
@Before:通知方法会在目标方法调用之前执行。
@After:通知方法会在目标方法返回或抛出异常后调用。
@AfterReturning:通知方法会在目标方法返回后调用。
@AfterThrowing:通知方法会在目标方法抛出异常后调用。
六、启用特性的注解:
@Enablescheduling:启用任务调度。
@EnableAspectJAutoProxy :启用AspectJ自动代理。
@EnableSwagger2:开启API文档。
@EnableEncryptableProperties:开启加密。
@EnableTransactionManagement:开启对注解式事务的支持。
@EnableAsync:开启异步任务。
@EnableJpaRepositories:开启对SpringData JPA Repository的支持。
@EnableCaching:开启注解式的缓存支持。
@EnableJpaRepositories:开启对SpringData JPA Repository的支持。
七、其他注解
@PostConstruct:用于指定初始化方法。
@PreDestory:用于指定销毁方法。
@ControllerAdvice:全局数据处理。
@Conditional:条件选择,决定该Bean是否被实例化。
@Profil: 通过设定Environment的ActiveProfiles来设定当前context需要使用的配置环境。
@Async:在实际执行的Bean方法使用该注解来申明其是一个异步任务。
@Scheduled :声明这是一个调度任务。
@Transactional:标注在类或方法上,代表该类或方法都进行事务管理。
@RunWith:运行器,Spring中通常用于对JUnit的支持。
@ContextConfiguration:整合JUnit时,用于指定Spring配置文件的位置。
@PropertySource:加载配置文件,指定properties配置文件的位置。