SpringBoot中常用注解

一些面试常问到且实际开发中常用的注解

@Bean 常在配置类中使用,比如SpringBoot中的启动类,启动类本身也是配置类,或@Configuration(配置类),注解的作用是将一个方法的返回值声明为一个 Spring Bean,Spring 会在运行时将该方法的返回值添加到 Spring 容器中。默认用的方法名,注意:如果方法名是大写的,那么该对象在Spring容器中的引用也会大写

也可以通过@Bean("xxx")来指定bean的引用名

@Component:让Spring容器管理的通用注解

@Controller:让Spring容器管理,表示控制层

@RestController:相当于@ResponseBody+@Controller 表示该类交给Spring管理,且该类是控制层,返回前端指定的数据格式,一般是JSON数据

@Service:让Spring容器管理,表示业务层

@Mapper:Mybatis框架的注解,@Mapper注解的类会被Mybatis扫描,生成对应的Mapper代理对象

这里注意:

在使用SpringBoot和Mybatis时,@Mapper和@Repository都可以用于标记持久层接口,其主要区别在于:

@Mapper是Mybatis框架提供的注解,用于标记持久层接口,并且由Mybatis框架通过MapperProxyFactory来生成该接口的代理对象。代理对象会自动实现该接口,执行接口方法时会调用Mybatis底层的SqlSession执行对应的SQL语句。

@Repository是Spring框架提供的注解,用于标记数据访问层(持久层)组件。如果将@Repository注解用于持久层接口,则该接口的代理对象会由Spring框架通过JDK动态代理来创建。Spring会根据接口定义动态生成代理类,并将对接口方法的调用委托给SqlSessionTemplate执行对应的SQL语句。

一直记得有次demo里在控制器使用自定义AOP报错问题

结果就是这个原因

Spring 5.x中AOP默认依旧使用JDK动态代理

SpringBoot 2.x开始,为了解决使用JDK动态代理可能导致的类型转换异常,而使用CGLIB。

在SpringBoot 2.x中,如果需要替换使用JDK动态代理可以通过配置项spring.aop.proxy-target-class=false来进行修改,proxyTargetClass配置已无效.SpringBoot默认用的是CGLIB

JDK代理:

        要求:目标对象必须实现接口

        代理对象也必须实现目标对象的接口

        目标对象/代理关系:目标对象与代理对象兄弟关系

CGLIB代理:

        要求:不管目标对象是否有接口,都可以为其创建代理对象

        代理要求:要求代理对象必须继承目标对象

        目标对象/代理关系:目标对象与代理对象是父子关系

CGLib所创建的动态代理对象在实际运行时候的性能要比JDK动态代理高不少,有研究表明,大概要高10倍;

但是CGLib在创建对象的时候所花费的时间却比JDK动态代理要多很多,有研究表明,大概有8倍的差距;
 

JDK代理有个限制,就是使用动态代理的目标对象必须实现一个或多个接口.如果想代理没有实现接口的类.就可以使用CGLib代理

CGLib代理可以在运行期扩展Java类与实现Java接口.广泛在AOP框架中使用

关于Spring AOP的注解  下面两张图当时用的Spring   并不是SpringBoot

在SpringBoot中使用AOP只需要切面@Aspect

 @Aspect 表示是个切面

@EnableScheduling:用于启动类或配置类起开定时任务

@Scheduled:开启定时任务,注意了解cron表达式.

@EnableAsync:用于启动类或配置类开启异步任务的支持

@Async:用于标记一个方法是异步执行的任务

@ControllerAdvice:用于SpringBoot中定义处理全局异常处理器

@ResponseBody:在response的body中返回前端指定的数据格式

@Autowired:Spring框架的注解----自动注入

@Resource:J2EE的注解,也用于自动注入

部分区别:

@Autowired 默认是按照类型(byType)进行自动装配(更详细的自己查找,没记住.....)

@Resource 默认是按照名称(byName)进行自动装配

在使用@Autowired或@Resource注解时,当容器中存在多个类型一致的Bean时,会产生歧义,此时需要使用@Qualifier注解来指定具体要注入的Bean对象。@Qualifier注解可以结合@Autowired或@Resource指定要注入的Bean的名称

@Value注解一般用于在一个被Spring管理的类中,自动注入application.properties或yaml   yml文件用法@Value("${my.custom.property}"),另外也可以${java.home}读取系统属性

注意即使该类不被Spring管理  @Value注解会在该类被实例化时候自动赋值

@ImportResource一般和配置类@Configuration在一起用:注解用于将外部XML配置文件中定义的Bean导入到Spring的配置中。它用于加载外部XML文件中的Spring Bean定义,将这些Bean定义注册到Spring IOC容器中

@ConfigurationProperties:一般和@Configuration一起使用,将属性绑定到一个配置类中,通过prefix指定前缀(用个什么词好呢,想不出来)

@PropertySource:用于指定属性文件的位置,并将属性文件的内容加载到Spring环境中,默认情况下只能读.properties后缀格式的文件.可以通过PropertySourceFactory来实现读取.yml  .yaml文件

需要自定义个类继承PropertySourceFactory重写方法,使用该注解时,指定factory

关于@ConfigurationProperties,@Configuration,@PropertySource配合使用的一个例子

SpringBoot读取properties中配置的List集合_springboot properties list_biubiubiu0706的博客-CSDN博客

事务注解:@Transactional

DataSourceTransactionManager

在Spring Boot中使用@Transactional注解时,不需要在启动类上添加@EnableTransactionManager注解,因为在spring-boot-starter-data-jpa、spring-boot-starter-jdbc等starter中已经自动集成了事务管理器(transaction manager)并进行了配置,可以直接使用@Transactional注解。

如果你使用的不是Spring Boot提供的starter,或者是自己手动配置的事务管理器,那么在启动类上添加@EnableTransactionManager注解是需要的。

猜你喜欢

转载自blog.csdn.net/tiantiantbtb/article/details/129819032