理解 CGLIB 动态代理
CGLIB 是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为 JDK 的动态代理提供了很好的补充。通常可以使用 Java 的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB 是一个好的选择。
CGLIB 被广泛的运用在许多 AOP 的框架中,例如 Spring AOP 和 dynaop。Hibernate 使用 CGLIB 来代理单端 single-ended(多对一和一对一)关联。
CGLIB 作为一个开源项目,其代码托管在 github,地址为:https://github.com/cglib/cglib
CGLIB 的原理是动态生成一个被代理类的子类,子类重写被代理的类的所有非 final 的方法。在子类中采用方法拦截的技术拦截所...
理解 JDK 动态代理
JDK动态代理主要涉及两个类:java.lang.reflect.Proxy 和 java.lang.reflect.InvocationHandler
代码示例
首先有一个接口,接口内有一个方法
public interface Azh3ngService {
void foo();
}
Azh3ngServiceImpl 实现接口并完成方法逻辑
public class Azh3ngServiceImpl implements Azh3ngService {
@Override
public void foo() {
System.out.println("do something...");
}
}
Azh3ngHandl...
【理解Spring】AOP
Spring AOP 是对 AOP(面向切面编程)思想的一种实现,使开发者可以更便捷的使用各类工具完成 AOP 编程。
AOP 中的概念并不直观,如果 Spring 重新定义一次可能更加混乱,所以 Spring 为了让开发者更加方便的做到面向切面编程,提供了一套机制,可以称之为 Spring AOP,其本质在 Bean 创建 过程的最后,判断当前 Bean 是否需要进行 AOP,如果需要则会进行 代理模式#动态代理,生成代理对象,由 Spring 管理代理对象,并在自动注入时注入代理对象,交由代理对象执行切面逻辑,完成 AOP。
注意:通过注解的方式定义 Pointcut 和 Advice,并不是 Spring 首创,而是 AspectJ,而且也不仅仅只有 Spring 提供了一...
【理解设计模式】代理模式
![[Pasted image 20220911133612.png]]
代理模式是一种常见的设计模式,代理往往是对被实际调用类的一种包装,使用代理可以简单的将调用转发到实际的对象,也可以提供额外的逻辑,对实际的类进行增强扩展,例如在实际逻辑之前或之后做一些参数权限校验,流的关闭和内存释放等操作。
代理模式如果根据字节码的创建时机来分类,可以分为静态代理和动态代理:
静态代理:在程序运行前就已经存在代理类的字节码文件,代理类和真实主题角色的关系在运行前就确定了
动态代理:在程序运行期间由JVM根据反射等机制动态的生成,所以在运行前并不存在代理类的字节码文件
静态代理
首先有一个接口,接口内有一个方法
public interface FooService {
...
理解 AOP
AOP(Aspect Orient Programming),即面向切面编程。AOP 是一种编程思想,是 OOP(Object Oriented Programming)面向对象编程的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。
以代码举例:
public interface Azh3ngInterface { void save(); }
public class Azh3ngService implements Azh3ngInterface {
@Override
public void doSave() {
// do save...
}
}
定义了一个接口和一个实现类,其中有一个方法 d...
【理解Spring】解决循环依赖
什么是循环依赖?
举个例子:
@Component
public class ObjectA {
@Autowired
private ObjectB b;
}
@Component
public class ObjectB {
@Autowired
private ObjectA a;
}
以上示例表示在 Spring 容器中定义了两个单例 bean:ObjectA 和 ObjectB,这两个 bean 相互依赖对方,都需要对方的实例注入到自己的属性中,这就属于循环依赖。同理,当 ObjectA 依赖 ObjectB 依赖 ObjectC … ObjectX 依赖 ObjectA 也属于循环依赖。
为什么要解决循环依赖
Spring 启动时,在 B...
【理解Spring】自动注入对 static 字段不支持的原因
举个例子:
有一个原型类 OrderService
@Component
@Scope("prototype")
public class OrderService {
}
和另一个原型类 UserService,UserService 中有一个静态属性 OrderService orderService 并被 @Autowired 标注
@Component
@Scope("prototype")
public class UserService {
@Autowired
private static OrderService orderService;
public void test() {
System.out.println("t...
【理解Spring】依赖注入
Spring 依赖注入包含两种 [[依赖注入类型]]
[[依赖注入类型#手动注入]] :手动指定属性的值
[[依赖注入类型#自动注入]] :利用 Spring 自动寻找可能的 bean 对象,并赋值到属性
其中自动注入又分为三种类型:
[[依赖注入类型#XML 的 autowire 自动注入]]
[[依赖注入类型#Autowire 注解自动注入]]
[[依赖注入类型# @Resource 注解的自动注入]]
Spring 依赖注入过程大致为:
寻找注入点
遍历注入点进行注入
注入过程中进行 依赖查找
@Autowire 注解自动注入和 @Resource 注解的自动注入有些许区别,但大体相同。
寻找注入点
@Autowire 寻找注...
共计 49 篇文章,7 页。