slf4j与log4j联合使用
slf4j是什么?slf4j只是定义了一组日志接口,但并未提供任何实现,既然这样,为什么要用slf4j呢?log4j不是已经满足要求了吗?
是的,log4j满足了要求,但是,日志框架并不只有log4j一个,你喜欢用log4j,有的人可能更喜欢logback,有的人甚至用jdk自带的日志框架,这种情况下,如果你要依赖别人的jar,整个系统就用了两个日志框架,如果你依赖10个jar,每个jar用的日志框架都不同,岂不是一个工程用了10个日志框架,那就乱了!
slf4j与log4j联合使用
slf4j是什么?slf4j只是定义了一组日志接口,但并未提供任何实现,既然这样,为什么要用slf4j呢?log4j不是已经满足要求了吗?
是的,log4j满足了要求,但是,日志框架并不只有log4j一个,你喜欢用log4j,有的人可能更喜欢logback,有的人甚至用jdk自带的日志框架,这种情况下,如果你要依赖别人的jar,整个系统就用了两个日志框架,如果你依赖10个jar,每个jar用的日志框架都不同,岂不是一个工程用了10个日志框架,那就乱了!
MyBatis 的配置文件 Configuration 中有相关属性,设属性即可,不用再放一个 log4j.properties 文件。
<configuration>
<settings>
……
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
</configuration>
配置完成后,在 IDE 的控制台下可以看到程序运行过程中的 SQL,参数,返回结果等。
子类调用继承来的父类的方法,输出this,显示this是指向子类实例的指针。
但是输出this.name,却输出的是父类的成员变量,而没有使用子类中定义的同名变量(讲道理不应该就近选择子类的name变量?)
Java中有三种移位运算符
<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐
web.xml 文件中,
metadata-complete="true" 是默认值!
metadata-complete 值必须修改掉为 "false" !
Servlet 3.0 的部署描述文件 web.xml 的顶层标签 <web-app> 有一个 metadata-complete 属性,该属性指定当前的部署描述文件是否是完全的。如果设置为 true,则容器在部署时将只依赖部署描述文件,忽略所有的注解(同时也会跳过 web-fragment.xml 的扫描,亦即禁用可插性支持,);如果不配置该属性,或者将其设置为 false,则表示启用注解支持(和可插性支持)。
TeaFrameWork 、Smart Framework 、JFinal
SMVC:是基于java开发的轻量级MVC框架,框架宗旨:方法加上注解即接口
Latke:一个类似 Spring,但以 JSON 为主的 Java Web 框架
Blade:基于 Java8 + Netty4 创造的轻量级、高性能、简洁优雅的Web框架
上个小节简单的描述了一下注册中心如何处理与服务提供者的交互问题,也列举了几个简单的代码片段,中间有几个场景是需要通知服务消费者的几个业务逻辑的
1)当服务消费者服务发布成功且审核通过的情况下,需要通知服务订阅者
2)当某个服务下线的时候,也需要通知服务订阅者某个服务下线
SLF4J的全称是Simple Logging Facade for Java,即简单日志门面。SLF4J并不是具体的日志框架,而是作为一个简单门面服务于各类日志框架,如java.util.logging, logback和log4j。
SLF4J提供了统一的记录日志的接口,对不同日志系统的具体实现进行了抽象化,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过绑定具体的日志系统来实现。
Mybatis-Plus的条件构造器LambdaQueryWrapper实现原理:
Wrappers.<User>lambdaQuery().eq(User::getUserName, "张三")
HttpClient最基本的功能就是执行HTTP方法。HTTP方法的执行涉及到若干HTTP请求/HTTP响应的交换,通常是在HttpClient内部被处理的。使用者需要提供一个请求对象来执行,同时HttpClient需要将请求传输到目标服务器上,然后返回相应的响应对象,或者在执行不成功的时候抛出异常。