Spring框架 IOC

IOC(Inversion Of Control)

功能

将主动通过new实例化的过程,交给Spring负责
Control:控制类的对象
Inversion:转交给Spring负责
核心作用:解耦(程序员不需用管理对象)

配置文件

1)、导入jar包
四个核心(beans、context、core、expression)
一个日志包(commons-logging)
2)、配置文件头
①配置文件的信息最终存储到了AppliationContext容器中
文件名和路径自定义(一般直接在src下)
②基于XML Schema(.xsd)
根元素为<beans>
需引入xmlns、xmlns:xsi及xsi:schemaLocation

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd">

3)、<bean>元素
该元素可将相关类的实例化交给容器,让Spring容器来管理相关对象
一般使用属性id(对象在容器中的标识)、class(类路径)
如:

<bean id="EmptyTest" class="com.mfqh.pojo.Test"></bean>

提取容器中创建的对象

①先获取到Spring容器(此处使用文件路径XML解析的实现类)

ApplicationContext aContext = new ClassPathXmlApplicationContext("配置文件")

②通过容器的getBean(id号)方法来提取对象

Test myTest = aContext.getBean("EmptyTest", Test.class);

Ps:此处在参数中指定类.class,就可直接转为该类对象,默认为Object
Tips:aContext.getBeanDefinitionNames()可获取到容器中的所有对象

Spring创建对象的三种方式

①通过构造方法(无参(默认),有参(明确配置))
有参:
使用<bean>子元素<construction-arg /> 进行参数设置:

<!-- 有参构造 -->
<bean id="DefaultTest" class="com.mfqh.pojo.Test">
     <constructor-arg name="index" value="1"></constructor-arg>
     <constructor-arg index="1" type="java.lang.String" value="aaa"></constructor-arg>
</bean>

属性:
index表参数的索引(从0开始),name表参数名,type表类型
ref为引用类型,value为基本类型或String等(int和Integer有区别)
Ps:对于参数顺序不同的重载构造函数,默认调最后一个,可通过同时设置index、name、type进行控制

②实例工厂(先创建工厂再生产对象)
先声明一个实例工厂,再使用<bean/>产生工厂对象
<bean/>元素使用属性:id、factory-bean=“factory bean Id”、factory-method=“方法名”

<!-- 实例工厂 -->
<!-- 先创建工厂对象 -->
<bean id="TestFactory" class="com.mfqh.factory.TestFactory"></bean>
<!-- 再使用工厂对象建立实例对象 -->
<bean id="ProduceTest" factory-bean="TestFactory" factory-method="instanceTest"></bean>

③静态工厂(不需创建工厂(需声明),直接生产对象)
<bean/>元素使用属性:id、class=“工厂路径”、factory-method=“方法名”

<!-- 静态工厂 -->
<bean id="StaticProduceTest" class="com.mfqh.factory.TestStaticFactory" factory-method="instanceTest"></bean>

给Bean属性赋值(注入)

①构造方法赋值(同上直接定义有参构造,或工厂中执行有参构造)

②设置注入(通过set方法)
<bean>子元素<property/>实现赋值,属性:
name=“属性名”、value=“值”(简单类型或String)
或者子元素:
如,对于attributeTest类的属性进行赋值:

public class attributeTest {
 	//普通和引用类型
 	private int number;
 	private char[] theArray;
 	private Set<String> theSet;
 	private List<String> theList;
 	private Map<Integer,String> theMap;
 	
	//各个属性对应的get/set方法
}

普通:<value>值</value>

<!-- 普通类型 -->
<property name="number">
      <value>1</value>
</property>
 <!-- 或<property name="number" value="1"></property> -->

集合:<set><value>值1</value><value>值2</value></set>

<!-- Set集合 -->
<property name="theSet">
 	<set>
       		<value>apple</value>
       		<value>banana</value>
       		<value>grape</value>
      </set>
</property>

列表:<list><value>值1</value><value>值2</value></list>
若只有一个值<property name="" value=""/>

<!-- List同Set,当只有一个值时 -->
<property name="theList" value="first"></property>

数组:<array><value>值1</value><value>值2</value></array>
若只有一个值<property name="" value=""/>

<!-- 数组类型 -->
<property name="theArray">
      <array>
       		<value>a</value>
       		<value>b</value>
       		<value>c</value>
      </array>
</property>

键值对:<map><entry key="" value=""/><entry key="" value=""/></map>

<!-- 键值对 Map -->
  <property name="theMap">
   	<map>
    		<entry key="1" value="sky"/>
    		<entry key="2" value="lea"/>
   	</map>
</property> 

Property类型:<pros><pro key="">值</pro></pros>

对以上数据使用aContext.getBeanDefinitionNames()进行测试:
在这里插入图片描述

scope属性

对于Spring管理的对象,默认是单例的:
在这里插入图片描述
为<bean>的属性,控制对象的有效范围(单例,多例)
scope有两个普通值:
singleton:单例(默认),取出来的总是一个对象
prototype:多例,取出来的对象都不相同
在这里插入图片描述
其他可取值(web项目):
request:每次请求重新实例化
seesion:每个会话对象内,是单例的
application:在application内,对象是单例的(等同于单例)
global session:spring推出的对象,依赖于spring-webmvc-portlet包,类似于session(四大作用域之外)

发布了82 篇原创文章 · 获赞 1 · 访问量 1454

猜你喜欢

转载自blog.csdn.net/qq_41891805/article/details/105123029
今日推荐