IOC 容器
- 1、IOC底层原理
- 2、IOC接口
- 3、IOC操作Bean管理(基于xml)
- 3.1、Bean管理概念
- 3.2、IOC操作Bean管理
- 3.2.1 基于xml方式创建对象
- 3.2.2 基于xml方式注入属性
- 3.2.3 基于xml方式配置
- 3.2.4 p名称空间注入(了解)
- 3.2.5 基于xml方式设置属性值为null、包含特殊符号
- 3.2.6 基于xml注入属性-外部bean和级联赋值
- 3.2.7 基于xml注入数组类型属性
- 3.2.8 基于xml注入List集合类型属性
- 3.2.9 基于xml注入Map集合类型属性
- 3.2.10 基于xml注入Set集合类型属性
- 3.2.10 基于xml设置集合的属性值为对象
- 3.2.11 xml模式中Spring的两种bean
- 3.2.12 基于xml模式理解bean的作用域
- 3.2.13 基于xml模式理解bean的生命周期
- 3.2.14 基于xml配置实现自动装配属性
- 3.2.15 基于xml配置外部属性配置文件(properties配置文件)
- 4、IOC操作Bean管理(基于注解)
前言
本文笔记是基于尚硅谷视频写的,内容很丰富,比较全面,在其基础上又添加了一些个人资料的搜集,综合学习。
https://www.bilibili.com/video/BV1Vf4y127N5?from=search&seid=7188443139506413184
1、IOC底层原理
1.1、IOC概念
-
什么是IOC?
(1) 控制反转,把对象创建和对象之间的调用过程,交给Spring管理
(2) 使用IOC的目的:为了降低耦合度
1.2、IOC底层原理
- IOC底层原理
(1) xml的解析、工厂的设计模式、反射
- 工厂模式(Factory Pattern)是 Java中最常用的设计模式之一。这种类型的设计模式属于创建型模 式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
- JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
- xml解析参考网址:https://www.cnblogs.com/longqingyang/p/5577937.html
2、IOC接口
- IOC的思想基于IOC的容器完成,IOC容器底层就是对象工厂
- Spring提供了IOC容器实现的两种方式:(两个接口)
(1)BeanFactory:IOC容器基本实现,是Spring内部使用的接口,不建议开发人员进行使用*
加载配置文件的时候不会创建对象,在获取对象(使用)才去创建对象
(2)ApplicationContext:BeanFactory的子接口,提供更多更强大的功能,一般由开发人员进行使用*
加载配置文件的时候就会把配置文件对象进行创建
(3)ApplicationContext接口的实现类,比较重要,需要记一下。*
FileSystemXmlApplicationContext*
ClassPathXmlApplicationContext
3、IOC操作Bean管理(基于xml)
3.1、Bean管理概念
- 什么是Bean管理?
Bean管理指的是两个操作
(1)创建对象
(2) 注入属性 - Bean管理的操作方式?
(1)基于xml配置文件方式
(2)基于注解方式
3.2、IOC操作Bean管理
3.2.1 基于xml方式创建对象
(1)在Spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建
<bean id="User" class="com.xx.xx.User"></bean>
(2)在bean标签中有很多属性,这里介绍常用的属性
- id:对象的唯一标识
- class:类的全路径(包类路径)
- name:一般不用,对象的name
(3)创建对象的时候,默认是使用无参构造的方法完成对象的创建
3.2.2 基于xml方式注入属性
(1)DI:依赖注入,就是注入属性,需在创建对象完成的基础上
- 方式一:set方法注入(1、创建一个类 2、设置属性的set方法)
- 方式二:有参构造注入(1、创建一个类、有参的构造方法 2、基于有参构造创建对象的实例对象)
3.2.3 基于xml方式配置
<!--基于xml使用set方法注入将对象注入Spring容器-->
<bean id="User" class="com.xx.xx.User">
<!--通过property完成属性注入-->
<property name="属性名称" value="属性值"></property>
</bean>
<!--基于xml使用有参构造注入的方式将对象注入Spring容器-->
<bean id="User" class="com.xx.xx.User">
<!--通过constructor-arg完成属性注入-->
<constructor-arg name="构造参数名称" value="构造参数值" index="参数的索引值—(不建议使用)"></constructor-arg>
<constructor-arg name="构造参数名称" value="构造参数值"></constructor-arg>
</bean>
3.2.4 p名称空间注入(了解)
<!--基于xml使用p名称空间注入方法将对象注入Spring容器-->
<!--1、在配置文件的头部添加约束配置-->
<beans xmlns:p="http://www.springframework.org/schema/p">
<!--2、使用p进行属性注入,在bean标签里面进行操作-->
<bean id="User" class="com.xx.xx.User" p:属性名称="属性值">
</bean>
3.2.5 基于xml方式设置属性值为null、包含特殊符号
<!--基于xml方式设置属性值为null-->
<bean id="User" class="com.xx.xx.User">
<!--通过property完成属性注入-->
<property name="属性名称">
<null/>
</property>
</bean>
<!--基于xml方式设置属性值包含特殊符号-->
<bean id="User" class="com.xx.xx.User">
<!--
1、转义
2、将特殊符号放在CDATA中 > <
-->
<property name="属性名称" value="<<属性值>>">
<value><![CDATA[属性值]]></value>
</property>
</bean>
3.2.6 基于xml注入属性-外部bean和级联赋值
先理解一下外部bean,创建service和dao两个类,在Service类中调用Dao类的方法
<bean id="service" class="com.xx.xx.Service">
<!--
1、name指的是属性名称
2、ref指的是id为dao的bean对象
-->
<property name="dao" ref="dao"></property>
</bean>
<bean id="dao" class="com.xx.xx.Dao"></bean>
3.2.7 基于xml注入数组类型属性
<!--数组类型属性注入-->
<bean id="xx" class="com.xx.xx.Xx">
<property name="xx">
<array>
<value>属性值</value>
<value>属性值</value>
<value>属性值</value>
</array>
</property>
</bean>
3.2.8 基于xml注入List集合类型属性
<!--List集合类型属性注入-->
<bean id="xx" class="com.xx.xx.Xx">
<property name="xx">
<list>
<value>属性值</value>
<value>属性值</value>
<value>属性值</value>
</list>
</property>
</bean>
3.2.9 基于xml注入Map集合类型属性
<bean id="xx" class="com.xx.xx.Xx">
<property name="xx">
<entry>
<entry key="" value=""></entry>
<entry key="" value=""></entry>
</entry>
</property>
</bean>
3.2.10 基于xml注入Set集合类型属性
<!--Set集合类型属性注入-->
<bean id="xx" class="com.xx.xx.Xx">
<property name="xx">
<set>
<value>属性值</value>
<value>属性值</value>
</set>
</property>
</bean>
3.2.10 基于xml设置集合的属性值为对象
<bean id="user" class="com.xx.xx.User"></bean>
<!--list集合作为例子-->
<bean id="xx" class="com.xx.xx.Xx">
<property name="xx">
<list>
<!--<value>属性值</value>-->
<!--bean为对象的ID-->
<ref bean="user"></ref>
</list>
</property>
</bean>
3.2.11 xml模式中Spring的两种bean
- Spring中有两种bean:
(1)普通bean:在配置文件中定义bean类型就是返回类型;
(2)工厂bean:在配置文件中定义bean类型可以和返回类型不一样;- 实现工厂bean的步骤:
(1)基于xml配置文件将类对象注入IOC容器;
(2)使类对象实现FactoryBean接口,并实现接口的抽象方法;
(3)重构getObject方法,返回Object对象;
3.2.12 基于xml模式理解bean的作用域
在Spring中可以设置单实例对象或者多实例对象,默认为单实例对象。
<!--通过scope属性设置单/多实例对象-->
<!--
1、单实例:singleton
特点:加载Spring配置文件时,就会创建bean对象;
2、多实例:prototype
特点:在执行getXx()时,创建bean对象;
3、请求:request
特点:创建对象时,将对象放入request中;
4、请求:session
特点:创建对象时,将对象放入session中;
-->
<bean id="user" class="com.xx.xx.User" scope="singleton"></bean>
3.2.13 基于xml模式理解bean的生命周期
(bean)生命周期:对象的创建–>对象的销毁
生命周期实现步骤
- 通过构造器创建bean的实例(无参构造)
- 为bean的属性设置值和对其他bean的引用(调用set方法)
- 将bean的实例传递给bean的后置处理器的方法
- 调用bean的初始化方法(需要进行配置)
- 将bean的实例传递给bean的后置处理器的方法
- bean对象可以使用了
- 当容器关闭的时候,调用bean的销毁方法(需要进行配置,并手动调用)
<!--初始化方法和销毁方法在User类中定义-->
<!--(ClassPathXmlApplicationContext)xx.close()-->
<bean id="user" class="com.xx.xx.User" init-method="初始化方法" destroy-method="销毁方法"></bean>
创建后置处理器步骤
- 创建类实现BeanPostProcessor接口
- 实现接口的抽象方法
3.2.14 基于xml配置实现自动装配属性
自动装配:
(1)根据属性名称或者属性值,Spring自动将匹配属性进行注入
<!--
属性类型 属性名称;(理解)
1、autowire="byName" 根据属性的名称进行注入;注入bean的id值和类属性名称保持一致;
2、autowire="byType" 根据属性的类型进行注入;注入bean的类型和类属性类型保持一致;
-->
<bean id="user" class="com.xx.xx.User" autowire="byName"></bean>
3.2.15 基于xml配置外部属性配置文件(properties配置文件)
连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
例:数据库配置文件实现步骤
- 引入druid连接池的jar包
- 在xml配置文件中创建druid连接池对象,并注入属性
- 创建外部属性配置文件(jdbc.properties),配置文件中记录了连接池的信息
- 引入context配置文件,通过配置xml头信息,context配置
- 引入外部属性配置文件
<!--引入外部属性配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--使用外部属性配置文件-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="xx" value="${xx.xx}"></property>
</bean>
4、IOC操作Bean管理(基于注解)
4.1、什么是注解
参考网址:https://www.runoob.com/w3cnote/java-annotation.html
4.2、Spring针对Bean管理中创建对象提供的注解介绍
(1)@Component(Spring的基础配置文件)
(2)@Service
(3)@Controller
(4)@Repository(持久层)
特点:以上的注解都可以用来创建bean实例
基于注解方式实现对象创建步骤
- 引入jar依赖
- 开启组件扫描,告知Spring
- 使用注解
<!--
1、use-default-filters:默认配置
2、context:include-filter:指定扫描配置
3、context:exclude-filter:指定不扫描的配置
-->
<context:component-scan base-package="xx.xx,xx.xx" use-default-filters="false">
<context:include-filter type="annotation" expression="xx.xx.xx"/>
<context:exclude-filter type="annotation" expression="xx.xx.xx"/>
</context:component-scan>
4.2、Spring针对Bean管理中属性注入提供的注解介绍
(1)@AutoWired(根据属性类型进行自动装配)
(2)@Qualifier(根据属性名称进行注入)
(3)@Resource(可以根据属性类型注入,也可以根据属性名称注入,javax提供的)
(4)@Value(注入普通属性,如String类型,上面三个都是Object类型)
特点:以上的注解都可以用来创建bean实例的属性