工厂模式和代理模式
工厂模式
定义一个创建产品对象的工厂接口,将具体产品对象的实际操作交给子工厂类完成,这就实现了"创建于使用分离"
的特性.
分为三个实现方式:简单工厂模式,抽象工厂模式,工厂方法模式
简单工厂(静态工厂方法模式):
把具体创建的对象叫做"产品",创建产品对象成为"工厂".
工厂模式如果要增加一个产品就要增加一个产品类和对应的工厂类,违背了"开闭原则".
简单工厂主要角色:
- 简单工厂: 是核心; 负责创建所有实例的逻辑
- 抽象产品:创建所有的对象的父类,是所有实例的公共接口
- 具体产品:是简单工厂模式的创建目标
代理模式
有时候一个对象不想/不能直接访问另一个对象,这时就需要一个像中介一样的代理去完成某种任务.
中介就是代理对象.
优点:
可以使得客户端与目标对象分离,降低耦合度
在客户端和目标对象起到中介的作用和保护目标对象
可以扩展目标对象
模式的架构
1.抽象主题类:通过接口或者抽象类声明真实主题和代理对象实现的具体业务
2.真实主题类:是代理对象所代表的真实对象
3.代理类:提供与真实主题相同的接口,内部有对真实主题的引用,可以扩展,访问,控制真实主题
代理分为静态代理和动态代理
静态代理:
代理类实现一个接口,任何实现该接口的对象,都可以通过代理类进行代理,增加了通用性.
同时,每个代理类都必须实现一遍委托类,如果接口中增加一个方法,代理类也都要跟着改变.
如果委托对象多,这就导致代理类非常庞大臃肿.
动态代理:
因为是在运行时期生成,所以可以对委托类进行统一管理.
分为jdk代理和Cglib代理
jdk代理:
通过反射实现,借助java自带的java.lang.reflect.Proxy,通过固定的规则生成.
步骤:
- 编写一个委托类的接口
- 实现一个真正的委托类
- 创建一个动态代理类,实现invocationHeardler接口,重新invoke方法
- 测试类中,生成动态代理的对象
Cglib代理:
采用字节码技术;
原理是通过字节码为一个类创建子类,并在子类中国拦截父类的所有方法的调用.插入横向逻辑.
由于是继承,所有不能对finnal修饰的类处理.
实现方法:
- 引入cglibjar包
- 动态构建子类
- 代理的类不能被final修饰,否则会报错
- 目标对象如果是final或static修饰,则不会只想目标对象的额外业务代码.
小结:
- 俩个动态代理都是实现springAOP的基础
- Cglib的性能比jdk的好,但是效率比jdk低
- 所以对象单例的对象,Cglib比较适合,反之jdk更加适合
- 由于Cglib是动态创建子类的方式(继承),所以对于final修饰的类无法代理
注解:
什么是注解:
java注解又称为java标注,java语言中的类,方法,变量,参数,包等都可以被标注
可以通过反射获取标注,编译器生成类文件时,标注可以被嵌入到字节码文件中.
java虚拟机可以保留标注内容,在运行时可以获取到标注内容
支持自定义标注
内置的注解:
@Override–检查是否是重写方法
@Deprecated-- 标记过期方法
@SuppressWarnings-- 压制忽略警告信息