20230320整理

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方法,那么就会报错。

   <!-- id:相当于类别名-->
    <!-- class:引入的类-->

    <bean id = "bookMapperImp" class="com.wyi.mapper.Imp.bookMapperImp"/>

    <bean id = "bookServiceImp" class="com.wyi.service.Imp.bookServiceImp">

<!--        property:表示的是配置当前bean的属性-->
<!--        name:表示当前bean的属性名称-->
<!--        ref:参照哪一个bean
			ref:bean对象的属性是引用类型,value:bean对象的属性是基本类型		-->
        <property name="mapper" ref="bookMapperImp"/>
    </bean>

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

    <bean id = "bookServiceImp" class="com.wyi.service.Imp.bookServiceImp">
    	//这里的name是我们构造方法中的参数名
        <constructor-arg name = "mapper" ref="bookMapperImp"/>
    </bean>

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

    <bean id = "bookMapperImp" class="com.wyi.mapper.Imp.bookMapperImp"/>
    <bean id = "bookServiceImp" class="com.wyi.service.Imp.bookServiceImp" autowire="byType"/>

自动装配注意事项
自动装配用于引用类型依赖注入,不能对简单类型进行操作
使用按类型装配时(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 生成一个被代理对象的子类来作为代理,如下图所示:
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值