当前位置: 首页 > article >正文

用工厂模式演示springboot三种注入方式 | @Autowired

背景:看了个demo工厂模式,示例代码的工厂类是new出来的,但是实际项目中都是用springboot框架、bean都是会给容器管理的,所以在思考这个工厂类要交给springboot托管要怎么改。以下是总结笔记

依赖注入

        • 1.工厂类用new实现
        • 2.工厂类用springboot容器,依赖注入
        • 3.三种注入方式演示
        • 4.其他总结

思考过程:看不懂工厂 -> 工厂用new -> 想改成bean注入,交给springboot管理

案例里提供两种实现方式:new 转成 依赖注入,交给springboot管理

难点:对依赖注入@Autowired理解不到位

1.工厂类用new实现
工厂模式:直接用new实现的代码
public class StoreFactory {
	 public ICommodity getCommodityService(Integer commodityType) {
	 if (null == commodityType) return null;
	 if (1 == commodityType) return new CouponCommodityService();
	 if (2 == commodityType) return new GoodsCommodityService();
	 if (3 == commodityType) return new CardCommodityService();
	 throw new RuntimeException("不存在的商品服务类型");
	 }
}
2.工厂类用springboot容器,依赖注入

难点:

  1. 不知道怎么把StoreFactory 变成bean :加@Component
  2. StoreFactory 变成bean之后要怎么往里面加入CouponCommodityService、GoodsCommodityService、CardCommodityService这些依赖到的bean:三种方式,@Autowired字段注入,构造器注入,set注入
  3. 压根不知道@Autowired还能标注在方法上:构造器注入和set注入都是@Autowired用来修饰方法的案例
  4. 这样的话,直接@Autowired标接口不就OK了?:是的,用字段注入就行

改用依赖注入的代码如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

public interface ICommodity {
    void sendCommodity();
}

@Service
public class CouponCommodityService implements ICommodity {
    @Override
    public void sendCommodity() {
        System.out.println("Coupon Commodity Service");
    }
}

@Service
public class GoodsCommodityService implements ICommodity {
    @Override
    public void sendCommodity() {
        System.out.println("Goods Commodity Service");
    }
}

@Service
public class CardCommodityService implements ICommodity {
    @Override
    public void sendCommodity() {
        System.out.println("Card Commodity Service");
    }
}

@Component
public class StoreFactory {

    private final CouponCommodityService couponCommodityService;
    private final GoodsCommodityService goodsCommodityService;
    private final CardCommodityService cardCommodityService;

    @Autowired
    public StoreFactory(CouponCommodityService couponCommodityService, 
                        GoodsCommodityService goodsCommodityService,
                        CardCommodityService cardCommodityService) {
        this.couponCommodityService = couponCommodityService;
        this.goodsCommodityService = goodsCommodityService;
        this.cardCommodityService = cardCommodityService;
    }

    public ICommodity getCommodityService(Integer commodityType) {
        if (commodityType == null) {
            return null;
        }
        switch (commodityType) {
            case 1:
                return couponCommodityService;
            case 2:
                return goodsCommodityService;
            case 3:
                return cardCommodityService;
            default:
                throw new RuntimeException("不存在的商品服务类型");
        }
    }
}

3.三种注入方式演示
@Component
public class BizService {

    //TODO 三种依赖注入方式

    @Value("${testFlag:0}")
    private Integer testFlag;

    //1.字段注入
    @Autowired
    private GoodsCommodityService goodsCommodityService;

    private CouponCommodityService couponCommodityService;
    private CardCommodityService cardCommodityService;


    //2.构造器注入
    @Autowired
    public BizService(CouponCommodityService couponCommodityService) {
        this.couponCommodityService = couponCommodityService;
    }

    //3.set注入(set注入不限置方法名是setxxx,spring是根据类型注入的)
    @Autowired
    public void cardCommodityServiceInject (CardCommodityService cardCommodityService) {
        this.cardCommodityService = cardCommodityService;
    }

    /**
     * 根据类型获取不同的Service 简单工厂
     * @param type
     * @return
     */
    public ICommodity getICommodityByType(Integer type) {
        System.out.println(testFlag);
        if(testFlag == 0) {
            System.out.println(0);
        } else {
            System.out.println(1);
        }
        switch (type) {
            case 1:
                return goodsCommodityService;
            case 2:
                return couponCommodityService;
            case 3:
                return cardCommodityService;
            default:
                return null;
        }
    }
}

4.其他总结
  1. @Component注解可以和 @Controller @Service @Repository互相替换。之所以常用后者是因为后者具备语义
  2. switch case的case用不了表达式、必须放已知的值。相比起if-else用在工厂模式里面,更直观
  3. 之前的在框架里使用到new但可以优化的例子:在项目里创建线程任务,用了new,依赖到的Service都是通过构造器传入的,很麻烦。现在应该直接用@Component修饰任务类,依赖的service直接@Autowired注入。最后要使用到任务类的时候就@Autowired字段注入就行

http://www.kler.cn/a/318427.html

相关文章:

  • 深度学习中的感受野:从基础概念到多层次特征提取
  • 免费,WPS Office教育考试专用版
  • win32 / WTL 开发多线程应用,子线程传递大对象给UI线程(主窗口)的方法
  • Qt 获取当前系统中连接的所有USB设备的信息 libudev版
  • 基于promtail+loki+grafana搭建日志系统
  • 零基础玩转IPC之——海思平台实现P2P远程传输实验(基于TUTK,国科君正全志海思通用)
  • 图文组合商标部分驳回后优化后初审通过!
  • 通信工程学习:什么是NFVO网络功能虚拟化编排器
  • Oracle日常运维(一线DBA必备技能)(四)-综合巡检
  • arduino ide开发esp32-wroom-32E
  • 新版本大疆上云API指令飞行(drc)模式通讯搭建思路
  • 雷池+frp 批量设置proxy_protocol实现真实IP透传
  • 详解c++:new和delete
  • 【数学二】极限的计算-夹逼准则、单调数列有界准则
  • apach httpd多后缀解析漏洞
  • 第十五章 文件上传
  • Linux 清空redis缓存及查询key值
  • 电子计算机科学中的运维技术:概念(内涵和外延)、历史、现状与展望?
  • 【C++二叉树】105.从前序与中序遍历序列构造二叉树
  • OpenAi assistant run always fails when called from PHP
  • Go unique包:突破字符串局限的通用值Interning技术实现
  • 【M-LOAM学习】
  • 【Java】关键字-abstract【主线学习笔记】
  • 《算法笔记》例题解析 第3章入门模拟--4日期处理(9题)2021-03-03
  • 直流负载箱的主要功能有哪些?
  • 数字化转型中的供应链管理优化