ioc配置文件

本文介绍了Spring框架的基础概念,包括其核心特性如IOC、DI及AOP等,详细讲解了依赖注入的各种方式,如属性注入、构造器注入和工厂方法注入等,并探讨了bean的生命周期、作用域以及如何使用外部属性文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring 是什么


Spring = IOC (DI) + AOP


IOC 反转控制   DI 依赖注入   AOP 面向切面编程


spring的特性:
1 轻量级
2 依赖注入
3 AOP
4 容器  spring是一个容器 它包含并管理了应用对象的生命周期
5 框架   xml+java注解
6 一站式 




IOC 思想  : 反转资源获取的方向


传统的资源查找方式 要求组件向容器发起请求查找资源  ,作为回应,容器适时地返回资源


IOC 容器主动地将资源推送给它所管理的组件。组件所要做的仅仅是选择一种合适方式来接收资源  这种行为也被称为查找的被动形式


DI 组件以一些预先定义好的方式  (比如说setter方法) 接收来自容器的资源注入


IOC 前生  :  分离接口与实现  采用工厂设计模式  采用反转控制


IOC 容器类型:
1  ApplicationContext  是BeanFactory的子接口  提供了更多的特性  面向spring框架的开发者 ,几乎所有的场合都在直接使用applicationContext  而非底层的BeanFactory
2 BeanFactory   IOC 容器最基本的实现   是Spring框架的基础设施,面向的是spring本身   (了解)




ApplicationContext 的主要实现类:


ClassPathXmlApplicationContext  从类路径下加载配置文件、
FileSystemXmlApplicationContext  从文件系统中加载配置文件




ConfigurableApplicationContext  
新增加了两个方法  refresh() 和close()
使ApplicationContext  具有启动 刷新和关闭上下文的能力


WebApplicationContext  为web应用准备  它允许从相对于web根目录的路径中完成初始化工作




Spring 支持3中依赖注入的方式:


1.属性注入:

注意: 当使用属性注入时, 类中 必须有一个无参的构造器

<!-- 配置bean 
id: 标示容器中bean   id 必须是唯一的   id 也可以指定多个名字   名字之间可以用逗号  分号  或者是空格分隔
class: bean 的全类名  通过全类名配置的方式也叫反射配置
-->
<bean id="helloWorld"  class="com.neuedu.spring.beans.HelloWorld">
<!-- 属性注入  -->
<property name="name1"  value="wangwu"></property>
</bean>

2.构造器注入
<!-- 构造器注入 -->
<bean id="helloWorld2" class="com.neuedu.spring.beans.HelloWorld">
<!-- 构造器注入使用 constructor-arg  没有name  只有value-->
<constructor-arg value="zhangsan"></constructor-arg>
</bean>


<!-- 当bean的构造方法有多个参数时  默认按照顺序去加载 -->
<bean id="car" class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi"></constructor-arg>
<constructor-arg value="Shanghai"></constructor-arg>
<constructor-arg value="1000000"></constructor-arg>
</bean>

<!-- 可以通过类型区分构造器参数 -->
<bean id="car2" class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi"></constructor-arg>
<constructor-arg value="Shanghai"></constructor-arg>
<constructor-arg value="260"  type="int"></constructor-arg>
</bean>

<!-- 可以通过index 去精确定位参数  index="" value="" 必须有双引号包裹 -->
<bean id="car3" class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi"  index="1"></constructor-arg>
<constructor-arg value="Shanghai" index="0"></constructor-arg>
<constructor-arg value="260"  type="int"></constructor-arg>
<constructor-arg value="1000000"  type="double"></constructor-arg>
</bean>

<!-- 如果字面值有特殊符号,那么使用 <![CDATA[XXX]]> 进行包裹-->
<bean id="car4" class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi"  index="1"></constructor-arg>
<constructor-arg  index="0">
<value><![CDATA[<shanghai>]]></value>
</constructor-arg>
<constructor-arg value="260"  type="int"></constructor-arg>
<constructor-arg value="1000000"  type="double"></constructor-arg>
</bean>

字面值: 可用字符串表示的值  可以通过<value> 元素 标签或者是value 属性进行注入
若字面值中含有特殊符号 ,可以使用<![CDATA[XXX]]> 进行包裹


3.工厂方法注入(很少使用,不推荐)






引用其他bean


<!-- 引用其他bean  通过ref属性指定当前属性指向哪一个bean  指向的是bean的id -->
<bean id="person" class="com.neuedu.spring.beans.Person">
<property name ="name"  value="Tom"></property>
<property name ="age" value="18"></property>
<property name ="car" ref="car4"></property>
</bean>


<!-- 还可以通过ref 元素标签 指定当前属性指向哪一个bean
注: ref 标签没有下一级元素 ,需要给bean属性赋值  而没有value属性
-->
<bean id="person2" class="com.neuedu.spring.beans.Person">
<property name ="name"  value="jack"></property>
<property name ="age" value="25"></property>
<property name="car">
<ref bean="car3"></ref>
</property>
</bean>



内部bean :


当Bean实例 仅仅给一个特定的属性使用时,可以将其声明为内部bean 


内部bean声明可以直接包含在<property> 或者是<constructor-arg>元素里 不需要设置任何的id和name属性


内部bean 不能使用在其他任何地方


<bean id="person3" class="com.neuedu.spring.beans.Person">
<property name ="name"  value="Rose"></property>
<property name ="age" value="28"></property>

<property name ="car">
<!-- 内部bean 不能被外部引用  只能在内部使用 -->
<bean  class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi"  index="0"></constructor-arg>
<constructor-arg  index="1">
<value><![CDATA[<shanghai>]]></value>
</constructor-arg>
<constructor-arg value="240"  type="int"></constructor-arg>
<constructor-arg value="800000"  type="double"></constructor-arg>
</bean>
</property>
</bean>


<!-- constructor-arg 元素标签去配置内部bean -->
<bean id="person4" class="com.neuedu.spring.beans.Person">
<constructor-arg value="Lucy"></constructor-arg>
<constructor-arg value="24"></constructor-arg>
<constructor-arg>
<bean  class="com.neuedu.spring.beans.Car">
<constructor-arg value="Audi"  index="0"></constructor-arg>
<constructor-arg  index="1">
<value><![CDATA[<shanghai>]]></value>
</constructor-arg>
<constructor-arg value="240"  type="int"></constructor-arg>
<constructor-arg value="800000"  type="double"></constructor-arg>
</bean>
</constructor-arg>
</bean>

赋空值


<!-- 如果属性不赋值 那么默认是null -->
<bean id="person5" class="com.neuedu.spring.beans.Person">
<property name ="name"  value="Lily"></property>
<property name ="age" value="16"></property>
</bean>

<!-- 属性赋空值  则使用<null/> 元素标签 -->
<bean id="person6" class="com.neuedu.spring.beans.Person">
<property name ="name"  value="Jenny"></property>
<property name ="age" value="19"></property>
<property name="car"><null/></property>
</bean>




集合属性

在spring中可以通过一组内置的xml标签(比如说list set map)来配置集合属性

配置java.util.List类型的属性,需要用指定的<list> 标签

在标签中可以包含一些元素 可以通过<value> 标签可以指定简单的常量值  通过<ref>标签 指定对其他bean的引用  通过<null/> 自定空元素   甚至可以内嵌其他集合

数组的定义和List一样 ,都使用<list> 标签

配置 java.util.Set 需要使用<set> 标签,用法与<list> 相同

<!-- 集合属性的配置方式-->
<bean id="person7" class="com.neuedu.spring.beans.Person">
<property name ="name"  value="Denny"></property>
<property name ="age" value="17"></property>
<property name="car"><null/></property>
<property name="cars">
<list>
<ref bean="car"></ref>
<ref bean="car2"></ref>
<ref bean="car3"></ref>
</list>
</property>
</bean>

java.util.Map <map>标签  可以使用多个<entry>作为子标签  每条包含一个键和一个值
必须在<key>标签中定义键  值<value>  <ref> <null/>


<!-- 集合属性的配置方式   map-->
<bean id="person10" class="com.neuedu.spring.beans.Person">
<property name ="name"  value="Denny"></property>
<property name ="age" value="17"></property>
<property name="car"><null/></property>
<property name="map">
<!-- map 元素中使用entry 子元素来表示一对键值对   其中需要指向其他bean时   使用value-ref属性 -->
<map>
<entry key="AA" value-ref="car"></entry>
<entry key="BB" value-ref="car2"></entry>
</map>
</property>
</bean>


使用<props>定义java.Util.Properties ,该标签使用多个<prop> 作为子标签   <prop> 必须有key属性


<!-- 集合属性的配置方式   properties-->
<bean id="person11" class="com.neuedu.spring.beans.Person">
<property name ="name"  value="Denny"></property>
<property name ="age" value="17"></property>
<property name="car"><null/></property>
<property name="map">
<!-- map 元素中使用entry 子元素来表示一对键值对   其中需要指向其他bean时   使用value-ref属性 -->
<map>
<entry key="AA" value-ref="car"></entry>
<entry key="BB" value-ref="car2"></entry>
</map>
</property>

<property name="properties">
<!-- props 元素中使用prop 子元素  其中prop 元素必须有可以属性 -->
<props>
<prop key="user">root</prop>
<prop key="password">root</prop>
<prop key="jdbcURL">jdbc:mysql://localhost:3306/person</prop>
<prop key="driverClass">com.mysql.jdbc.Driver</prop>
</props>
</property>
</bean>



使用utility scheme 定义集合


使用基本的集合标签定义集合时,不能讲结合作为独立的bean 定义 ,导致其他bean 无法引用该集合 所在无法再不同bean之间共享
注意:使用util scheme里的集合标签定义独立的集合bean时 需要在<beans> 根元素里添加util scheme的定义


<!-- 集合属性的配置方式-->
<bean id="person8" class="com.neuedu.spring.beans.Person">
<property name ="name"  value="jiahong"></property>
<property name ="age" value="22"></property>
<property name="car"><null/></property>
<property name="cars" ref="cars">
</property>
</bean>


<!-- 使用util scheme 声明集合类型的bean -->
<util:list  id="cars">
<ref bean="car4"></ref>
<ref bean="car2"></ref>
<ref bean="car3"></ref>
</util:list>


使用p 命名空间


为了简化xml的配置  使用属性而非子节点配置bean

从spring 2.5开始引入p命名空间 可以通过bean元素的属性来配置bean的属性

<!-- 使用p命名空间 -->
<bean id="helloWorld3" class="com.neuedu.spring.beans.HelloWorld" p:name1="jiaohm">
</bean>

<!-- 使用p命名空间 -->
<bean id="person9" class="com.neuedu.spring.beans.Person" p:name="zhangshaofu" p:age="22" p:car-ref="car">
</bean>



自动装配 autowire

Spring IOC 可以自动装配bean 需要指定 autowire 属性的自动装配模式

byType: 根据类型自动装配  如果IOC容器中有多个和目标bean 类型一致的bean 则无法完成自动装配

byName:  根据名称自动装配  必须将Bean 的名称和属性名设置完全相同

constructor: 通过构造器自动装配  当bean中有多个构造器时 自动装配将会很复杂  不推荐使用


<!-- autowire 自动装配   byName 若属性名和id 保持一致是,可以完成自动装配 -->
<!-- autowire 自动装配   byType 根据类型自动装配  但是要求IOC 容器中同一类型的bean有且只有一个 如果有多个,则无法完成自动装配 -->
<bean id="student" class="com.neuedu.spring.autowire.Student"  p:name="zhangsanfeng"  p:num="1001"  autowire="byType"></bean>

<bean id="address" class="com.neuedu.spring.autowire.Address" p:province="Liaoning" p:city="Shenyang" p:street="Xinxiujie"></bean>

<bean id="grade" class="com.neuedu.spring.autowire.Grade" p:course="Spring" p:score="120"></bean>


bean的继承和依赖


继承:Spring 允许继承bean的配置  被继承的bean 称为父bean 继承父bean的bean 称为子bean   
子bean继承父bean的配置,包括属性配置;同时,也可以覆盖父bean继承过来的配置

<bean id="person9" class="com.neuedu.spring.beans.Person" p:name="zhangshaofu" p:age="22" p:car-ref="car">
</bean>

<!-- bean的继承  使用parent属性 指定父bean -->
<bean id="person12" class="com.neuedu.spring.beans.Person" parent="person9" p:name="baixiaohan">
</bean>

父bean还可以作为配置模板  也可以bean的实例   若作为模板,则Spring 将不会把这个bean 实例化
<!-- 将bean 作为配置模板  需要将abstract属性设置为true  作为配置模板将不会被spring容器实例化 -->
<bean id="person9" class="com.neuedu.spring.beans.Person" p:name="zhangshaofu" p:age="22" p:car-ref="car"  abstract="true">
</bean>

并不是bean中所有的属性都会被继承 例如autowire  abstract .etc

也可以忽略父类的class 属性,让子类指定自己的类,而共享其他相同的属性配置   此时 abstract 属性必须设置为true
  


依赖: spring 允许用户同depends-on属性设定bean的前置依赖bean  前置依赖bean 会在本bean 实例化之前创建好
如果依赖多个前置bean  可以通过逗号 空格分隔

<!-- bean的依赖  使用depends-on属性  指定前置bean  -->
<bean id="person13" class="com.neuedu.spring.beans.Person" parent="person9" p:name="lvheng"  depends-on="person12">
</bean>

bean的作用域

在spring中 ,默认情况下 spring只为 每个在IOC容器声明的bean创建唯一的一个实例,整个IOC容器范围内都能共享该实例
所有后续的getBean()和bean的引用 都是返回这个唯一的实例  这样的作用域称为 单例  singleton   单例是所有bean的默认作用域


类型共有四种
a) singleton 在SpringIOC容器中仅存在一个Bean的实例 ,bean以单例的范式存在
b) prototype 每次调用getBean()时都会返回一个新的实例
c) request 每次http请求时都会创建一个新的bean 仅仅适用于WebApplicationContext 
d) session 同一个httpsession共享一个bean 不同的HttpSession 使用不同的bean  仅仅适用于WebApplicationContext

<!-- scope属性设置为prototype时 每次调用getBean()时都会返回一个新的实例 -->
<bean id="address" class="com.neuedu.spring.autowire.Address" p:province="Liaoning" p:city="Shenyang" p:street="Xinxiujie"  scope="prototype"></bean>


使用外部属性文件

Spring提供了一个PropertyPlaceholderConfigurerde的beanFactory 后置处理器  这个处理器允许用户将bean配置的部分内容外移到属性文件中 
可以在配置文件中使用形式为${xxxx}的变量 PropertyPlaceholderConfigurerde 从属性文件中加载属性,并且用这些属性来替换变量

<!-- 导入外部资源 -->
<context:property-placeholder  location="classpath:name.properties"/>
<bean id="helloWorld4"  class="com.neuedu.spring.beans.HelloWorld">
<!-- 属性注入  -->
<property name="name1"  value="${name}"></property>
</bean>





Spring的语言表达式 SpEL


语法类似于EL:SpEL使用#{XXXX}作为界定符号  

作用:
1) 通过bean的id 对bean进行引用
2)调用方法以及引用对象中的属性
3)计算表达式的值
4)正则表达式的匹配

<!-- 使用SpEL :可以为属性进行赋值  引用其他对象的属性  其他对象的属性必须是public -->
<bean id="helloWorld5" class="com.neuedu.spring.beans.HelloWorld">
<property name="name" value="#{helloWorld4.name}"></property>
</bean>


<!-- 可以用SpEL 可以为属性直接赋值   -->
<bean id="helloWorld6" class="com.neuedu.spring.beans.HelloWorld">
<property name="name" value="#{'lallalal'}"></property>
</bean>


















































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值