【Spring注解】更简便的存储Bean

▮全文概述

  • 注解是什么
  • Spring里的五大注解实现自动存Bean
  • 依赖注入相关的注解实现自动取Bean

---------------分----------割-----------线----------------------------------------------------------------------

目录

▮全文概述

▮一、注解

▮二、Spring中的五大注解

▪2.1 注解的作用

▪2.2 五大类注解的作用域

        •@Controller

        •@Service

       •@Repository

        •@Configuration

        •@Component

▮三、Bean的自动存和自动取

▪3.1 自动存

▪3.2 自动取

        •属性注入

        •构造注入

        •Setter注入

        •三种方式的区别

▮后续分支

▪上一节点

▪根节点


多多交流!

---------------分----------割-----------线----------------------------------------------------------------------

▮一、注解

   首先,先要明白,注解不是独属于Spirng的机制,很多地方都有使用注解,比如:@Override,在重写方法时,这个注解表示这是一个重写方法。 所以说,此时能懂得注解是什么了吗?注解就是一种特殊的标记,被它标记上的代码就具有某种特殊的含义。

   注解的格式是:@+首字母大写的单词+参数(有的注解有参数)

在Java中,注解是一种特殊的标记,可以应用于类、方法、字段和其他程序元素上,用于提供额外的信息和指示。注解以@符号开始,后面跟着注解的名称和一对括号,括号中可以包含一些参数。


▮二、Spring中的五大注解

  • @Controller:控制层
  • @Service:服务层
  • @Repository:数据持久层
  • @Configuration:配置层
  • @Component:组件层

   首先要告诉一个好消息:这五个注解的作用基本一致,用法都是一样的,只是叫的不同。这是为什么呢?可以联想到车牌,每个车牌都有一个汉字表示地域。五大注解也是一样的,不同的名字只是说使用的地方不同,作用相同而作用域不同。

   采取这种方式,能便于开发者的区分和理解,开发者一看便知这个被标注的类是做什么的。接下来,我们将对五大注解的作用和作用域进行讲解

▪2.1 注解的作用

   五个注解的作用都是一样的:在类的上头使用,标注这个类为Bean;项目在加载时,Spring就会给这些被标注的类new一个对象保存在Bean容器中。不用再像之前那样,在“spring-config.xml”文件里注册Bean,甚至都不需要这个文件,全由框架自行执行。

//原材料S
@Component
public class S {
    //重量
    private int weight;
    //优劣
    private String superior;

    //构造方法
    public void init(int weight,String superior) {
        this.weight = weight;
        this.superior = superior;
        System.out.println("获取重量为"+weight+"的"+superior+"原材料S");
    }
}
  • 只需要在类的上面标记五大注解中的一个,就能自动new此类的对象装配进Bean容器。 

▪2.2 五大类注解的作用域

        •@Controller

   controller翻译为控制器,如其名,这个注解标注的类就是用来控制整个项目的。不过要注意,这里的“控制”不是指“管理员的控制”,而是指“用户的控制”。比如一个购物网站,用户进行搜索商品,查看商品,购买商品,查看物流等操作都是这个@Controller标注的类所提供的方法。

   下面是一个简单的示例:

@Controller
public class MyController {

    @Autowired
    private MyService service;
    
    @GetMapping("/product_A")
    public void getProduct_A() {
        A product_A1 = service.make();
        system.out.printf("得到一个产品A");
    }
}
  • @Autowired后续会讲,它的作用是自动的将Bean注入到这个引用里
  • @GetMapping的参数是一个URL,用于前端访问后端,当然这是后面会讲的,现在先不管
  • service.make(): 这个方法的作用就是制作一个产品A

   @Controller 是 Spring Framework 中的注解之一,它用于标识一个类是控制器。控制器负责处理用户的请求并返回相应的视图或数据。

        •@Service

   service翻译为服务,被标记的类是来为@Contrller提供服务的,因为@Controller由用户控制,它发出的要求就相当于是用户发出的要求,我们要去提供各种服务以满足用户的要求。

   这是一个承上启下的类,上承@Controller,下接@Repository。因为用户的操作基本上都离不开数据,要通过@Repository去调用数据库里的数据。

  下面是一个简单的示例:

@Service
public class MyService {
    
    @Autowired
    private MyRepository Repository;
    

    // 执行业务逻辑,比如:生产一个产品A,产品A的出货量+1
    public void make {

        //1.生产一个产品A
        new material_S = new S();
        material_S.init(10,"优质");
        new product_A = new A(material_S);

        //2.调用数据库,将产品A的出货量+1
        Repository.add("A");

        //3.返回产品A
        return product_A;
    }
}
  •  @Autowired后续会讲,它的作用是自动的将Bean注入到这个引用里

@Service 是 Spring Framework 中的注解之一,它用于标识一个类是服务层。服务层通常用于封装业务逻辑,处理业务数据,并协调不同的数据访问对象(DAO)进行数据操作。

       •@Repository

   repository翻译为仓库或数据库,被标记的类是来操作数据库的,提供的方法都是用于操作数据库以实现数据持久化的。

   数据持久化,数据只保存在内存时是不持久的,随着项目的关闭就会被释放;想要数据持久,那就要把数据放进磁盘,一般都是放在数据库,这样一来何时何地都能从数据库中访问数据,实现持久保存。

   以下是一个示例:

@Repository
public class Repository {
    
    public void add(String product){
        //执行一个SQL:update product_A set shipment=shipment+1;
    }
}
  •  SQL的意思是:将表product_A的出货量(shipment)+1
  • 具体怎么去实现这条SQL,会在MyBatis里介绍。

数据持久化是指将数据存储在持久化存储介质(如数据库、文件系统等)中,以便在程序运行结束后仍然能够保留数据并进行读取和修改。

   @Repository 是 Spring Framework 中的注解之一,用于标识一个类是数据访问对象(DAO)的实现类。DAO 是用于访问数据库或其他持久化存储介质的对象,它封装了数据访问的逻辑

        •@Configuration

   Configuration翻译为配置,被标记的类是用来给项目配置一些环境的,具体的例子就不给了,因为初学时用的不多,也没必要了解太过清楚。

@Configuration是 Spring Framework 中的注解之一,它用于标识一个类是配置类。配置类用于定义和配置应用程序的各种组件,例如数据源、Bean、拦截器等。

        •@Component

   component翻译为组件。这个注解有些特殊,它是前面四个注解的父注解,如下是@Service的源代码,它的头上有注解@Component。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//@Service里包含了@Component
@Component
public @interface Service {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

   这个时候你能理解“组件”的含义吗,它的含义就是:这个类是要自动添入Bean容器的。当你想让一个类自动加入Bean容器,但搞不懂它的作用域时,就可以打上一个@Component,它的作用域是除之前四种注解之外的所有作用域。

@Component 是 Spring Framework 中的一个注解,用于将一个类标识为一个组件,让 Spring 能够自动扫描和管理这个组件。


▮三、Bean的自动存和自动取

   接下来,就是具体的去进行注解的实操了

▪3.1 自动存

   自动存前面已经说过了,就是把要自动存的类打上五大注解的其一,这样在项目启动时,Spring为自动将被标记的类,new对象加入Bean容器。

@Repository
public class Repository {
    
    public void add(String product){
        //执行一个SQL:update product_A set shipment=shipment+1;
    }
}
  • 注解了Repository,表示是数据持久层
@Service
public class MyService {
    
    @Autowired
    private MyRepository Repository;
    
    // 执行业务逻辑,比如:生产一个产品A,产品A的出货量+1
    public void make {

        //1.生产一个产品A
        new material_S = new S();
        material_S.init(10,"优质");
        new product_A = new A(material_S);

        //2.调用数据库,将产品A的出货量+1
        Repository.add("A");

        //3.返回产品A
        return product_A;
    }
}
  • 得益于MyRepository被注解,所以可以通过@Autowired自动注入对象,而不需要我们去new 
@Controller
public class MyController {

    @Autowired
    private MyService service;
    
    @GetMapping("/product_A")
    public void getProduct_A() {
        A product_A1 = service.make();
        system.out.printf("得到一个产品A");
    }
}
  • 得益于MyService被注解,所以可以通过@Autowired自动注入对象,而不需要我们去new  

▪3.2 自动取

   自动取被称为依赖注入,这里的依赖就是指“所依赖的对象”。

依赖注入(Dependency Injection,简称 DI)是一种设计模式,用于解耦组件之间的依赖关系。在依赖注入中,一个对象不需要自己创建或管理它所依赖的对象,而是通过外部提供的方式将依赖对象注入到它内部。

   所使用的注解,在前面也已经露面了,就是@Autowired,它的作用是:检查Bean容器里有没有对应类的Bean,并将Bean自动注入到引用中。不过有个限制条件:使用@Autowired的类,必须有五大注解之一,它本身必须也要生成Bean。

   讲完使用的要求,接下来我们要学的是@Autowired的三种使用方式,分别是:属性注入,构造注入和Setter注入。

        •属性注入

  属性注入: “属性”指的是类的属性,也就是类里面的变量。在这些变量的头上打上@Autowired,Spring为自动将Bean容器里对应的Bean注入到引用里。

@Autowired
private MyService service;

        •构造注入

   构造注入:构造注入是通过在类的构造函数中接收依赖对象来实现的。在构造注入中,依赖对象通过构造函数的参数传递进来。

@Controller
public class MyController {

    //服务层   
    private MyService service;

    //构造方法
    @Autowired
    public MyController(MyService service){
        this.service = service
    }

    @GetMapping("/product_A")
    public void getProduct_A() {
        A product_A1 = service.make();
        system.out.printf("得到一个产品A");
    }
}

        •Setter注入

   Setter注入:Setter注入是通过类的Setter方法接收依赖对象来实现的。在Setter注入中,依赖对象通过调用Setter方法来设置。

@Controller
public class MyController {

    //服务层
    private MyService service;

    //Setter方法
    @Autowired
    public void setService(MyService service){
        this.service = service;
    }
    
    @GetMapping("/product_A")
    public void getProduct_A() {
        A product_A1 = service.make();
        system.out.printf("得到一个产品A");
    }
}

        •三种方式的区别

      既然有三种方式,那肯定就有各自的优缺点。不过在这我要说一下,个人感觉这些优缺点没有巨大的区别,值得关注的的并不多。在平常写代码,用的最多的就是属性注入,其它两种还真没怎么用过。

  • 这么多优缺点,值得关注的并不多,看一看就行了
  • 只有构造才能注入final变量:因为final在对象创建的时候就要赋值,只有构造注入能做到
  • 构造注入的对象不会被修改

---------------分----------割-----------线----------------------------------------------------------------------

▮后续分支


▪上一节点

   链接:【Spring】Spring是一个loC容器

▪根节点

   链接:【Java】从零开始,学习制作网站

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值