脚本:简单而强大的自动化工具——基础版
🖊️引言BAT(批处理)脚本是一种在 Windows 系统中执行的脚本语言,用于自动化不同类型的任务。它可以执行多个命令和操作,并具有变量、参数、流程控制和文件处理等功能。BAT 脚本可以通过命令行或双击执行,并可以在脚本中调用其他脚本或程序。这使得它成为简化和批量处理任务的强大工具。
使用 BAT 脚本可帮助自动化许多例行的计算机任务,包括软件安装、文件管理、系统配置、备份和恢复等。通过编写脚本,用户可以快速、高效地执行一系列操作,无需手动逐个命令执行。
BAT 脚本的简便性和灵活性使得它成为初学者和系统管理员的理想选择。无需编译,只需使用文本编辑器编写脚本,即可轻松地完成各种任务。无论是执行简单的文件操作,还是自定义复杂的任务流程,BAT 脚本都提供了足够的功能和控制选项。
然而,需要注意的是,BAT 脚本相对较简单,对于更复杂的任务和功能,可能需要使用其他编程语言或工具。此外,使用 BAT 脚本也需要小心,要确保脚本执行的命令和操作不会对系统造成意外的影响。
尽管 BAT 脚本已存在很多年,并且现代操作系统提供了更高级的自动化工具和编程语言,但它仍然被广泛使用,特别是在 Win ...
JMail接受及解析邮件
JMail接收及解析邮件前期准备工作
首先需要将邮箱开启POP3服务以126邮箱为例,如图所示,开启POP3,加一个授权码并记住,记下最下面的POP3服务器地址
发送一封测试邮件笔者这里用126邮箱发送了一封邮件(带附件)给qq邮箱,随后qq邮箱回复邮件(也带附件)给126邮箱,下文将读取126邮箱中收到的这封邮件。
引入Maven依赖
12345<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version></dependency>
上代码ReceiveEmailProcess 方法中有两个方法,processEmail方法传入三个参数,pop3主机(例如:pop.126.com),用户名,授权码,上文已提到。execute方法处理收件夹,具体义务逻辑在子类中重写。
123456789101112131415161718192021 ...
浅谈AQS
AQS123public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable ...
AQS即AbstractQueuedSynchronizer(抽象队列同步器),是其他同步器的一个抽象类它继承了一个AOS(AbstractOwnableSynchronizer),AOS仅仅用于保存占有锁的线程
部分重要属性AbstractQueuedSynchronizer部分属性及内部类如下:
123456789101112131415161718192021222324252627282930313233343536//同步队列的队列头private transient volatile Node head;//同步队列的队列尾private transient volatile Node tail;//状态值,代表的含义与具体的实现类相关private volatile int state;//与Lock的Co ...
Spring自动装配
Spring注解驱动开发系列:
Spring 组件注册
Spring Bean的生命周期
Spring属性赋值
Spring自动转配
Spring注解驱动开发之AOP
自动装配@Autowired标注在属性、构造器、方法、参数、注解上,自动从容器中寻找相同类型的bean赋值,如果有多个相同类型的,则根据bean的id来匹配。
默认是需要完成装配的,否则报错,当然也可以设置为非必须:@Autowired(required = false)
标注在方法上,最常见的就是配置类中结合@Bean和标在set方法上
12345@Bean// factory从容器中获取,可以省略@Autowiredpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { ......}
标在set方法上时,创建bean后属性初始化过程会调用set方法
标注在构造器上
当类中只有一个构造器时,@Autowired可以省略
标注在属性上
标 ...
Spring属性赋值
Spring注解驱动开发系列:
Spring 组件注册
Spring Bean的生命周期
Spring属性赋值
Spring自动转配
Spring注解驱动开发之AOP
属性赋值@Value可以使用@Value标在属性上,给属性赋值,当然也可以标在方法、参数、注解上。
可以直接写值、SpEL(Spring Expression Language)、或者${}取值
示例
12345678public class People { @Value("${people.name}") // 从配置文件中取 private String name; @Value("#{1+2}") // SpEL private String id; @Value("32") // 直接赋值 private int age;}
需要注意的是,如果我们从配置文件中获取值,需要配合使用@Proper ...
bean的生命周期
Spring注解驱动开发系列:
Spring 组件注册
Spring Bean的生命周期
Spring属性赋值
Spring自动转配
Spring注解驱动开发之AOP
生命周期生命周期及对其控制bean生命周期分为7个阶段
创建实例
属性赋值
初始化前
初始化
初始化后
使用
销毁
对于单实例bean,容器创建好了,bean也就创建好了,容器关闭了,bean也调用destroy方法销毁
对于多实例bean,直到使用才会去创建,容器关闭,也不会调用destroy方法销毁
我们使用@Bean注册组件时,可以使用@Bean(initMethod = “init”, destroyMethod = “destroy”)指定初始化方法名,销毁方法名
如果是使用组件扫描加入容器,可以实现InitializingBean, DisposableBean这两个接口,分别实现afterPropertiesSet初始化和destroy销毁方法
另外我们还可以在类中方法上标注@PostConstructor和@PreDestroy注解,表示所标注的方法为初始化方法和销毁方法 ...
Spring组件注册
Spring注解驱动开发系列:
Spring 组件注册
Spring Bean的生命周期
Spring属性赋值
Spring自动转配
Spring注解驱动开发之AOP
组件注册@Configuration声明这是一个配置类
在配置类中可以使用@Bean修饰方法,将该组件加入容器中。组件类型为返回值类型,组件id为方法名。
12345678@Configurationpublic class SpringConfig { // 将组件加入容器中,组件类型为People,组件为People("ming",null,null),组件名称默认为为people1,但是@Bean注解中设置了为people @Bean("people") public People people1(){ return new People("ming",null,null); }}
@ComponentScan开启组件扫描,将扫描范围中用@Component、@Re ...
ArrayList和Vector扩容机制
ArrayList在JDK8中,ArrayList有三种构造方法。特别的,对于ArrayList(),是造了一个空数组。
我们直接找到ArrayList的扩容方法
其中,DEFAULT_CAPACITY=10,minCapacity = 数组现有长度加上需要添加的元素(或集合)的长度。如果现在ArrayLIst存的是一个空数组,那么就取10和minCapacity的最大值。得到了所需最小容量后,该扩容就扩容
具体扩容方式尝试扩容至1.5倍,如果仍不够,则将所需最小容量作为新数组的容量。
JDK1.7,和1.8区别不大,只是1.7是在创建对象的时候,就创建了一个长度为10的数组。而1.8是在首次add添加数据时,才会去创建一个长度最少为10的数组。区别类似于饿汉式与懒汉式。
Vector对于Vectorjdk1.7和1.8是一样的默认初始容量都是10,而且是饿汉式。注意:构造方法中,默认了一个capacityIncrement变量为0。具体扩容细节:我们可以看到,如果指定了capacityIncrement(大于0),就可以让每次扩容时,首先尝试增加capacit ...
StringBuffer和StringBuilder扩容机制
StringBuffer与StringBuilder的append都是调用父类AbstractStringBuilder的appen方法。
而AbstractStringBuilder的append方法如下,其中有一个ensureCapacityInternal(count + len)方法。其中count+len是所需容量。而ensureCapacityInternal(int minimumCapacity)方法是:如果目前数组长度小于所需长度,则调用newCapacity(minimumCapacity)计算数组所需的长度。具体扩容机制是:尝试扩容为两倍加2,如果还小于所需容量,则直接将所需容量作为实际数组长度。如果大于所需容量,则可以作为实际数组长度。
Lambda表达式与方法引用
lambda表达式前提条件使用Lambda表达式前提条件是:实现的接口是一个函数式接口
函数式接口函数式接口就是在接口中只能有一个抽象方法。
Java 8 中还有一个注解@FunctionalInterface,表明接口是函数式接口。当然,不标注此注解,他也是函数式接口,注解只是起到编译检查的作用
java 8 提供了四大函数式接口:Consumer,Supplier,Function<T, R>,Predicate。
语法12345678// 这个接口中的accept方法负责接受一个参数,不作返回Consumer<String> consumer = new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } }; consumer.accept("输出内容");
等 ...
