1.语法篇
循环
正则表达式
数据类型
泛型
数据类型
String
indexof
静态概念
静态代码块
以下代码是使用静态代码块初始化map集合
package com.ztesoft.crmpub.bpm.task.action;
import com.ztesoft.crmpub.bpm.consts.MsgConsts;
import java.util.HashMap;
import java.util.Map;
/**
* 任务工单动作工厂类
*
* <p>该工厂类用于根据消息动作类型创建对应的工单动作实例。</p>
*
* @author major
*/
public class youhua {
// 定义动作与工单动作的映射
private static final Map<String, IWorkOrderAction> actionMap = new HashMap<>();
// 静态代码块用于初始化动作映射
static {
actionMap.put(MsgConsts.ACTION_WO_NEW, new WorkOrderNewAction());
actionMap.put(MsgConsts.ACTION_WO_DISPATCH, new WorkOrderDispatchAction());
actionMap.put(MsgConsts.ACTION_WO_FINISH, new WorkOrderFinishAction());
actionMap.put(MsgConsts.ACTION_WO_FAIL, new WorkOrderFailAction());
actionMap.put(MsgConsts.ACTION_WO_WITHDRAW, new WorkOrderWithdrawAction());
actionMap.put(MsgConsts.ACTION_WO_PULL_BACK, new WorkOrderPullBackAction());
}
/**
* 获取工单动作实例
*
* @param msgAction 消息动作类型
* @return 对应的工单动作实例
* @throws IllegalArgumentException 如果消息动作类型无效
*/
public static IWorkOrderAction getWorkOrderAction(String msgAction) {
IWorkOrderAction workOrderAction = actionMap.get(msgAction);
if (workOrderAction == null) {
throw new IllegalArgumentException("Invalid msgAction: " + msgAction);
}
return workOrderAction;
}
}
2.api
3.集合
Map要通过entryset或者keyset或者values获取map的条目流
3.IO流
4.并发编程
反射
关键词
5.面向对象
接口和接口直接用extend继承
2.注意事项
3.语法技巧
静态导入
在 Java 中,你可以通过静态导入(static import)来直接使用另一个类中的静态方法,而无需实例化那个类。这可以使代码更加简洁和易读,特别是在频繁使用某些静态方法时。
设计模式
单例模式
如何使用
在Java Spring Boot中,单例模式的一个经典应用场景是配置管理类。假设我们需要管理应用的配置信息,并确保这些配置在应用中只有一个实例可用。以下是一个使用单例模式的简单示例:
私有构造方法使得只能有一个实例
package com.example.demo.config;
import org.springframework.stereotype.Component;
@Component
public class AppConfig {
// 模拟配置属性
private String appName = "MySpringBootApp";
private String version = "1.0.0";
// 私有构造方法,防止外部实例化
private AppConfig() {}
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
}
在这个例子中,AppConfig
是一个单例类,它的构造方法是私有的,这样可以防止外部直接实例化它。我们使用 @Component
注解将这个类标记为 Spring 管理的 bean。
在Spring Boot中使用单例模式
Spring Boot 默认会将所有用 @Component
、@Service
、@Repository
等注解的类注册为单例(除非特别指定为原型模式)。因此,当我们在其他类中注入 AppConfig
时,Spring 会确保每次注入的都是同一个实例。
例如,创建一个控制器类来使用 AppConfig
:
package com.example.demo.controller;
import com.example.demo.config.AppConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConfigController {
@Autowired
private AppConfig appConfig;
@GetMapping("/config")
public String getConfig() {
return "App Name: " + appConfig.getAppName() + ", Version: " + appConfig.getVersion();
}
}
在这个 ConfigController
类中,我们通过 @Autowired
注入了 AppConfig
,并在 /config
端点返回配置值。Spring 会自动确保 AppConfig
是单例的,因此所有访问此端点的请求将共享相同的 AppConfig
实例。
模板模式
很多依赖库的设计中经常会用到模板模式 如JdbcTemplate
策略模式
支付处理中 会有多种不同的支付方式(策略)
工厂模式
1. 简单工厂模式(Simple Factory Pattern)
场景:在一个 Web 应用中,我们可能需要根据用户的请求来处理不同类型的消息(如文本消息、图片消息)。我们可以创建一个简单工厂来生成不同的消息处理器。
// 消息接口
public interface MessageHandler {
void handleMessage(String message);
}
// 具体消息处理类
@Service("textMessageHandler")
public class TextMessageHandler implements MessageHandler {
@Override
public void handleMessage(String message) {
System.out.println("Handling text message: " + message);
}
}
@Service("imageMessageHandler")
public class ImageMessageHandler implements MessageHandler {
@Override
public void handleMessage(String message) {
System.out.println("Handling image message: " + message);
}
}
// 简单工厂类
@Component
public class MessageHandlerFactory {
@Autowired
private ApplicationContext applicationContext;
public MessageHandler getHandler(String type) {
return (MessageHandler) applicationContext.getBean(type + "MessageHandler");
}
}
// 控制器类
@RestController
@RequestMapping("/messages")
public class MessageController {
@Autowired
private MessageHandlerFactory handlerFactory;
@PostMapping
public ResponseEntity<String> processMessage(@RequestParam String type, @RequestParam String message) {
MessageHandler handler = handlerFactory.getHandler(type);
handler.handleMessage(message);
return ResponseEntity.ok("Message processed");
}
}
2. 工厂方法模式(Factory Method Pattern)
场景:在一个 Web 应用中,我们可能需要创建不同类型的服务(如用户服务和订单服务),每种服务有不同的实现。我们可以使用工厂方法模式来创建这些服务。
// 服务接口
public interface Service {
void execute();
}
// 具体服务类
@Service
public class UserService implements Service {
@Override
public void execute() {
System.out.println("Executing User Service");
}
}
@Service
public class OrderService implements Service {
@Override
public void execute() {
System.out.println("Executing Order Service");
}
}
// 工厂接口
public interface ServiceFactory {
Service createService();
}
// 具体工厂类
@Component
public class UserServiceFactory implements ServiceFactory {
@Autowired
private ApplicationContext applicationContext;
@Override
public Service createService() {
return applicationContext.getBean(UserService.class);
}
}
@Component
public class OrderServiceFactory implements ServiceFactory {
@Autowired
private ApplicationContext applicationContext;
@Override
public Service createService() {
return applicationContext.getBean(OrderService.class);
}
}
// 控制器类
@RestController
@RequestMapping("/services")
public class ServiceController {
@Autowired
private ServiceFactory userServiceFactory;
@Autowired
private ServiceFactory orderServiceFactory;
@GetMapping("/user")
public ResponseEntity<String> executeUserService() {
Service service = userServiceFactory.createService();
service.execute();
return ResponseEntity.ok("User Service executed");
}
@GetMapping("/order")
public ResponseEntity<String> executeOrderService() {
Service service = orderServiceFactory.createService();
service.execute();
return ResponseEntity.ok("Order Service executed");
}
}
3. 抽象工厂模式(Abstract Factory Pattern)
场景:在一个 Web 应用中,我们可能需要创建不同风格的用户界面组件(如现代风格和经典风格的按钮和文本框)。我们可以使用抽象工厂模式来创建这些组件。
// 组件接口
public interface Button {
void render();
}
public interface TextBox {
void render();
}
// 具体组件类
@Service("modernButton")
public class ModernButton implements Button {
@Override
public void render() {
System.out.println("Rendering Modern Button");
}
}
@Service("classicButton")
public class ClassicButton implements Button {
@Override
public void render() {
System.out.println("Rendering Classic Button");
}
}
@Service("modernTextBox")
public class ModernTextBox implements TextBox {
@Override
public void render() {
System.out.println("Rendering Modern TextBox");
}
}
@Service("classicTextBox")
public class ClassicTextBox implements TextBox {
@Override
public void render() {
System.out.println("Rendering Classic TextBox");
}
}
// 抽象工厂接口
public interface UIComponentFactory {
Button createButton();
TextBox createTextBox();
}
// 具体工厂类
@Component
public class ModernUIFactory implements UIComponentFactory {
@Autowired
private ApplicationContext applicationContext;
@Override
public Button createButton() {
return applicationContext.getBean("modernButton", Button.class);
}
@Override
public TextBox createTextBox() {
return applicationContext.getBean("modernTextBox", TextBox.class);
}
}
@Component
public class ClassicUIFactory implements UIComponentFactory {
@Autowired
private ApplicationContext applicationContext;
@Override
public Button createButton() {
return applicationContext.getBean("classicButton", Button.class);
}
@Override
public TextBox createTextBox() {
return applicationContext.getBean("classicTextBox", TextBox.class);
}
}
// 控制器类
@RestController
@RequestMapping("/ui")
public class UIController {
@Autowired
private UIComponentFactory modernUIFactory;
@Autowired
private UIComponentFactory classicUIFactory;
@GetMapping("/modern")
public ResponseEntity<String> renderModernUI() {
Button button = modernUIFactory.createButton();
TextBox textBox = modernUIFactory.createTextBox();
button.render();
textBox.render();
return ResponseEntity.ok("Modern UI rendered");
}
@GetMapping("/classic")
public ResponseEntity<String> renderClassicUI() {
Button button = classicUIFactory.createButton();
TextBox textBox = classicUIFactory.createTextBox();
button.render();
textBox.render();
return ResponseEntity.ok("Classic UI rendered");
}
}
4.总结
- 简单工厂模式用于根据请求类型创建不同的消息处理器。
- 工厂方法模式用于创建不同类型的服务,每种服务由一个具体工厂类创建。
- 抽象工厂模式用于创建一系列相关的用户界面组件(按钮和文本框),不同风格的组件由不同的工厂类创建。
适配器模式
场景
假设你有一个旧的服务 LegacyPaymentService
,它提供了处理支付的方法,但你希望将它适配到一个新的支付接口 PaymentService
,以便在你的应用中使用新接口。
1. 旧服务接口和实现
LegacyPaymentService.java
package com.example.legacy;
// 旧服务接口
public interface LegacyPaymentService {
// 处理旧支付接口的方法
String processLegacyPayment(double amount);
}
LegacyPaymentServiceImpl.java
package com.example.legacy;
import org.springframework.stereotype.Service;
// 旧服务的具体实现
@Service
public class LegacyPaymentServiceImpl implements LegacyPaymentService {
@Override
public String processLegacyPayment(double amount) {
// 实际处理支付的逻辑
return "Processed payment of $" + amount + " with Legacy Payment Service.";
}
}
2. 新服务接口
PaymentService.java
package com.example.new;
// 新服务接口
public interface PaymentService {
// 处理支付的方法
String processPayment(double amount);
}
3. 适配器类
PaymentServiceAdapter.java
package com.example.adapter;
import com.example.legacy.LegacyPaymentService;
import com.example.new.PaymentService;
import org.springframework.stereotype.Component;
// 适配器类,实现新服务接口,并委托旧服务处理逻辑
@Component
public class PaymentServiceAdapter implements PaymentService {
private final LegacyPaymentService legacyPaymentService;
// 构造函数注入旧服务
public PaymentServiceAdapter(LegacyPaymentService legacyPaymentService) {
this.legacyPaymentService = legacyPaymentService;
}
@Override
public String processPayment(double amount) {
// 调用旧服务的方法进行处理
return legacyPaymentService.processLegacyPayment(amount);
}
}
4. 控制器
PaymentController.java
package com.example.controller;
import com.example.new.PaymentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
// 控制器,处理客户端的 HTTP 请求
@RestController
public class PaymentController {
private final PaymentService paymentService;
// 构造函数注入新服务(实际上是适配器)
@Autowired
public PaymentController(PaymentService paymentService) {
this.paymentService = paymentService;
}
// 处理 GET 请求,调用新服务的方法
@GetMapping("/process-payment")
public String processPayment(@RequestParam double amount) {
// 使用新服务接口处理支付请求
return paymentService.processPayment(amount);
}
}
注释解释
- 旧服务接口 (
LegacyPaymentService
):定义了旧系统中现有的接口。 - 旧服务实现 (
LegacyPaymentServiceImpl
):实现了旧接口的方法,包含实际的业务逻辑。 - 新服务接口 (
PaymentService
):定义了新的服务接口,期望提供的支付处理方法。 - 适配器 (
PaymentServiceAdapter
):将旧服务接口适配为新服务接口,内部调用旧服务的实现。 - 控制器 (
PaymentController
):处理 HTTP 请求,使用新服务接口(实际上是适配器)来处理支付请求。