zoukankan      html  css  js  c++  java
  • Spring

    前言

    模式注解(Stereotype Annotations)是一种用于声明在应用中扮演"组件"角色的注解。如 Spring Framework 中的 @Component, @Service, @Controller, @Repository 等。只要在相应的类上标注这些注解,就能成为 Spring 中组件(Bean)。


    1、模式注解

    1.1、常见的模式注解

    Spring Framework 注解 场景说明 起始版本
    @Component 通用组件模式注解 2.5
    @Controller 控制器模式注解 2.5
    @Service 服务模式注解 2.5
    @Repository 数据仓储模式注解 2.0
    @Configuration 配置类模式注解 3.0

    不同的模式注解虽然功能相同,但因其代表含义的不同可以将将服务的清晰分层表示。

    1.2、@Component

    • @Component注解的作用是把一个组件/类/bean加入IOC容器并实例化。
    @Component
    public class Bannner {
    
    }
    

    1.3、@Service、@Controller、@Repository

    • @Component最初spring框架设计的,后来为了标识不同代码层,衍生出@Controller,Service,Repository三个注解 作用相当于配置文件的bean标签,被注解的类,Spring始化时,就会创建该对象。
    • @Controller,表示为 WEB 控制层 ,处理各种 HTTP 交互。
    • @Service,表示为内部服务层 ,处理内部服务各种逻辑。
    • @Repository,表示为数据控制层,代表数据库增删改查动作。

    1.4、@Configuration

    • @Configuration,用于定义配置类,替换xml配置文件,可以将注解的类内部多个被@Bean注解的方法构建Bean定义加入Spring容器。

    2、Spring的注入方式

    @Component,@Service,@Controller,@Repository标记类生成Bean,而Spring通过DI(依赖注入)实现IOC(控制反转)常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的属性注入。

    2.1、属性注入

    /**
     * @Autowired 属性/字段注入
     * @Autowired是自动注入,自动从spring的上下文找到合适的bean来注入
     */
    @Autowired
    public Bannner banner;
    

    2.2、构造注入

    /**
     * 构造注入
     * @param banner
     */
    public BannerController(Bannner banner) {
        this.banner = banner;
    }
    

    2.3、setter注入

    /**
     * setter注入
     * @param banner
     */
    @Autowired
    public void setBanner(Bannner banner) {
        this.banner = banner;
    }
    

    3、@Autowired 的注入方式

    @Autowired注解是一个用于容器(container)配置的注解,与它同属容器配置的注解还有:@Required,@Primary, @Qualifier等等。Autowire意为自动装配,Spring自动装配提供一种加载机制 - 将Bean自动加载到IOC容器里,和我们需要使用Bean的类组装在一起使用。

    3.1、@Autowired - 被动注入 - byType

    @Autowired默认注入方式是按类型注入,根据类型查找Bean,查找结果为一个时直接注入,多个时报错,适用于只有一个Bean实现了接口的情况。

    public class TestController {
    
    	@Autowired
        private TestInter testInter;
    
        @GetMapping(value = "/test")
        public void test(){
            testInter.sayHello();
        }
    }
    
    public interface TestInter {
        void sayHello();
    }
    
    @Component
    public class TestOne implements TestInter {
        @Override
        public void sayHello() {
            System.out.println("Hello TestOne");
        }
    }
    
    • 此时接口访问结果为:
      在这里插入图片描述

    3.2、@Autowired - 被动注入 - byName

    在按类型注入失败的情况下,会按字段的名字(byName)推断注入哪个Bean。

    • 此时再加入一个TestInter的实现类来测试
    @Component
    public class TestTwo implements TestInter {
        @Override
        public void sayHello() {
            System.out.println("Hello TestTwo");
        }
    }
    
    • @Autowired根据类型查找Bean结果多个时报错。
      在这里插入图片描述
    • 将代码修改为byName按字段名字注入:
    @Autowired
    private TestInter testOne;
    
    • 此时接口访问结果为:
      在这里插入图片描述

    3.3、@Autowired - 主动注入

    当按类型与按字段名匹配没有找到确定的Bean,通过@Qualifier("") 指定注入的bean

    @Autowired
    @Qualifier("testTwo")
    private TestInter testInter;
    
    • 此时接口访问结果为:
      在这里插入图片描述
    - End -
    梦想是咸鱼
    关注一下吧
    以上为本篇文章的主要内容,希望大家多提意见,如果喜欢记得点个推荐哦
    作者:Maggieq8324
    本文版权归作者和博客园共有,欢迎转载,转载时保留原作者和文章地址即可。
  • 相关阅读:
    RabbitMQ(四)
    RabbitMQ(三)
    RabbitMQ(二)
    定位
    响应式布局
    学习前端的一些心得
    css样式大全
    常用标签
    HTML
    app 被拒绝原因
  • 原文地址:https://www.cnblogs.com/maggieq8324/p/15115724.html
Copyright © 2011-2022 走看看