当前位置: 代码迷 >> 综合 >> @Configuration,@Bean,@SpringBootApplication,@ConponentScan等各种注解和SpringBoot特性
  详细解决方案

@Configuration,@Bean,@SpringBootApplication,@ConponentScan等各种注解和SpringBoot特性

热度:60   发布时间:2024-02-06 07:39:37.0

哪些注解是属于Spring的,哪些注解是属于Mybatis的,哪些注解是SpringBoot的?

  • @CrossOrigin @Service @Component @Repository @Controller @RestController @Configuration @Bean等都是Spring提供的注解。
  • @Mapper @MapperScan都是Mybatis提供的注解
  • @Enable xxxx…… @SpringBootApplication 等各种自动化扫描注解 都是SpringBoot提供的强大注解和特性
  • @PostConstruct @PreDestroy @Resources 等这几个是JDK自带的类,具体用法后面会提到

Spring提供的配置类注解@Configuration @Bean(SSM、SpringBoot甚至Servlet都可以用)

在这里插入图片描述

在这里插入图片描述

  1. @Configuration用于定义配置类,==配置类相当于是SSM框架中的spring.xml文件。==比如springboot集成拦截器的时候需要一个拦截器配置类,如下图springboot自定义RedisTemplate类时,只要是需要自动注入Bean对象并Autowired使用的,都要配置类。在这里插入图片描述

  2. @Bean是配合@Configuration一起使用的,用于声明方法返回值的对象是自动注入的,单例的可以@autowired依赖注入(自动注入的对象是单例,但是自己也可以new一个新的该对象,这是所有@autowired的通病,不能限制你自己new对象),相当于是SSM框架中spring.xml的标签,可以将bean对象注入。

  3. 被@Configuration注解所标记的类,也会被注入到Ioc容器中,可以被@Autowired直接调用!并且配置类里面也可以@Autowired注入其他IOC对象

SpringBoot在.yml中获取自定义属性的注解

@ConfiigurationProperties用于将.yml配置文件中自定义的一组属性注入到一个类中
@Value用于将.yml配置文件中自定义的一个属性注入到一个变量中

面试常考的SpringBootApplication启动类上的注解

  • @SpringBootApplication注解,里面包含了很多注解,其中主要的注解有三个!
    1. @ComponentScan 扫描所有的spring注解,例如@Component @Service @Repository @Controller @RestController等 扫描范围是默认扫描范围是启动程序SpringBootApplication. java所在目录及其下的所有子包,如需更改可以在启动类上面手动再添加@ComponentScan注解,自己过滤掉不想扫描的路径和想扫描的路径。

    2. @EnableAutoConfiguration自动扫描启动类路径下的所有配置类,扫描范围和1中一致,所以一般会在包下面再创一个叫config的包,里面的所有类都是配置类,使用了@Configuration注解的配置类会被启动类自动扫描!如下图是常用的手法,在启动类同级里创建Config包
      在这里插入图片描述

    3. @SpringBootConfiguration 继承自@Configuration,两者的功能一致标注当前类是配置类,相当于spring中.xml配置文件。
      这说明启动类本身也是一个配置类,可以用于@Bean注入对象!

SpringBoot发展史

  1. 最开始是基于.xml的Servlet2.0和SSM,需要spring.xml和applicationContext.xml两个配置文件
  2. 后来衍生出了基于配置文件和注解形式的SSM,还是需要上面两个配置文件,但是都用Spring注解进行开发了
  3. Servlet3.0以后 有@Configuration注解,作用是配置注解类!,该注解就相当于创建了一个.xml配置文件,但是此时的流程十分复杂。可参考 https://www.bilibili.com/video/BV1VE411h7aL?p=6 第6P里面的配置方式。
    下面是Servlet3.0基于配置类代替配置文件的开发流程说明:
    • 首先如下图,在config包下创建两个配置类,各自添加@Bean注解 自动注入对象,当然还要扫描所有的@Component组件,不然组件无法加载到Spring的IOC容器中。这两个配置类一个是springmvc的配置类,配置视图解析器等,用@ComponentScan扫描Controller组件。另一个是Spring配置类,配置事务,MySQL连接池,AOP切面,用@ComponentScan用于扫描除了Controller以外的所有Bean组件到Spring容器中
      在这里插入图片描述
    • 其次,我添加了这个配置类,配置类的@ComponentScan注解又扫描了一堆Component组件,但是怎么扫描到配置类本身呢?!需要找一个类似于SpringBootApplication的这种启动类去扫描所有的配置类,如下图自定义一个类继承初始化类!初始化类里面有三个方法,会加载不同的配置类。在这三个重写的方法中用反射来添加自己的配置类名
    在这里插入图片描述
    在这里插入图片描述

SpringBoot/SSM/Java中的各种常用注解相关问题和说明(持续更新)

  1. @Service 写在实现类上面,因为反射本身也是new一个对象,接口没办法new!,然后用@Autowired,==@Autowired注入给接口,而不是实现类。==类似于Interface a=new 实现类(),将实现类自动注入给接口。

  2. 在1中,如果有Service多个实现类的话有两个方法解决
    ①==给@Service注解添加名字,如@Service(“name”),然后使用@Qualifier(“name”)。==具体实现如下图

在这里插入图片描述
②使用@Resource按名字注入,@Resource和@Autowired的作用一模一样,都是自动注入,只不过@Autowired是Spring提供的注解,而@Resource是JDK自带的注解。和①中一样,需要给@Service指定名字,然后@Resource具体用法如下图
在这里插入图片描述
3. 所有@Component @Service @Repository @Controller @Configuration等Spring组件中,才能使用@Autowired依赖注入Spring IOC容器中的对象。在普通类,非Spring IOC的容器类中,是不能注入Spring IOC容器对象的。也就是所有的Spring组件之间可以@Autowired相互注入,所有的非Spring组件中无法注入Spring组件。

  1. 如果某@Component组件里面注入了几个其他的IOC容器,那么该Component组件也需要通过@Autowired自动注入才能调用其他注入进去的组件!(因为@Autowired出来的对象是个单例模式,你自己手动new的实例 和自动注入到IOC里的实例 是完全两个不同的对象,所以单例对象里面注入的IOC实例对象也根本不会到你手动new的对象里去,会抛出空指针异常)

  2. @PostConstruct和@PreDestroy,这两个注解是JDK自带的,十分有用且厉害的注解。@PostConstruct是在构造方法和所有依赖注入以后调用一次这个方法!@PreDestroy是在这个对象销毁以前调用一次这个方法(这一次调用是自动调用的,当然这个方法也可以在其它位置通过手动调用),并且@PostConstruct通常用于解决@Autowired过慢的问题,它的执行顺序是在这里插入图片描述
    如上图,在构造方法调用完毕,并且所有的IOC容器注入完成以后,会调用@PostConstruct方法!

  3. @mapperScan 用于扫描MyBatis中DAO包下的所有DAO接口,常用在SpringBootApplication启动类上。与之对应的还有@Mapper 写在每一个DAO接口上,比较不方便。
    在这里插入图片描述
    注意,如果用的是xml配置方法的话,不仅需要用@MapperScan扫描所有Dao接口,还需要写mapper.xml配置文件,这个配置文件不是通过启动类配置去扫描到的,而是通过.yml扫描,如下图在这里插入图片描述

  4. @EnableFeignClients 是springcloud中用于微服务通讯的Feign注解

  5. @CrossOrigin注解可以解决跨域问题,现在的前后端分离模式基本都要加上@CrossOrigin注解才能通过AJAX请求访问到Controller.该注解可以写在方法上或者类上,作用范围所指不同。
    在这里插入图片描述在这里插入图片描述

  6. 更新……

  相关解决方案