【理解Spring】系列前言
在开发中,Spring 是我使用最多的框架,故而对它进行更深入的学习,可以更快的实现想要的功能,同时写出更优雅的代码。
基于 Spring Framework 5.3.10-SNAPSHOT 学习,后续博文内容对应此版本
核心原理
[[Spring核心接口]]
BeanDefinition
抽象 BeanDefinition
BeanFactory
ApplicationContext
BeanPostProcessor
FactoryBean
Spring启动
Spring扫描
Spring初始化所有非懒加载单例Bean
...
【Spring实战】动态获取Bean
在开发中,常常会定义接口,后对接口进行实现。实现的方式可能有一种,也可能有多种,在不同的场景,需要调用不同的实现。
例如
public interface Azh3ngService {
void foo();
}
public class AaAzh3ngServiceImpl implements Azh3ngService {
@Override
public void foo() {
System.out.println("aa");
}
}
public class BbAzh3ngServiceImpl implements Azh3ngService {
@Override
public void foo(...
【Spring实战】@Qualifier 注解的使用
在使用 Spring 的过程中,当需要进行依赖注入时,往往会选用 @Autowired 注解进行自动装配,如果被 @Autowired 注解的类在 Spring 中有多个 Bean,则通过变量名称选取合适的 Bean,例如:
@Component
public class FooService implements BaseService {
}
@Component
public class BarService implements BaseService {
}
@Component
public class SomeBean {
@Autowired
private BaseService barService; // 根据变量名称会找到 BarServi...
【理解Spring】事务
在 Spring 中,事务有两种实现方式:
编程式事务管理:编程式事务管理使用 TransactionTemplate 可实现细粒度的事务控制
声明式事务管理:基于 Spring AOP 实现。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务
开发中更常使用声明式事务,因为不会入侵代码,通过 @Transactional 注解即可以完成事务管理
声明式事务基于 Spring AOP 实现:向 Spring 中添加 BeanPostProcessor 扫描被 @Transactional 注解的类,生成代理对象,通过代理对象完成事务管理
使用示例
编程式事务使用示例
使用 TransactionTe...
【理解Spring】TargetSource
org.springframework.aop.TargetSource
TargetSource的使用
在 Spring AOP 中,通常被代理对象就是 Bean 对象,由 BeanFactory 创建。
同时 Spring AOP 中提供了 TargetSource 接口,可以自定义逻辑创建被代理对象。例如 @Lazy 注解,当加在属性上时,会产生一个代理对象赋值给这个属性,产生代理对象的代码为:
org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver#buildLazyResolutionProxy
public class ContextAnnotationAutowi...
【理解Spring】ProxyFactory
Spring 对 JDK动态代理 和 CGLIB动态代理 进行了一定程度的封装,提供一个类 ProxyFactory,更加方便的创建代理对象。
创建代理对象
代码示例:
public interface Azh3ngInterface {
void test();
}
public static class Azh3ngInterfaceImpl implements Azh3ngInterface {
public void test() {
System.out.println("test...");
}
}
public class TestProxyFactory {
public static void main(Stri...
理解 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...
共计 47 篇文章,6 页。