Spring控制反转IOC
- 控制反转IOC: Inversion of Control 是一种解耦设计原则 主要目的是借助第三方,比如Spring IOC容器实现具有依赖关系的对象之间的解耦,从而降低代码之间的耦合度
- Spring IOC容器: Spring IOC容器负责创建对象并将对象连接在一起,配置这些对象.从创建中处理这些对象的整个生命周期,直到对象被完全销毁 Spring IOC容器类似一个工厂 在创建对象时,只需要配置好配置文件或者是注解即可,不需要关注对象是如何创建的
- 控制反转示例: 对象a依赖于对象b, 当对象a需要使用对象b时必须由对象a创建对象b的实例 引入IOC容器后,当对象a需要使用对象b时,可以指定IOC容器去创建一个对象b注入到对象a中 引入IOC容器之后,对象a获取对象b的过程,由主动行为变为被动行为
- 实现了IOC原则的设计模式: 服务定位器模式ServiceLocator 工厂模式Factory 抽象工厂模式AbstractFactory 模板方法模式TemplateMethod 策略模式Strategy 依赖注入Depedency Inject
- 依赖注入DI: Dependency Inject 将实例变量传入到一个对象中去 是实现控制反转的一种设计模式
- Spring框架中BeanFactory和ApplicationContext类使用工厂模式创建Bean对象
- 延迟注入,即使用到某个Bean时才会进行注入
- 和ApplicationContext相比会占用更少的内存,程序启动速度更快
- 容器启动时就创建所有的Bean
- 和BeanFactory相比 ,BeanFactory仅提供了最基本的依赖注入支持 . ApplicationContext扩展了BeanFactory, 除了BeanFactory的功能外还包含其余更多的功能,通常使用ApplicationContext创建Bean
- ApplicationContext的三个实现类: ClassPathXmlApplication: 将上下文文件作为类路径资源 FileSystemXmlApplication: 从文件系统中的XML文件中载入上下文定义信息 XmlWebApplicationContext: 从Web系统中的XML文件中载入上下文定义信息
- Spring中的Bean的作用域默认就是单例Singleton的 . Spring中的Bean还可以定义以下作用域: prototype: 每次请求都会创建一个新的Bean实例 request: 每一次HTTP请求都会创建一个新的Bean实例,该Bean实例仅在当前HTTP request中有效 session: 每一次HTTP请求都会创建一个新的Bean实例,该Bean实例仅在当前HTTP session中有效
- Spring实现单例Bean的方式: xml的方式: <bean id="bean" class="com.oxford.Bean" scope="singleton"/> 复制代码 注解的方式: @Scope(value=https://www.isolves.com/it/cxkf/kj/2022-02-09/"singleton") 复制代码
- Spring底层通过ConcurrentHashMap实现单例注册表来实现单例模式:
// 通过线程安全的concurrentHashMap实现单例注册表private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(64);public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { Assert.notNull(beanName, "'beanName' must not be null"); synchronized(this.singletonObjects) {// 检查缓存中是否存在实例Object singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null) {...try {singleton = singletonFactory.getObject();}...// 如果实例对象不存在,则将对象注册到单例注册表中addSingleton(beanName, singletonObject);}return (singletonObject != NULL_OBJECT ? singletonObject : null); }}protected void addSingleton(String beanName, Object singletonObject) { synchronized(this.singletonObjects) {this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT)); }}复制代码
代理设计模式ProxyAOP中的代理模式- 面向切面编程AOP: Aspect-Oriented Programming 面向切面编程能够将和业务无关,但是是业务模块中所共同调用的逻辑或者业务功能封装起来, 比如事务管理,日志管理,权限控制等 有利于减少重复代码,降低模块之间的耦合度,并有利于面向未来的可拓展性和可维护性 使用AOP可以将一些通用功能抽象出来,在需要使用的地方直接使用,这样可以大大简化代码量 需要增加新功能也会更加简单方便,这样可以提高系统的扩展性
- Spring AOP基于动态代理实现的: 代理对象实现了接口: Spring AOP会使用JAVA动态代理JDK Proxy创建代理对象 完成对象的代理操作 代理对象没有实现接口: Spring AOP会使用Cglib Proxy生成一个被代理对象的子类作为代理类完成对象的代理操作
推荐阅读
- windows系统中毒,sql server数据库文件恢复抢救和OA程序文件恢复
- 大叶松针滇红茶,大叶滇红茶功效与作用
- python中下载jupyter notebook
- 香浓玉米忌廉汤
- 酿鱿鱼筒汤的做法
- 吃中药后多久能喝红茶,喝中药能喝的茶有哪些功效与作用是什么意思
- 诗经中的经典名句有哪些?
- 中国现代十大作家有哪些?
- “文房四宝”中的毛笔是谁发明的?
- 吃中药喝红茶有影响吗,喝中药能喝的茶有哪些功效与作用吗