@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class StorageListen{ private static PropertiesMessage filteredRealtimeData = new PropertiesMessage(); private PeriodStorage periodStorage; @Scheduled(cron="*/1 * * * * ?") @Async("PeriodStorage") public void periodStorage(){ PropertiesMessage clone = (PropertiesMessage)filteredRealtimeData.clone(); Map<String,List<StorageConfig>> map = new HashMap(); List<StorageConfig> list = new ArrayList(); StorageConfig s1 = new StorageConfig(); s1.setValue("1"); StorageConfig s2 = new StorageConfig(); s2.setValue("1"); list.add(s1); list.add(s2); map.put("1",list); periodStorage.storageData(clone); } } @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PeriodStorage { private static DeviceProperties filteredRealtimeData = new DeviceProperties(); public void storageData(PropertiesMessage message,Map<String,List<StorageConfig>> map){ map.entrySet().stream().forEach(k -> { k.getValue().parallelStream().forEach(y -> { DeviceProperties clone = (DeviceProperties)filteredRealtimeData.clone(); System.out.println(y.toString()); System.out.println(clone.toString()); }) }) } } @Data public class PropertiesMessage implements Serializable { public Map<String, DeviceProperties> propertiesMap; public PropertiesMessage deepClone() { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (PropertiesMessage) ois.readObject(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); return null; } } } public class DeviceProperties implements Serializable { public String value; public DeviceProperties deepClone() { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (DeviceProperties) ois.readObject(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); return null; } } } @Data public class StorageConfig{ public String value; }
时间: 2024-04-26 21:20:38 浏览: 84
这段代码是关于数据存储的,其中包含了一个定时任务,每隔1秒钟执行一次periodStorage()方法。这个方法会调用PeriodStorage类中的storageData()方法,将传入的PropertiesMessage对象进行克隆,并对其中的map进行遍历,将每个value对应的StorageConfig对象进行遍历并输出。另外,还有两个类PropertiesMessage和DeviceProperties,它们都实现了Serializable接口,并且都有一个deepClone()方法用于进行深拷贝,保证在对象克隆时不会影响原对象。
相关问题
@RequiredArgsConstructor(onConstructor = @__(@Autowired))修饰类什么意思
@RequiredArgsConstructor(onConstructor = @__(@Autowired))是一个Lombok注解,用于在类中生成一个带有@Autowired注解的构造函数。它的作用是简化代码,自动创建带有@Autowired注解的构造函数,从而实现依赖注入。
在使用Spring框架进行依赖注入时,通常需要在类的构造函数上添加@Autowired注解来标识需要注入的依赖对象。而使用@RequiredArgsConstructor(onConstructor = @__(@Autowired))注解后,Lombok会自动生成带有@Autowired注解的构造函数,省去了手动添加@Autowired注解的步骤。
示例代码如下:
```java
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class MyClass {
private final Dependency dependency;
}
```
以上代码等价于手动编写以下构造函数:
```java
public class MyClass {
private final Dependency dependency;
@Autowired
public MyClass(Dependency dependency) {
this.dependency = dependency;
}
}
```
这样,当使用MyClass类时,Spring容器会自动注入Dependency对象到构造函数中。
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class StorageListen{ private static PropertiesMessage filteredRealtimeData = new PropertiesMessage(); private PeriodStorage periodStorage; @Scheduled(cron="*/1 * * * * ?") @Async("PeriodStorage") public void periodStorage(){ PropertiesMessage clone = (PropertiesMessage)filteredRealtimeData.clone(); Map<String,List<StorageConfig>> map = new HashMap(); List<StorageConfig> list = new ArrayList(); StorageConfig s1 = new StorageConfig(); s1.setValue("1"); StorageConfig s2 = new StorageConfig(); s2.setValue("1"); list.add(s1); list.add(s2); map.put("1",list); periodStorage.storageData(clone); } } @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PeriodStorage { private static DeviceProperties filteredRealtimeData = new DeviceProperties(); public void storageData(PropertiesMessage message,Map<String,List<StorageConfig>> map){ map.entrySet().stream().forEach(k -> { k.getValue().parallelStream().forEach(y -> { DeviceProperties clone = (DeviceProperties)filteredRealtimeData.clone(); }) }) } } @Data public class PropertiesMessage implements Serializable { public Map<String, DeviceProperties> propertiesMap; public PropertiesMessage deepClone() { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (PropertiesMessage) ois.readObject(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); return null; } } } public class DeviceProperties implements Serializable { public String value; public DeviceProperties deepClone() { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (DeviceProperties) ois.readObject(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); return null; } } } @Data public class StorageConfig{ public String value; }
这段代码中的StorageListen类中有一个periodStorage方法,使用@Scheduled注解和@Async注解标记,表示该方法会在固定的时间间隔内执行,并且会在异步线程中执行。该方法会将filteredRealtimeData对象进行克隆,然后将克隆后的对象传递给PeriodStorage类中的storageData方法进行处理。在storageData方法中,会对传递进来的map进行遍历,然后对每个元素进行克隆,并进行相应的处理。
在这段代码中,使用了深克隆的方式来复制对象,以避免修改原始对象。同时,在StorageConfig和DeviceProperties类中也实现了deepClone方法,以支持深克隆。这样可以确保在进行对象复制时,所有的字段都会被正确地复制,并且不会对原始对象造成影响。
需要注意的是,在使用深克隆的方式复制对象时,需要确保对象中的所有字段都是可序列化的,否则会导致克隆失败。此外,由于深克隆需要进行对象的序列化和反序列化操作,因此可能会对性能产生一定的影响,需要在性能和正确性之间进行权衡。
阅读全文