java日志(slf4j, log4j, jdk4j,slf4j_simple,)

2024-06-22 13:58

本文主要是介绍java日志(slf4j, log4j, jdk4j,slf4j_simple,),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以前自学java的时候,听圣思源的张龙讲到过slf4j,由于年代过于久远,都不知道这个jar是干嘛的,直到今天做了这个笔记之后.....

先写个题外话,csdn博客怎么插入图片:在文章正文下面后看到上传附件,先把图片上传上来  然后点击 上传的图片后面的 插入就可以了哦

先了解一下文中会用到的一些概念:

1.  概念

Slf4j 全称为Simple Logging Facade for JAVA:java简单日志门面。 是对不同日志框架提供的一个门面封装。可以在部署的时候不修改任何配置即可接入一种日志实现方案。和commons-loging 应该有一样的初衷。个人感觉设从计上更好一些,没有commons 那么多潜规则。同时有两个额外特点:

1. 能支持多个参数,并通过{} 占位符进行替换,避免老写logger.isXXXEnabled 这种无奈的判断,带来性能提升见:http://www.slf4j.org/faq.html#logging_performance 。

2.OSGI 机制更好兼容支持(暂时还不能理解)

Commons-logging : apache最早提供的日志的门面接口。避免和具体的日志方案直接耦合。类似于JDBC 的api 接口,具体的的JDBC driver 实现由各数据库提供商实现。通过统一接口解耦,不过其内部也实现了一些简单日志方案。

Log4j : 经典的一种日志解决方案。内部把日志系统抽象封装成Logger 、appender 、pattern 等实现。我们可以通过配置文件轻松的实现日志系统的管理和多样化配置。

slf4j-simple:也是一种日志解决方案。


以下是对slf4j更详细的解释引用资源:http://baike.baidu.com/view/1895694.htm

SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
1、什么情况可以使用
如果你开发的是类库或者嵌入式组件,那么就应该考虑采用SLF4J,因为不可能影响最终用户选择哪种日志系统。在另一方面,如果是一个简单或者独立的应用,确定只有一种日志系统,那么就没有使用SLF4J的必要。假设你打算将你使用log4j的产品卖给要求使用JDK 1.4 Logging的用户时,面对成千上万的log4j调用的修改,相信这绝对不是一件轻松的事情。但是如果开始便使用SLF4J,那么这种转换将是非常轻松的事情。
2. 举例
自己根据网上的简单教程写了三个关于slf4j与一些具体日志解决方案整合 的小例子,
demo下载地址:http://download.csdn.net/detail/u012049463/6383477     例子很简答,看了就懂,如下(都是图): 
第一个是slf4j+slf4j_simple    (图A)


第二个是slf4j+slf4j_jdk  (图B)


第三个是slf4j+slf4j_log4j+log4j   (图C)


相信到这里,大家都能大概能够理解slf4j的作用了,下面我们再来讲讲最近用的比较多的log4j的用法。

log4j教程

这有个关于log4j的教程,讲的很有条理也很具体: http://blog.csdn.net/wlq1983/article/details/2827638
以下是复制的该页面的内容:
1. 简介
2. 安装
3. log4j基本概念
3.1. Logger 3.2. Appender
3.2.1. 使用ConsoleAppender 3.2.2. 使用FileAppender 3.2.3. 使用WriterAppender
3.3. Layout 3.4. 基本示例
3.4.1. SimpleLayout和FileAppender 3.4.2. HTMLLayout和WriterAppender 3.4.3. PatternLayout和ConsoleAppender
4. 使用外部配置文件 5. 参考资料 (以及一些有参考价值的链接)

使用log4j大概涉及3个主要概念:

  1. 公共类 Logger

    Logger 负责处理日志记录的大部分操作。

  2. 公共接口 Appender

    Appender 负责控制日志记录操作的输出。

  3. 公共抽象类Layout

    Layout 负责格式化Appender的输出。

日志记录器(Logger)是日志处理的核心组件。log4j具有5种正常级别(Level)。 日志记录器(Logger)的可用级别Level (不包括自定义级别 Level), 以下内容就是摘自log4j API (http://jakarta.apache.org/log4j/docs/api/index.html):

  • static Level DEBUG

    DEBUG Level指出细粒度信息事件对调试应用程序是非常有帮助的。

  • static Level INFO

    INFO level表明 消息在粗粒度级别上突出强调应用程序的运行过程。

  • static Level WARN

    WARN level表明会出现潜在错误的情形。

  • static Level ERROR

    ERROR level指出虽然发生错误事件,但仍然不影响系统的继续运行。

  • static Level FATAL

    FATAL level指出每个严重的错误事件将会导致应用程序的退出。

另外,还有两个可用的特别的日志记录级别: (以下描述来自log4j APIhttp://jakarta.apache.org/log4j/docs/api/index.html):

  • static Level ALL

    ALL Level是最低等级的,用于打开所有日志记录。

  • static Level OFF

    OFF Level是最高等级的,用于关闭所有日志记录。

日志记录器(Logger)的行为是分等级的。

日志记录器(Logger)将只输出那些级别高于或等于它的级别的信息。如果没有设置日志记录器(Logger)的级别,那么它将会继承最近的祖先的级别。因此,如果在包com.foo.bar中创建一个日志记录器(Logger)并且没有设置级别,那它将会继承在包com.foo中创建的日志记录器(Logger)的级别。如果在com.foo中没有创建日志记录器(Logger)的话,那么在com.foo.bar中创建的日志记录器(Logger)将继承root 日志记录器(Logger)的级别,root日志记录器(Logger)经常被实例化而可用,它的级别为DEBUG

Log4j的关键之处在于它的继承思想。也就是一个Log可以继承另外一个Log的属性(输出到哪里,日志等级,日志格式等等)。怎么继承?
Log4j是根据Log的名字来判断继承关系的,比如:
名字为“com.zhlmmc.lib”的Log就是“com.zhlmmc.lib.log”的parent,明白了吧!Log4j还有一个rootLogger,相当于Java的Object。
回过头来看“LogFactory.getLog(Test.class)”这里的“Test.class”事实上传进去的是Test这个类的完整路径(包名+类名),“test.Test”。这样如果存在“test”这个Log那么Test这个Log就继承它,否则就继承rootLogger。
那具体的Log属性是在哪里定义的呢?
关于logger的两点说明
用同名参数调用Logger.getLogger(String  name)将返回同一个logger的引用。故可以在一个地方配置logger,在另外一个地方获得配置好的logger,
而无须相互间传递logger的引用。
logger的创建可以按照任意的顺序,即,父logger可以后于子logger被创建。log4j将自动维护logger的继承树。


有很多方法可以创建一个日志记录器(Logger),下面方法可以取回root日志记录器:

Logger logger = Logger.getRootLogger();

还可以这样创建一个新的日志记录器:

Logger logger = Logger.getLogger("MyLogger");

比较常用的用法,就是根据类名实例化一个静态的全局日志记录器:

static Logger logger = Logger.getLogger(test.class);

所有这些创建的叫"logger"的日志记录器都可以用下面方法设置级别:

logger.setLevel((Level)Level.WARN);

可以使用7个级别中的任何一个; Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR, Level.FATAL, Level.ALL and Level.OFF.

Appender 控制日志怎样输出。下面列出一些可用的Appender(log4j API中所描述的http://jakarta.apache.org/log4j/docs/api/index.html):

  1. ConsoleAppender:使用用户指定的布局(layout) 输出日志事件到System.out或者 System.err。默认的目标是System.out。

  2. DailyRollingFileAppender 扩展FileAppender,因此多个日志文件可以以一个用户选定的频率进行循环日志记录。

  3. FileAppender 把日志事件写入一个文件

  4. RollingFileAppender 扩展FileAppender备份容量达到一定大小的日志文件。

  5. WriterAppender根据用户的选择把日志事件写入到Writer或者OutputStream。

  6. SMTPAppender 当特定的日志事件发生时,一般是指发生错误或者重大错误时,发送一封邮件。

  7. SocketAppender 给远程日志服务器(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。

  8. SocketHubAppender 给远程日志服务器群组(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。

  9. SyslogAppender给远程异步日志记录的后台精灵程序(daemon)发送消息。

  10. TelnetAppender 一个专用于向只读网络套接字发送消息的log4j appender。

还可以实现 Appender 接口,创建以自己的方式进行日志输出的Appender。

Appender类及其作用列表

Appender类名
作 用
org.apache.log4j.ConsoleAppender
将日志输出到控制台
org.apache.log4j.FileAppender
将日志输出到文件
org.apache.log4j.DailyRollingFileAppender
每天产生一个日志文件
org.apache.log4j.RollingFileAppender
文件大小到达指定尺寸时产生一个新的文件
org.apache.log4j. WriterAppender
将日志信息以流格式发送到任意指定的地方
 公有选项:
-Threshold=WARN:指定日志消息的输出最低层次。
-ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。

1)ConsoleAppender选项
-Target=System.err:默认情况下是:System.out,指定输出控制台。
 
2)FileAppender 选项
-File=mylog.txt:指定消息输出到mylog.txt文件。
- Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
 
3)DailyRollingFileAppender 选项
-File=mylog.txt:指定消息输出到mylog.txt文件。
-Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
-DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
'.'yyyy-MM: 每月
'.'yyyy-ww: 每周 
'.'yyyy-MM-dd: 每天
'.'yyyy-MM-dd-a: 每天两次
'.'yyyy-MM-dd-HH: 每小时
'.'yyyy-MM-dd-HH-mm: 每分钟
 
4)RollingFileAppender 选项
-File=mylog.txt:指定消息输出到mylog.txt文件。
- Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
-MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
-MaxBackupIndex=2:指定可以产生的滚动文件的最大数。


Appender必须使用一个与之相关联的 Layout,这样它才能知道怎样格式化它的输出。当前,log4j具有三种类型的Layout:

  1. HTMLLayout 格式化日志输出为HTML表格。

  2. PatternLayout 根据指定的 转换模式格式化日志输出,或者如果没有指定任何转换模式,就使用默认的转换模式。

  3. SimpleLayout 以一种非常简单的方式格式化日志输出,它打印级别 Level,然后跟着一个破折号“-“ ,最后才是日志消息。

    4.org.apache.log4j.TTCCLayout ,它包含日志产生的时间,线程,类别等信息


    1)HTMLLayout 选项
    -LocationInfo=true:默认值是false,输出java文件名称和行号。
    -Title=my app file: 默认值是 Log4J Log Messages。
     
    2)PatternLayout 选项
    - ConversionPattern=%m%n :指定怎样格式化指定的消息。
     
    3)XMLLayout  选项
    -LocationInfo=true:默认值是false,输出java文件和行号。
     
    自定义PatternLayout:
     log4j.appender.myAppender.layout.ConversionPattern=
    %-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
    这里需要说明的就是日志信息格式中几个符号所代表的含义:
    1)-X号: X信息输出时左对齐。
    2)%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
    3)%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921。
    4)%r: 输出自应用启动到输出该log信息耗费的毫秒数。
    5)%c: 输出日志信息所属的类目,通常就是所在类的全名。
    6)%t: 输出产生该日志事件的线程名。
    7)%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)。
    8)%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
    9)%%: 输出一个"%"字符。
    10)%F: 输出日志消息产生时所在的文件名称。
    11) %L: 输出代码中的行号。
    12)%m: 输出代码中指定的消息,产生的日志具体信息。
    13)%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行。
    可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
    1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
    2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
    3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
    4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。

Log4j经常与外部日志文件联合使用,这样很多可选项不必硬编码在软件中。使用外部配置文件的优点就是修改可选项不需要重新编译程序。唯一的缺点就是,由于用到io 指令,速度稍微有些减慢。

有两个方法可以用来指定外部配置文件:文本文件或者XML文件。既然现在所有事情都写成XML文件,那么该教程就重点讲解XML文件方法,但是也包含相关文本文件的例子。首先,看看下面的XML配置文件示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
      <layout class="org.apache.log4j.SimpleLayout"/>
    </appender>
    <root>
      <priority value ="debug" />
      <appender-ref ref="ConsoleAppender"/>
    </root>
</log4j:configuration>     

文件以标准的XML声明作为开始,后面跟着指出DTD(文档类型定义)的DOCTYPE声明,它定义了XML文件的结构,例如,什么元素可以嵌入在其他元素中等等。上面文件在log4j发行版的src/java/org/apache/log4j/xml目录中。 接着看看封装所有元素的 log4j:configuration 元素,它在DOCTYPE声明中被指定为根元素。嵌入在根元素中有两个结构:

  <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.SimpleLayout"/>
  </appender>          

这里创建一个名叫"ConsoleAppender"的 Appender,注意,你可以选择任何名字,该示例之所以选择"ConsoleAppender",完全是为了示例的设计。接着这个appender类以全名形式给出,经常用规范(fully qualified)类名。 Appender必须具有一个指定的 nameclass。嵌入在 Appender之内的是 layout元素,这里它被指定为SimpleLayout。 Layout 必须具有一个 class属性。

  <root>
    <priority value ="debug" />
    <appender-ref ref="ConsoleAppender"/>
  </root>          

root元素必须存在且不能被子类化。示例中的优先级被设置为"debug",设置appender饱含一个appender-ref元素。还有更多的属性或元素可以指定。查看log4j发行版中的src/java/org/apache/log4j/xml/log4j.dtd以了解关于XML配置文件结构的更多信息。可以用下面这种方法把配置信息文件读入到Java程序中:

DOMConfigurator.configure("configurationfile.xml");    

DOMConfigurator 用一棵DOM树来初始化log4j环境。这里是示例中的XML配置文件:plainlog4jconfig.xml。这里是执行该配置文件的程序: files/externalxmltest.java:

import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
public class externalxmltest {
   static Logger logger = Logger.getLogger(filetest.class);
   public static void main(String args[]) {
      DOMConfigurator.configure("xmllog4jconfig.xml");
      logger.debug("Here is some DEBUG");
      logger.info("Here is some INFO");
      logger.warn("Here is some WARN");
      logger.error("Here is some ERROR");
      logger.fatal("Here is some FATAL");
   }
}    

这里是一个实现带有PatternLayoutFileAppender的日志记录器Logger的XML配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="appender" class="org.apache.log4j.FileAppender">
    <param name="File" value="Indentify-Log.txt"/>
    <param name="Append" value="false"/>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %p - %m%n"/>
    </layout>
  </appender>
  <root>
    <priority value ="debug"/>
    <appender-ref ref="appender"/>
  </root>
</log4j:configuration>    

你可以从这里下载示例: xmllog4jconfig2.xml。 想要得到更多的使用XML文件配置log4j环境的例子,请查看log4j发行版的目录src/java/org/apache/log4j/xml/examples/ 。

这就是上面讨论的文本文件形式的配置文件:

# initialise root logger with level DEBUG and call it BLAHlog4j.rootLogger=DEBUG,
 BLAH# add a ConsoleAppender to the logger BLAHlog4j.appender.BLAH=
org.apache.log4j.ConsoleAppender# set set that layout to be SimpleLayoutlog4j.appender.BLAH.layout=
org.apache.log4j.SimpleLayout    

从这里可以下载: plainlog4jconfig.txt。这就是执行该配置文件的程序:

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class externalplaintest {
   static Logger logger = Logger.getLogger(externalplaintest.class);
   public static void main(String args[]) {
      PropertyConfigurator.configure("plainlog4jconfig.xml");
      logger.debug("Here is some DEBUG");
      logger.info("Here is some INFO");
      logger.warn("Here is some WARN");
      logger.error("Here is some ERROR");
      logger.fatal("Here is some FATAL");
   }
}    

你可以下载使用该配置文件的示例: externalplaintest.java。想要获得更多的使用文本文件配置log4j环境的例子,请查看log4j发行版中的目录examples

使用外部配置文件的例子就简单的讨论到这里,现在应该可以肯定你已经有能力独立学习更多的log4j发行版和测试版中提供的例子。

     4.2  log4j与spring整合

示例下载地址: http://download.csdn.net/detail/u012049463/6388947
先看一下配置文件(log4j.properties):

#defing a root logger, priority lever is debug, appender is xixi and hehe which define by customer
#log4j.rootLogger=DEBUG,xixi,hehe
log4j.logger.com.unj=info,xixi
log4j.logger.com.unj.packageA.ClassA=debug,xixi
log4j.logger.com.unj.packageB.ClassB=info,xixi
log4j.logger.com.unj.packageC.ClassC=warn,xixi
log4j.logger.com.unj.packageD.ClassD=error,xixi
log4j.logger.com.unj.packageD.ClassE=fatal,xixi
log4j.additivity.com.unj.packageD.ClassE=false
log4j.additivity.com.unj.packageA.ClassA=false
log4j.threshold=ERROR
log4j.appender.xixi.threshold=fatal
##out log to console
#define a appender which name is xixi, it appender type is org.apache.log4j.ConsoleAppender,layout is org.apache.log4j.PatternLayout and define it output format is like [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [%t] [%c:%L] - %m%n  
log4j.appender.xixi=org.apache.log4j.ConsoleAppender
log4j.appender.xixi.layout=org.apache.log4j.PatternLayout
log4j.appender.xixi.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [%t] [%c:%L] - %m%n#out log to file
log4j.appender.hehe=org.apache.log4j.RollingFileAppender
log4j.appender.hehe.File=${ssh.root}/WEB-INF/logs/xixihehehuiliangjia.log
log4j.appender.hehe.MaxFileSize=5120KB
log4j.appender.hehe.MaxBackupIndex=10
log4j.appender.hehe.layout=org.apache.log4j.PatternLayout
log4j.appender.hehe.layout.ConversionPattern=[d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [%t] [%c:%L] - %m%n
在web.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5"><display-name>log4j_spring_test</display-name><!--如果不定义webAppRootKey参数,那么webAppRootKey就是缺省的"webapp.root" --><context-param><param-name>webAppRootKey</param-name><param-value>ssh.root</param-value></context-param><!--由Sprng载入的Log4j配置文件位置 --><context-param><param-name>log4jConfigLocation</param-name><param-value>classpath:log4jConfig.properties</param-value></context-param><!--Spring默认刷新Log4j配置文件的间隔,单位为millisecond --><context-param><param-name>log4jRefreshInterval</param-name><param-value>6000</param-value></context-param><!--Spring log4j Config loader --><listener><listener-class>org.springframework.web.util.Log4jConfigListener</listener-class></listener><!-- define servlet --><servlet><servlet-name>mylog</servlet-name><servlet-class>com.unj.packageA.LogServlet</servlet-class></servlet><servlet-mapping><servlet-name>mylog</servlet-name><url-pattern>justdoit/log</url-pattern></servlet-mapping></web-app>




在spring中,log4j是和common-logging一起使用的,所以在整合spring和log4j时,一般要导入log4j-1.2.17.jar和commons-logging-1.1.1.jar
ClassA中的日志会记录两遍,因为com.unj.packageA.ClassA会继承com.unj和rootLogger,但是由于rootLogger没有定义appender,所以就只输出两遍。这种继承关系只会将父类的appender加到自己的appender列表当中,而父类中的输出级别对自己不受影响,如上,com.unj输出是info,com.unj.packageA.ClassA输出仍是debug,只是输出appender会是两个xixi。若rootlogger也定义了appender是xixi,那么com.unj.packageA.ClassA将会输出三遍。
为了摆脱这种情况,可以使用配置log4j.additivity.com.unj.packageA.ClassA=false,这样com.unj.packageA.ClassA的日志只会输出到自己的appender,而不会继承父类的。
log4j.threshold=ERROR 用来控制所有的appender,即输出到所有appender的日志,不管原来是什么级别的,都不能低于threshold所规定的级别。
还有一种更细粒度的控制日志输出级别的,log4j.appender.xixi.threshold=fatal 用来控制指定的appender的输出级别。

log4j.rootLogger=DEBUG,xixi,hehe 一般都会配置,因为自定义的log4j.logger 都会继承这个rootLogger,它就相当于java类中的Object类一样。




这篇关于java日志(slf4j, log4j, jdk4j,slf4j_simple,)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084490

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定