首页 > 编程语言 >java中的注解

java中的注解

时间:2022-11-23 23:55:41浏览次数:40  
标签:事务 调用 java Propagation Bean 注解 方法

一、Spring 中的常见注解。

1、声明 Bean 的注解。

  • @Component:该注解是一个泛化概念,仅仅表示一个组件对象(Bean),没有明确的角色。
  • @Repository:该注解用于数据访问层(DAO)的类标识符为Bean,即注解数据访问层Bean,其功能与@Component()相同。
  • @Service:该注解用于标注一个业务逻辑组件类(service层),其功能与Component()相同。
  • @Controller:该注解用于标注一个控制器组件类(Spring MVC 的Controller),其功能与Component()相同。
  • @RunWith(SpringJUnit4ClassRunner.class):用于指定junit运行环境,spring提供了org.springframework.test.context.junit4.SpringJUnit4ClassRunner作为Junit测试环境。
  • @ContextConfiguration("classpath:applicationContext.xml"):该注解指定创建容器时使用的配置文件。
  • @Configuration:用于定义配置类。
  • @Component-Scan(basePackages = {"dao","service"}):配置扫描包。
  • @PropertySource(value={classpath:jdbc.properties},ignoreResourceNotFound=true):可配置一个或多个配置文件。多个配置的Value:value={classpath:jdbc.properties,"xxx","xxx"}

2、注入Bean的注解。

  • @Autowired:默认按照Bean的类型进行自动装配。该注解可以对类或成员变量、方法及构造方法进行标注,完成自动装配的工作。
  • @Resource:该注解默认按照名称进行装配。当找不到与名称匹配的Bean时才会按照类型来装配注入。该注解有name(实例名称)、type(实例类型)两个属性。
  • @Qualify:该注解与@Autowired配合使用。当@Autowired需要按照名称来装配注入时,Bean的实例名称由@Qualify中的参数指定。

3、声明方法的注解。

  • @Override:被标注的方法重载了父类的方法。
  • @PostConstruct:该注解在对象被创建后调用标注的方法。可用作初始化。
  • @PreDestroy:该注解在对象销之前调用标注的方法。
  • @Test:可对被标注的方法进行单元测试。
  • @Bean:在方法上使用@Bean注解,方法就会创建一个Bean对象交给Spring管理,且产生这个bean对象的方法在整个spring的生命周期中只会被调用一次,调用完成之后spring会将这个bean对象放在自己的ioc容器中。

    @Bean(initMethod="initService',destroyMethod="destroyService"):@Bean注解的initMethod和destroyMethod属性可对Bean进行初始化和销毁。构造方法之后、销毁之前执行。

4、声明参数的注解。

  • @Value:该注解将参数指定的值动态注入到 Bean 中。@Value("xxx")、@Value("${jdbc.xxx}')等。

5、AspectJ注解。

  • @Aspect:用于定义一个切面,注解在切面类上。
  • @Pointcut:用于定义切入点表达式。在使用时,需要定义一个切入点的方法,该方法是一个返回值为viod,且方法体为空的普通方法。
  • @Before:用于定义前置通知,目标方法运行之前调用。在使用时,通常为其指定Value属性值,该值可以是已有的切入点,也可以直接定义切入点表达式。
  • AfterReturning:用于定义后置返回通知。在目标方法运行之后调用,如果出现异常则不会调用。使用时同上。
  • @Around:用于定义环绕通知。在目标方法运行之前和运行之后都调用。
  • @AfterThrowing:用于定义异常通知。如果出现异常,就会调用。使用时同上,另外还有一个Throwwing属性用于访问目标方法抛出的异常,该属性值与异常通知方法中同名的形参一致。
  • @After:用于定义后置(最终)通知。在目标方法运行之后调用(无论是否出现异常都会调用)。

6、基于@Transactional注解的声明式事务管理。

  • @EnableTransactionManagement:在配置类上开启声明事务的支持,同事为数据源添加事务管理器。
  • @Transactional:可以作用在接口、接口方法、类以及类方法上,但不建议使用在接口或接口方法上,因为只有在使用基于接口的代理时它才会生效。当作用于类上时,该类下的所有public方法都将具有该类型的事务属性,同时,也可以在方法级别使用该注解来覆盖类级别的定义 。

  @Transactional的属性:

  propagation:定义了事务的生命周期,主要有以下选项:

  1. Propagation.REQUIRED:需要事务支持的方法A被调用时,没有事务新建一个事务。当在方法A中调用另一个方法B时,方法B将使用相同的事务。如果方法B发生异常需要数据回滚时,整个事务数据回滚。
  2. Propagation.REQUIRED_NEW:对于方法A和B,无论是否有事务都会开启一个新的事务;方法B有异常不会导致方法A回滚。
  3. Propagation.NESTED:和Propagation.REQUIRED_NEW类似,仅支持JDBC,不支持JPA或Hibernate。
  4. Propagation.SUPPORTS:方法调用时有事务就使用事务,没有事务就不创建事务。
  5. Propagation.SUPPORTED:强制方法在十五中执行,若有事务i,在方法调用到结束阶段事务都将会被挂起。
  6. Propagation.NEVER:强制方法不在事务中执行,若有事务则抛出异常。
  7. Propagation.MANDATORY:强制方法在事务中执行,若无事务则抛出异常。

  isolation(事务隔离):决定了事务的完整性,处理再多事务对相同数据下的处理机制,主要包括以下隔离级别(前提是当前数据库是否支持):

  1. Isolation.READ_UNCOMMITTED:对于在事务A中修改了一条记录但没有提交的事务,在事务B中可以读取到修改后的记录。可导致脏读、不可重复读以及幻读。
  2. Isolation.READ_COMMITTED:只有当在事务A中修改了一条记录且提交事务后,事务B才可以读取到提交后的记录,防止脏读,但可能导致不可重复读和幻读。
  3. Isolation.REPEATABLE_REDA:不仅能实现Isolation.READ_COMMITTED的功能,而且还能阻止当 事务A读取了一条记录,事务B将不允许修改该条记录;阻止脏读和不可重复读,但可出现幻读。
  4. Isolation.SERIALIZABLE:此级别下事务是顺序执行的,可以避免上述级别缺陷,但开销较大。
  5. Isolation.DEFAULT:使用当前数据库的默认隔离级别。如Oracle和SQL Server是READ_COMMITTED;MySQL是REPEATABLE_READ。

  timeout:指定事务过期时间,默认为当前数据库的事务过期时间。

  readOnly:指定当前事务是否是只读事务。

  rollbackFor:指定哪个或那些异常可以引起事务回滚(Class对象数组,必须继承自Throwable)。

    捕获异常打方法如下:

  1. 修改@Transactional注解:@Transactional(rollbackFor={Exception.class})指定回滚生效的异常类,多个异常类逗号分隔。
  2. 在catch语句中添加“throw new RuntimeException();”语句。

   注意:在实际工程应用中,在catch语句中添加“TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();”语句即可。不需要在@Transactional注解中添加rollbackFor属性。

  rollbackForClassName:指定哪个或那些异常可以引起事务回滚(类名数组,必须继承自Throwable)。

  noRollBackFor:指定哪个或那些异常不可以引起事务回滚(Class对象数组,必须继承自Throwable)。

  NoRollbackForClassName:指定哪个或那些异常不可以引起事务回滚(类名数组,必须继承自Throwable)。

 

标签:事务,调用,java,Propagation,Bean,注解,方法
From: https://www.cnblogs.com/sfwu/p/16918876.html

相关文章

  • java8新特性
    什么是函数式(Functional)接口只包含一个抽象方法的接口,称为函数式接口。你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个受检异常(即:非运行时异常),那么......
  • @NotBlank @NotNull @NotEmpty三个注解的区别
    @NotBlank字符串不能为null和空字符串""@NotNull字符串不能为null@NotEmpty集合类型集合长度不能为0在写参数校验类的时候遇到的注解 ......
  • java-IO流之字符流
    字符流由于字节流操作中文不是特别的方便,所以Java就提供字符流字符流=字节流+编码表中文的字节存储方式用字节流复制文本文件时,文本文件也会有中文,但是没有问......
  • Java实体类为什么需要序列化和反序列化
    最近在学习做微服务的项目,在参考他人的微服务项目时,发现数据库表所对应的实体类都会实现Serializable接口,以往做的项目中并没有遇到过,也没有实现过这个接口,所以好奇实体类......
  • Spring--注解开发+依赖注入
    自动装配数据层:业务层:自动装配:结果:若是将自动装配的注解放在set函数处:结果:结果相同,若是将set方法去掉的话:结果:这样的话,set方法也得到解放了耶!以上都是按照类型装......
  • Java动态编译
    https://www.cnblogs.com/newAndHui/p/14918955.htmlpackageutils;importjavax.tools.*;importjava.io.ByteArrayOutputStream;importjava.io.IOException;impor......
  • Head First Java 读书笔记 18章
    第18章:远程部署RMI(分布式计算)什么是RMI?即RemoteMethodInvocation,远程方法调用技术。截止目前,我们学习到的Java方法调用,都是发生在相同堆上的两个对象之间。即对象......
  • javascript-代码随想录训练营day8
    344.反转字符串题目链接:https://leetcode.cn/problems/reverse-string/题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。......
  • MD5加密工具类-Java
    importjava.math.BigInteger;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;/***@authorycjstart*@create2022-11-23......
  • java后端JVM面试资料
    目录 JDK,JRE,JVM三者的区别与联系讲⼀讲JVM跨平台与跨语⾔JVM的运⾏时数据区有哪些?什么是堆内存?堆内存包含哪些部分?什么是内存溢出什么是内存泄漏?与内存溢出有什......