JAVA框架学习——基础准备(log4j,静态代理与动态代理,枚举,注解)

4 篇文章 0 订阅
2 篇文章 0 订阅
一、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动态代理:第三方架包——这个可以没有接口。

三、枚举

  • 注解
    1. 一种数据类型。
    2. 定义注解:和定义类,接口,枚举的概念一样。一般不会自己定义。
      1. @interface 注解名字
      2. 一般是使用框架中的定义注解,我们使用注解
    3. 使用注解
      1. 程序员根据需要添加对应的注解
    4. 读取注解
      1. 注解是给代码看的,一般是由框架反射读取注解
    5. 可以使用注解的位置:
      1. 方法
      2. 构造器
      3. 参数
      4. 局部变量
      5. 字段
    6. 注解中可以添加属性,也可以添加默认值
      1. 可以使用的数据类型
        1. 基本数据类型
        2. String
        3. 枚举
        4. Class(反射类型
        5. 注解
        6. 以上所有的一维数组

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值