又一次考核,又一次觉得自己啥都不会。这次学长问我了一些学了但是没记住的问题。
一、@Autowired 与@Resource的区别:
@Autowired是属于spring的注解,需要导入包org.springframework.beans.factory.annotation.Autowired。而@Resource是属于J2EE的,需要导入包javax.annotation.Resource。
@Autowired 是根据 类型 (byType)注入的 , 然后当找到type类型的bean时,如果发现有不唯一,会再去根据name去找bean注入(可以通过起名字后用@Qualifire(“name”)的方式绑定)
@Resource 默认是 根据 名字(byName)注入的 ,先根据名字查找byName,要是bean容器里没有该名字的@Service,那么就默认把名字首字母小写作为名字,然后就根据byType类型去找。我们可以绑定Service名字直接@Resource(“name”)
因为@Autowired是属于第三方spring的,@Resource是属于java的,使用@Resource可以减少与spring的耦合。
二、springboot中bean的方式
1.使用@Component,@Service,@Controler,@Repository,@Service等注解
2.使用@Bean注解配合@Configuration注解
@Bean作用在方法上面,通常可以将该方法的返回值作为Bean注入到spring的容器中,每个bean都有一个name值,在Configuration里面,@Bean的name就是方法名
3.使用注解@Import,也会创建对象并注入容器中
4.使用ImportSelector或者ImportBeanDefinitionRegistrar接口,配合@Import实现。
5.手动注入Bean容器,有些场景下需要代码动态注入,以上方式都不适用。这时就需要创建 对象手动注入。通过DefaultListableBeanFactory注入。
三、springboot的事务注解
首先要开启事务管理,在启动类上加上注解@EnableTransactionManagement。SpringBoot项目会自动配置一个 DataSourceTransactionManager,所以我们只需在方法(或者类)加上 @Transactional 注解,就自动纳入 Spring 的事务管理了
注解的详细用法:
1.指定回滚
@Transactional(rollbackFor=Exception.class) //出现该异常会回滚
2.指定不回滚
@Transactional(noRollbackFor=Exception.class)//出现该异常不回滚
3.如果有事务,那么加入事务,没有的话新建一个(不写的情况下)
@Transactional(propagation=Propagation.REQUIRED)
4.容器不为这个方法开启事务
@Transactional(propagation=Propagation.NOT_SUPPORTED)
5.不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.REQUIRES_NEW)
6.必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.MANDATORY)
7.必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.NEVER)
8.如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.(外部调用无法使用被调用方法的事务)
9.readOnly=true只读,不能更新,删除
@Transactional (propagation = Propagation.REQUIRED,readOnly=true)
10.设置超时时间
@Transactional (propagation = Propagation.REQUIRED,timeout=30)
11.设置数据库隔离级别
@Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)
关于事务管理器,不管是JPA还是JDBC等都实现自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依赖,框架会默认注入 DataSourceTransactionManager 实例。如果你添加的是 spring-boot-starter-data-jpa 依赖,框架会默认注入 JpaTransactionManager 实例。
springboot使用@Transactional注解失效的场景:springboot使用@Transactional注解失效的场景