一、Spring中IOC的原理及用法(基础理解)

Spring框架的介绍

  1. Spring是分层的java SE/EE应用的full-stack轻量级开源框架。
  2. 它是以IOC控制反转(Inversion Of Control)和AOP面向切面编程(Aspect Oriented Programming)为核心。
  3. 提供了表现层springmvc和持久层Spring JDBC以及业务层的事务管理等企业级应用解决方案
  4. 将开源世界中众多优秀的第三方框架和类库整合。

spring的优点:

● IOC解耦,简化开发

● AOP面向切面编程支持

● 生命式事务支持

● 方便程序测试

● 集成第三方优秀框架

一、IoC的概念

这种将创建对象的权利,由在程序代码中主动new对象的方式,转变为由工厂类创建并且提供给我们,我们使用的时候从容器中去取,变成被动接收的方式,称为控制反转。

IoC本质上就是工厂模式,原来我们是自己主动创建一个对象,主动去获取一个资源。

//Car是接口, 后面是实现类
Car bmw = new Bmw();
Car benZ = new BenZ();
Car audi = new Audi();

 现在使用工厂模式,我们需要的对象由工厂去创建,我们不再自己创建,我们只消费对象。

Car bmw = BeanFactory.getBean("bmw");
Car benZ = BeanFactory.getBean("benZ");
Car audi = BeanFactory.getBean("audi");

(1)使用IOC有什么好处?

  1. 降低类与类之间的耦合度
  2. 我们不再需要自己创建对象,只要使用对象就可以了
  3. 使用Spring框架就是使用工厂模式来创建对象,由Spring容器帮我们管理所有的Java对象

(2)创建容器的三种方式

  1. 类路径配置文件创建容器: ClassPathXmlApplicationContext(“Spring配置文件名字”)
  2. 本地文件绝对路径创建容器(全路径):FileSystemXmlApplicationContext
  3. 纯注解方式创建容器:  AnnotationConfigApplicationContext

二、属性注入

bean标签

bean标签的属性说明

属性说明
id容器中唯一的标识
name还可以有多个名字,逗号、空格、分号隔开
class指定类全名,指定的是实现类,不是接口
scope

指定bean在容器中作用范围  

singleton:默认值,表示这个是单例对象,整个容器中只会创建一个对象

prototype:多例对象,每次获取一个新的对象

request:用于请求域

session:用于会话域

application:用于上下文域

globalsession:用于全局的会话,在分布式开发中

init-method创建对象时,执行的初始化方法
destroy-method销毁对象时,执行的方法
lazy-init是否使用延迟加载,默认是不使用

bean的生命周期

scope属性

bean的作用范围和生命周期的说明

scope取值作用范围生命周期
singleton单例对象

容器一创建就创建这个对象,只要容器不销毁就

一直存在

出生:容器创建就出生

活着:只要容器没有销毁就一直存在

死亡:容器关闭时

prototype多例对象

每次获取对象就创建一个新的对象,使用完毕会

被GC垃圾回收机制回收

出生:获取对象的时候

活着:使用过程中

死亡:由GC回收

(1)依赖注入(Dependency Injection,简称DI )

        1.构造方法注入 applicationContext.xml

<!--
1. 使用构造方法注入
子元素:constructor-arg 构造方法注入
    index:每几个位置,从0开始
    name:指定形参的名字
    type:指定参数的类型
    value:简单类型的值:8种基本类型+String类型
    ref:赋值引用类型,指定对象的id
 -->
<bean class="com.itheima.entity.Customer" id="customer">
    <constructor-arg name="id" value="100"/>
    <constructor-arg name="name" value="白骨精"/>
    <constructor-arg name="male" value="true"/>
    <constructor-arg name="birthday" ref="birthday" type="java.util.Date"/>
</bean>

<!-- 引用类型:现在的时间 -->
<bean class="java.util.Date" id="birthday"/>

        2.set方法注入 applicationContext.xml

<!-- 2.使用set方法注入 -->
<bean class="com.itheima.entity.Customer" id="customer">
    <!-- 属性名:为id value为200 -->
    <property name="id" value="200"/>
    <property name="name" value="猪八戒"/>
    <property name="male" value="true"/>
    <property name="birthday" ref="birthday"/>
</bean>

<!-- 引用类型:现在的时间 -->
<bean class="java.util.Date" id="birthday"/>

        3.p命名空间注入 applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
  
    <!-- 使用p命名空间注入,本质上还是set注入
      1. 导入p命名空间
      2. 简单类型的格式:p:属性名="值"
         引用类型的格式:p:属性名-ref="id"
       -->
    <bean class="com.itheima.entity.Customer" id="customer" p:id="300" p:name="孙悟空" p:male="false" p:birthday-ref="birthday"/>

    <!-- 引用类型:现在的时间 -->
    <bean class="java.util.Date" id="birthday"/>
</beans>
p名称空间描述
p:属性名注入简单类型
p:属性名-ref注入引用类型

(2)集合属性注入

        1.单例集合

  <!-- list类型 -->
    <property name="list">
        <list>
            <value>张飞</value>
            <value>关羽</value>
            <value>刘备</value>
        </list>
    </property>

        2.双例集合

 <!-- map集合,所有的双引集合也是可以通用的 -->
    <property name="map">
        <map>
            <entry key="cn" value="中国"/>
            <entry key="usa" value="美国"/>
            <entry key="jp" value="日本"/>
        </map>
    </property>

        3.属性集合

   <!-- property集合 -->
    <property name="prop">
        <props>
            <prop key="gz">广州</prop>
            <prop key="sh">上海</prop>
            <prop key="bj">北京</prop>
        </props>
    </property>

三、注意

  1. 创建容器时,配置文件中的所有类都会被实例化
  2. 注入的集合数据类型如果不是简单类型,则使用标签<ref>,属性bean
  3. 通过p命名空间注入属性本质上是简化的set注入,需要导入p命名空间
  4. 集合属性注入时,若数据的格式相同,标签可以互用,如<list>与<set>
  5. 集合属性注入不同集合,键值对的书写方式细微差别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值