一、List处理
1.1 List截取字符串
1
| noRaiseDrop.subList(fromIndex, toIndex);
|
1.2 List拼接
用Apache的org.apache.commons.lang.StringUtils.
1 2 3 4 5
| <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.4.2</version> </dependency>
|
1
| StringUtils.join(list, ",")
|
二、Spring + tomcat jndi配置
配置方法
三、org.springframework.beans.BeanUtils#copyProperties的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public class BeanUtilsCopyTest { @Test public void test(){ A a = new A("a",1,2L,"d"); System.out.println("a======"); System.out.println(a); B b = new B(); System.out.println("b======"); BeanUtils.copyProperties(a,b); System.out.println(b); }
class A{ private String a; private int b; private long c; private String d; }
class B{ private int b; private long c; private String d; private String e; } }
|
运行结果
1 2 3 4
| a====== A{a='a', b=1, c=2, d='d'} b====== B{b=1, c=2, d='d', e='null'}
|
四、@Qualifier与@Autowired
简单讲,就是@Autowired是根据类型来寻找bean的,当一个接口可能有好几个实现类,并且都注释为Bean,就需要@Qualifier来指定对应的bean id。
参考链接
五、ThreadPoolTaskExecutor的使用
关于它的配置可以参考链接
使用方法:
首先定义线程池:
1 2 3 4 5 6
| <bean id ="taskExecutor" class ="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" > <property name ="corePoolSize" value ="5" /> <property name ="keepAliveSeconds" value ="300" /> <property name ="maxPoolSize" value ="10" /> <property name ="queueCapacity" value ="25" /> </bean>
|
然后使用线程池:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class ThreadPoolTaskExectorTest {
@Autowired @Qualifier("runBatchTaskExecutor") ThreadPoolTaskExecutor taskExecutor;
@Test public void crateTask(){ CreateLoanInfoTask task = new CreateLoanInfoTask(); taskExecutor.execute(task); } class CreateLoanInfoTask implements Runnable{
public void run() { } } }
|
只要把要执行的runnable对象(task)扔进ThreadPoolTaskExecutor taskExecutor
中去,然后他就自己按照配置策略,去执行对应的runnable对象中的run方法。
另外:
Callable和Runnable用法的比较
六、Callable、Future和FutureTask
菜鸟A:问一个基础的问题,线程池可以理解为java异步编程的一种方法吗?
老鸟B:对啊,多线程就是一种异步编程啊。多线程就是为了达到异步的
菜鸟A:在上面讲的ThreadPoolTaskExector。如果线程池连的Runnable里面的run方法,是跟另一个系统交互的。另一个系统返回的response怎么处理呢?
他可以在run()中等待结果response,可以立即处理response,也可以将response封装成一个runnable对象再次扔到其他的线程池中等待处理。
但是,他还是需要等待response的。
老鸟B:这个时候用Callable、Future和FutureTask就更好了
Callable、Future和FutureTask
七、FTP操作
利用commons-net这个jar包:
1 2 3 4 5
| <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.3</version> </dependency>
|