主页

【理解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...

阅读更多