一、log4j。
1.log4j基础科普:记录日志。
有两种日志模式:
a.Apatcha提供:Log4j(MyBatis使用这种)和Log4j2(Hibernate使用这个)
b.JDK自带,由于自带不好用所以用上一个
2.日志的优点:
a.可以控制输出的地方。——配置文件设置——log4j.properties
log4j.rootLogger=INFO(权限),console(控制台),file(文件记录)
控制台输入
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%p] %m [%t] %c [%l]%n
文件输入
log4j.appender.file.File=d:/file.log
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %m
[%t] %c [%l]%n
b.可以控制输出的等级。
输出等级优先级如下:
All,Trace,Debug,Info,Warm,Error,Fatal
3.用处。
记录所需要的日志。
二、静态代理与动态代理
这一块是代理模式在JAVA中的应用,通过对真实对象的封装,来实现功能的扩展。
这个模式有“代理三要素”:
1.共同的接口
2.代理的对象
3.真实的对象
1.静态代理。
共同的接口:
public interface SomeService {
void doSome();
}
真实的对象:
//目标类
public class SomeServiceImpl implements SomeService {
//目标方法
@Override
public void doSome() {
System.out.println("doSome");
}
代理对象:
//代理类
public class SomeServiceProxy implements SomeService {
//目标对象
SomeService someService;
public SomeServiceProxy(SomeService someService) {
this.someService=someService;
}
@Override
public void doSome() {
System.out.println("前置增强");
someService.doSome();
System.out.println("后置增强");
}
}
结果如下:
前置增强
dosome
后置增强
静态代理的优点是:不用修改源码就可以进行功能的扩展
缺点:如果需要扩展的太多,代码就太过冗余
2.动态代理:面向运行,由反射进行读取
public void test01() {
//创建目标对象
SomeService someServiceImpl=new SomeServiceImpl();
//动态代理--返回值就是代理对象
SomeService someserviceProxy = (SomeService) Proxy.newProxyInstance(
someServiceImpl.getClass().getClassLoader(),//类加载器,通过目标对象获取
someServiceImpl.getClass().getInterfaces(), //接口的Class类型,通过目标对象获取
//如何增强目标对象InvocationHandler是一个接口,使用匿名内部类
new InvocationHandler() {
@Override
//proxy:代理对象
//method:目标方法
//args:目标方法参数列表
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("前置增强");
//通过反射调用目标对象的方法
Object obj = method.invoke(someServiceImpl, args);
return obj;
}
});
//$Proxy4--就是底层使用反射定义的代理类
System.out.println(someserviceProxy.getClass());
someserviceProxy.doSome();
}
这个有两种操作方法:
a.JDK自带方法:这个必须要有接口
这个要用到一个接口。里面参数有写。
b.第三方工具类进行
cglib动态代理:第三方架包——这个可以没有接口。
三、枚举
- 注解
- 一种数据类型。
- 定义注解:和定义类,接口,枚举的概念一样。一般不会自己定义。
- @interface 注解名字
- 一般是使用框架中的定义注解,我们使用注解
- 使用注解
- 程序员根据需要添加对应的注解
- 读取注解
- 注解是给代码看的,一般是由框架反射读取注解
- 可以使用注解的位置:
- 类
- 方法
- 构造器
- 参数
- 局部变量
- 字段
- 包
- 注解中可以添加属性,也可以添加默认值
- 可以使用的数据类型
- 基本数据类型
- String
- 枚举
- Class(反射类型
- 注解
- 以上所有的一维数组
- 可以使用的数据类型