Spring Boot中一些注解的使用

1、@SpringBootApplication注解

@SpringBootApplication是一个复合注解,包括

@ComponentScan

@SpringBootConfiguration

@EnableAutoConfiguration。


@SpringBootConfiguration,继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到Spring容器中,并且实例名就是方法名。


@EnableAutoConfiguration,其作用启动自动配置,
@EnableAutoConfiguration,注解意思就是Springboot根据你添加的jar包来配置你项目的默认配置,比如根据spring-boot-starter-web ,来判断你的项目是否需要添加了webmvc和tomcat,就会自动的帮你配置web项目中所需要的默认配置。


@ComponentScan,扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。是以前的<context:component-scan>(以前使用在xml中使用的标签,用来扫描包配置的平行支持)。


@SpringBootApplication只会扫描@SpringBootApplication注解标记类包下及其子包的类(特定注解标记,比如@Controller,@Service,@Component,@Configuration和@Bean注解等等)纳入到spring容器。
@SpringBootApplication(scanBasePackages = "com.*.*"),指定扫描路径:我们需要将一个对象排除在spring容器中,以使用@SpringBootApplication的另外二个参数(exclude或excludeName)例如@SpringBootApplication(excludeName = {"com.*.*.*.People"})

2、@EnableJpaRepositories

@EnableJpaRepositories注解用于Spring JPA的代码配置,用于取代xml形式的配置文件

@EnableJpaRepositories的参数解析

  • repositoryFactoryBeanClass 指定Repository的工厂类
  • basePackage 用于配置扫描Repositories所在的package及子package。简单配置中的配置则等同于此项配置值,
  • basePackages可以配置为单个字符串,也可以配置为字符串数组形式。
  • repositoryFactoryBeanClass 指定Repository的工厂类
@SpringBootConfiguration
@EnableJpaRepositories(repositoryFactoryBeanClass = CustomRepositoryFactoryBean.class, basePackages = "com.zxk")
public class Config {}

3、@NoRepositoryBean

在CustomRepository上添加@NoRepositoryBean标注,这样Spring Data Jpa在启动时就不会去实例化BaseRepository这个接口。每个实体类有需要实现的相同的方法,就可以单独抽取出来,放在一个公共的接口CustomRepository中,并这个类继承了Jpa的相关Repository接口或类,由CustomRepository接口来衔接Jpa的相关操作,其他实体类需要实现的操作就直接继承CustomRepository接口,不用每次都去继承Jpa的相关接口或类,所以这个公共接口就需要这个注解@NoRepositoryBean来标识。

@NoRepositoryBean
@Transactional(readOnly=true)
public interface CustomRepository<T, ID extends Serializable> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
    List<Object[]> listBySQL(String sql);
    List<Object[]> listByHQL(String hql);
    
    @Transactional
    public void updateBySql(String sql, Object...args);
    @Transactional
    public void updateByHql(String hql, Object...args);
}

4、@Transactional

@Transactional 是声明式事务管理编程中使用的注解
添加位置:接口实现类或接口实现方法上,而不是接口类中
访问权限:public 的方法才起作用,@Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。 
@Transactional 注解的属性信息

  • name              当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器。
  • propagation    事务的传播行为,默认值为 REQUIRED。
  • isolation          事务的隔离度,默认值采用 DEFAULT。
  • timeout           事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务。
  • read-only        指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
  • rollback-for     用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。
  • no-rollback-for    抛出 no-rollback-for 指定的异常类型,不回滚事务。

Spring 的注解方式的事务实现机制
在应用系统调用声明@Transactional 的目标方法时,Spring Framework 默认使用 AOP 代理,
在代码运行时生成一个代理对象,根据@Transactional 的属性配置信息,这个代理对象决定该声明@Transactional 的目标方法是否由拦截器 TransactionInterceptor 来使用拦截,在 TransactionInterceptor 拦截时,会在在目标方法开始执行之前创建并加入事务,并执行目标方法的逻辑, 最后根据执行情况是否出现异常,利用抽象事务管理器AbstractPlatformTransactionManager 操作数据源 DataSource 提交或回滚事务
 正确的设置@Transactional 的 propagation 属性需要注意下面三种 propagation 可以不启动事务。本来期望目标方法进行事务管理,但若是错误的配置这三种 propagation,事务将不会发生回滚。

  • TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

正确的设置@Transactional 的 rollbackFor 属性
默认情况下,如果在事务中抛出了未检查异常(继承自 RuntimeException 的异常)或者 Error,则 Spring 将回滚事务;除此之外,Spring 不会回滚事务。
如果在事务中抛出其他类型的异常,并期望 Spring 能够回滚事务,可以指定 rollbackFor。例:
@Transactional(propagation= Propagation.REQUIRED,rollbackFor= MyException.class)
通过分析 Spring源码可以知道,若在目标方法中抛出的异常是 rollbackFor 指定的异常的子类,事务同样会回滚。

5、@Autowired

@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,它可以结合@Qualifier注解一起使用。
@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired,并且只按照byType注入。

6、@Resource

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。
@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

7、@Bean

8、@Component

@component (把普通pojo实例化到spring容器中,相当于配置文件中的 <bean id="" class=""/>)泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。

9、@Configuration

@Configuration 注解本质上还是 @Component,因此 <context:component-scan/> 或者 @ComponentScan都能处理@Configuration注解的类。
@Configuration 标记的类必须符合下面的要求:

  • 配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib 动态代理)。
  • 配置类不能是 final 类(没法动态代理)。
  • 配置注解通常为了通过 @Bean 注解生成 Spring 容器管理的类。
  • 配置类必须是非本地的(即不能在方法中声明,不能是 private)。
  • 任何嵌套配置类都必须声明为static。

@Bean 方法可能不会反过来创建进一步的配置类(也就是返回的 bean 如果带有 @Configuration,也不会被特殊处理,只会作为普通的 bean)。
Spring 容器在启动时,会加载默认的一些 PostPRocessor,其中就有 ConfigurationClassPostProcessor,
这个后置处理程序专门处理带有 @Configuration 注解的类,
这个程序会在 bean 定义加载完成后,在 bean 初始化前进行处理。主要处理的过程就是使用 cglib 动态代理增强类,而且是对其中带有 @Bean 注解的方法进行处理。
@Component 注解并没有通过 cglib 来代理@Bean 方法的调用

猜你喜欢

转载自blog.csdn.net/zxk082829/article/details/89739093
今日推荐