Java实践

java 数据绑定

数据绑定问题

(1) 方法首先进入getParamBean方法,然后进入index方法。
(2) 如果进入getParamBean方法,user,logType为中文(注意在html中提交时name, value取值),则在getParamBean中绑定AuditLogSearchBean在index方法中不生效,会发生二次绑定。
@ModelAttribute
public AuditLogSearchBean getParamBean(String mStartDate, String mEndDate, String searchText, String user,
String logType) {
// TODO
}

@RequestMapping(value = { "", "/list", "/index" })
public String index(AuditLogSearchBean searchParamBean, HttpServletRequest request, Model model) {
// TODO
}

在@ModelAttribute中绑定的数据可能会被覆盖

@ModelAttribute
public LogDataSource getLogDataSource(@RequestParam(required = false) String id,@RequestParam(required = false) String[] appName, @RequestParam(required = false) String[] appType,@RequestParam(required = false) String[] appPath) {
// TODO
}

aop

AspectJ AOP
Spring AOP
JDK proxy和CGlib

@Before是在所拦截方法执行之前执行一段逻辑。
@After 是在所拦截方法执行之后执行一段逻辑。
@Around是可以同时在所拦截方法的前后执行一段逻辑。

切面(Aspect):官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”,在本例中,“切面”就是类TestAspect所关注的具体行为,例如,AServiceImpl.barA()的调用就是切面TestAspect所关注的行为之一。“切面”在ApplicationContext中 aop:aspect 来配置。

连接点(Joinpoint) :程序执行过程中的某一行为,例如,UserService.get的调用或者UserService.delete抛出异常等行为。

通知(Advice) :“切面”对于某个“连接点”所产生的动作,例如,TestAspect中对com.spring.service包下所有类的方法进行日志记录的动作就是一个Advice。其中,一个“切面”可以包含多个“Advice”,例如ServiceAspect。

切入点(Pointcut) :匹配连接点的断言,在AOP中通知和一个切入点表达式关联。例如,TestAspect中的所有通知所关注的连接点,都由切入点表达式execution(* com.spring.service..(..))来决定。

目标对象(Target Object) :被一个或者多个切面所通知的对象。例如,AServcieImpl和BServiceImpl,当然在实际运行时,Spring AOP采用代理实现,实际AOP操作的是TargetObject的代理对象。

AOP代理(AOP Proxy) :在Spring AOP中有两种代理方式,JDK动态代理和CGLIB代理。默认情况下,TargetObject实现了接口时,则采用JDK动态代理,例如,AServiceImpl;反之,采用CGLIB代理,例如,BServiceImpl。强制使用CGLIB代理需要将 aop:config的 proxy-target-class属性设为true。

stream

collect方法和reduce方法不同,reduce方法在迭代时,每次都会生成新的对象(值)(通常情况下,reduce的中间对象是int之类的东西,每次计算,都生成一个新的,而不是改变老的。),但是collect方法在迭代时是改变中间生成的对象(通常情况下,collect的中间对象是诸如List之类的东西,可以把元素加进去。)

我们看到collect是一个将管道流的结果集到一个list中的结束操作。collect是一个将数据流缩减为一个值的归约操作。这个值可以是集合、映射,或者一个值对象。你可以使用collect达到以下目的:
将数据流缩减为一个单一值:
将一个数据流中的元素进行分组:

多线程

Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。所以ThreadLocal的应用场合,最适合的是按线程多实例(每个线程对应一个实例)的对象的访问,并且这个对象很多地方都要用到。
java 线程池
需要解决的问题:
(1)主线程等待子线程执行
(2)获取线程执行过程中抛出的异常

ExecutorService
invokeAll,为同步方法,会阻塞, 等待所有任务执行后返回
submit,为异步方法,不会阻塞,有返回值,能捕捉异常
excute方法,没有返回值,不能捕捉异常
ExecutorService配合Callable使用
FutureTask
get()获取执行结果,接收是否有异常抛出。get 方法会阻塞
CompletableFuture

可变参数列表

public void foo(String...varargs){}
foo("arg1", "arg2", "arg3");
//上述过程和下面的调用是等价的
foo(new String[]{"arg1", "arg2", "arg3"});

原文地址:https://www.cnblogs.com/sunzhuli/p/9696918.html