Spring IoC 容器初始化主体流程
Spring IoC容器初始化主体流程Spring IoC 的容器体系IoC 容器是 Spring 的核心模块,是抽象了对象管理、依赖关系管理的框架解决方案。Spring 提供了很多的容器,其中 BeanFactory 是顶层容器(根容器),不能被实例化,它定义了所有 IoC 容器必须遵从的一套原则,具体的容器实现可以增加额外的功能。比如我们常用到的 ApplicationContext,其下更具体的实现如 ClassPathXmlApplicationContext 包含了解析 xml 等一系列的内容, AnnotationConfigApplicationContext 则是包含了注解解析等一系列的内容。Spring IoC 容器继承体系非常灵活,需要使用哪个层次用哪个层次即可,不必使用功能大而全的。
BeanFactory 顶级接口方法栈12345678910111213141516171819202122232425262728293031323334353637public interface BeanFactory { /** * 返回 Factor ...
Spring Bean 的作用范围及生命周期
scope 定义 Bean 的作用范围
singleton(默认值):单例模式的 bean 对象生命周期与容器相同对象出生:当创建容器时,对象就被创建了对象活着:只要容器在,对象一直活着对象死亡:当销毁容器时,对象就被销毁了
prototype:多例模式的 bean 对象,spring 框架只负责创建,不负责销毁对象出生:当使用对象时,创建新的对象实例对象活着:只要对象在使用中,就一直活着对象死亡:当对象⻓时间不用时,被 Java 的垃圾回收器回收了
Spring Bean 的生命周期
测试一下效果12345678910111213141516171819@Componentpublic class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if ("l ...
实现一个简单的 AOP 功能
实现一个简单的 AOP 功能
实现一个简单 IoC 容器
实现一个简单 IoC 容器定义需要实例化对象的类的全限定类名以及类之间依赖关系的描述。
核心代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758public class BeanFactory { private final static Map<String, Object> map = new HashMap<>(); static { InputStream resource = Resource.getResourceAsStream("beans.xml"); SAXReader saxReader = new SAXReader(); try { Document document = saxReader.read(resource); El ...
什么是 IoC 和 AOP?
IoC什么是IoC?IoC Inversion of Control(控制反转/反转控制),注意它是一个技术思想,不是一个技术实现描述的事情:Java开发领域对象的创建、管理的问题传统开发方式:比如类A依赖于类B,往往会在类A中new一个B的对象IoC思想下开发方式:我们不用自己去new对象了,而是由IoC容器(Spring框架)去帮助我们实例化对象并且管理它,我们需要使用哪个对象,去问IoC容器要即可我们丧失了一个权利(创建、管理对象的权利),得到了一个福利(不用考虑对象的创建、管理等一系列事情)。
为什么叫做控制反转?控制:指的是对象创建(实例化、管理)的权利反转:控制权交给外部环境了(Spring框架、IoC容器)
IoC解决了什么问题IoC解决对象之间的耦合问题。
IoC 和 DI 的区别DI:Dependancy Injection(依赖注入)怎么理解: IOC 和 DI 描述的其实是同一件事情,只是⻆度不一样。
AOPAspect Oriented Programming 面向切面编程/面向方面编程,AOP是OOP的延续。
OOP:OOP三大特征:封装、 ...
Spring 声明式事务
Spring 中事务的 APImybatis:sqlSession.commit();hibernate:session.commit();
PlatformTransactionManager
12345678910111213141516171819public interface PlatformTransactionManager { /** * 获取事务状态信息 */ TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException; /** * 提交事务 */ void commit(TransactionStatus status) throws TransactionException; /** * 回滚事务 */ void rollback(TransactionStatus status) throws TransactionExcepti ...
Spring AOP
AOP 术语在不改变原有业务逻辑的情况下增强横切逻辑,横切逻辑代码往往是权限校验代码、日志代码、事务控制代码、性能监控代码。
名词
解释
Joinpoint(连接点)
它指的是那些可以用于把增强代码加入到业务主线中的点。在方法执行的前后通过动态代理技术加入增强的代码。在 Spring 框架 AOP 思想的技术实现中,也只支持方法类型的连接点。
Pointcut(切入点)
它指的是那些已经把增强代码加入到业务主线进来之后的连接点。由上图中,我们看出表现层 register 方法就只是连接点,因为判断访问权限的功能并没有对其增强。
Advice(通知/增强)
它指的是切面类中用于提供增强功能的方法。并且不同的方法增强的时机是不一样的。比如,开启事务肯定要在业务方法执行之前执行;提交事务要在业务方法正常执行之后执行,而回滚事务要在业务方法执行产生异常之后执行等等。这些就是通知的类型。其分类有:前置通知 后置通知 异常通知 最终通知 环绕通知。
Target(目标对象)
它指的是代理的目标对象。即被代理对象。
Proxy(代理)
它指的是一个类被 AOP ...
Spring IoC 高级特性
lazy-Init 延迟加载ApplicationContext 容器的默认行为是在启动服务器时将所有 singleton bean 提前进行实例化。提前实例化意味着作为初始化过程的一部分,ApplicationContext 实例会创建并配置所有的 singleton bean。
123<bean id="lazyResult" class="com.lagou.edu.pojo.Result"/>该bean默认的设置为<bean id="lazyResult" class="com.lagou.edu.pojo.Result" lazy-init="false"/>
lazy-init=”false”,立即加载,表示在spring启动时,立刻进行实例化。如果不想让一个singleton bean 在 ApplicationContext 实现初始化时被提前实例化,那么可以将 lazy-init 设置为true。
1<bean id=&quo ...
Spring 入门
BeanFactory 与 ApplicationContext 区别BeanFactory 是 Spring 框架中 IoC 容器的顶层接口,它只是用来定义一些基础功能,定义一些基础规范,而 ApplicationContext 是它的一个子接口,所以 ApplicationContext是具备 BeanFactory 提供的全部功能的。通常,我们称 BeanFactory 为 SpringIOC 的基础容器,ApplicationContext 是容器的高级接口,比 BeanFactory 要拥有更多的功能,比如说国际化支持和资源访问(xml,java配置类)等等。
使用 Spring IoC 容器的方式XML 方式xml 文件头1234567<?xml version="1.0" encoding="utf-8" ?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3 ...
给SpringCloud-Gateway加全局过滤器,添加请求日志
给Gateway加全局过滤器,添加请求日志