20230320整理
创始人
2025-05-31 13:32:43
0

1.Spring IOC

使用对象时候由主动new对象转换成由外部提供对象,此过程中对象的创建权由程序转移到外部,这种思想叫做控制反转。也就是说把Bean的创建交给spring进行管理,我们只需要通过配置或者注解就可以拿到该对象进行使用。
如何告知IOC去管理bean对象 —通过配置文件/注解
被管理的对象交给IOC容器,如何获取IOC容器?(接口)

 ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

IOC容器得到后,如何获取bean?
getBean的参数就是我们在配置文件当中的id;

 bookServiceImp imp = (bookServiceImp) context.getBean("bookServiceImp");

依赖注入的方式:
(1)Set方式注入:
这个时候它就会通过反射来创建对象
调用的是无参构造方法,就算构造器私有也可以调用
然后读取到property标签中对应的属性值
比如说,读取到标签的name属性值为mapper,参照bookMapperImp类 (如果属性是不是对象的话 那么就是 value)
这个时候,IOC就会调用对应的set方法为这个属性赋值(将上方读取到的 属性值 set(bookMapperImp) 进去,为 BookServiceImp提供mapper对象)
如果我们写的实体类中没有提供对应的set方法,那么就会报错。

   


(2)构造器的方式:
bean.xml配置文件
属性的添加方式是 constructor

    //这里的name是我们构造方法中的参数名

通过构造器注入这个属性,我们配置文件中将mapper这个属性的添加方式提供了,那么接下来就是IOC容器调用构造方法将bean.xml文件中的属性注入到bookServiceImp
(3)依赖的自动装配:
概念:IOC容器根据bean所依赖的资源在容器中自动查找 并注入到bean的过程叫做 自动装配
bean.xml 那么这个里头的话 我们就不要再写 property 因为我们是自动查找依赖 一般使用的是按类型。
这种方式其实也需要set方法,将属性注入进去

    

自动装配注意事项
自动装配用于引用类型依赖注入,不能对简单类型进行操作
使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效
(4)注解
@component注解或者衍生注解修饰的bean

2.Spring Bean 生命周期

2.1 Bean的作用域
singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
prototype : 每次请求都会创建一个新的 bean 实例。
request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
global-session: 全局 session 作用域,仅仅在基于 Portlet 的 web 应用中才有意义,Spring5 已经没有了。Portlet 是能够生成语义代码(例如:HTML)片段的小型 Java Web 插件。它们基于 portlet 容器,可以像 servlet 一样处理 HTTP 请求。但是,与 servlet 不同,每个 portlet 都有不同的会话。

题外问题:单例 Bean 的线程安全问题了解吗?
单例 Bean 存在线程问题,主要是因为当多个线程操作同一个对象的时候是存在资源竞争的。
常见的有两种解决办法:1.在 Bean 中尽量避免定义可变的成员变量。
2.在类中定义一个 ThreadLocal 成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐的一种方式)。不过,大部分 Bean 实际都是无状态(没有实例变量)(贫血模型)的(比如 Dao、Service),这种情况下, Bean 是线程安全的。

2.2 Spring Bean 的生命周期
(1)实例化 Instantiation
(2)属性赋值 Populate
(3)初始化 Initialization
(4)销毁 Destruction
围绕这四个过程,其他只不过是对主流程四个步骤的一系列扩展点而已。这也就是为什么 Spring 的扩展性很好的原因,开了很多的口子,尽可能让某个功能高内聚松耦合,用户需要哪个功能就用哪个,而不是直接来一个大而全的东西。

在这里插入图片描述
结合工作自动生成Controller来说,在应用启动的时候,加载bean的时候,扫描特定的注解,将对应的service自动生成controller类,放到容器中。

3.Spring AOP

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib 生成一个被代理对象的子类来作为代理,如下图所示:
在这里插入图片描述

在这里插入图片描述

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...