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

用工厂模式演示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 {@Overridepublic void sendCommodity() {System.out.println("Coupon Commodity Service");}
}@Service
public class GoodsCommodityService implements ICommodity {@Overridepublic void sendCommodity() {System.out.println("Goods Commodity Service");}
}@Service
public class CardCommodityService implements ICommodity {@Overridepublic void sendCommodity() {System.out.println("Card Commodity Service");}
}@Component
public class StoreFactory {private final CouponCommodityService couponCommodityService;private final GoodsCommodityService goodsCommodityService;private final CardCommodityService cardCommodityService;@Autowiredpublic 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.字段注入@Autowiredprivate GoodsCommodityService goodsCommodityService;private CouponCommodityService couponCommodityService;private CardCommodityService cardCommodityService;//2.构造器注入@Autowiredpublic BizService(CouponCommodityService couponCommodityService) {this.couponCommodityService = couponCommodityService;}//3.set注入(set注入不限置方法名是setxxx,spring是根据类型注入的)@Autowiredpublic 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字段注入就行

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++基础知识7 list
  • css如何设置间距
  • Mac 上哪个剪切板增强工具比较好用? 好用剪切板工具推荐
  • zabbix入门单机部署
  • SpringBoot如何在使用MongoRepository时启用@Created
  • Laravel邮件发送:从配置到发邮件的指南!
  • 《程序猿之设计模式实战 · 观察者模式》
  • 随机掉落的项目足迹:100vh - 50px——减法居然还能这么玩儿?
  • Apifox 「定时任务」操作指南,解锁自动化测试的新利器
  • MATLAB系列09:图形句柄
  • Java 微服务框架 HP-SOA v1.1.4
  • sudo yum remove 误删 恢复
  • 怎么开通GitHub Copilot?不会开通GitHub Copilot?一文看懂
  • 全国职业院校技能大赛(大数据赛项)-平台搭建Spark、Scala笔记
  • 基于JAVA+SpringBoot+Vue的社区智慧养老监护管理平台
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • Akka系列(七):Actor持久化之Akka persistence
  • JAVA SE 6 GC调优笔记
  • js中forEach回调同异步问题
  • k8s 面向应用开发者的基础命令
  • leetcode讲解--894. All Possible Full Binary Trees
  • node-glob通配符
  • python3 使用 asyncio 代替线程
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 记录:CentOS7.2配置LNMP环境记录
  • 自动记录MySQL慢查询快照脚本
  • 《码出高效》学习笔记与书中错误记录
  • Mac 上flink的安装与启动
  • mysql面试题分组并合并列
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​力扣解法汇总946-验证栈序列
  • #android不同版本废弃api,新api。
  • #前后端分离# 头条发布系统
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (C#)获取字符编码的类
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (十)Flink Table API 和 SQL 基本概念
  • (一) storm的集群安装与配置
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (转)jQuery 基础
  • .bat批处理出现中文乱码的情况
  • .NET CLR基本术语
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .Net Core 生成管理员权限的应用程序
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET程序员迈向卓越的必由之路
  • .NET下ASPX编程的几个小问题
  • .net中调用windows performance记录性能信息