Spring框架(二)——IoC

1、什么是IoC

  • IoC—Inverse of Control,控制反转,将对象的创建权力反转给Spring框架
  • 控制反转是为了降低程序耦合度,提高程序扩展力,达到OCP原则,达到DIP原则
    • OCP开闭原则:在软件开发过程中应当对扩展开放,对修改关闭
    • DIP依赖倒置原则:主要倡导面向抽象编程,面向接口编程,不要面向具体编程

  • 所谓的反转,是指?
    • 将对象的创建权利交出去,交给第三方容器负责
    • 将对象和对象之间关系的维护权交出去,交给第三方容器负责
  • 如何实现IoC
    • DI(Dependency Injection):依赖注入

2、DI——依赖注入

  • Spring是通过依赖注入的方式来完成Bean管理的(Bean管理说的是:Bean对象的创建,以及Bean对象中属性的赋值或者叫做Bean对象之间关系的维护)

  • 什么是DI

    • 依赖指的是对象和对象之间的关联关系

    • 注入指的是一种数据传递行为,通过注入行为来让对象和对象产生关系

  • DI的常见方式
    • set方法注入
    • 构造方法注入
  • set方法注入:
    • set注入,显然,是基于set方法来完成的,底层会通过反射机制调用属性对应的set方法然后给属性赋值。这种方式要求属性必须对外提供set方法。
    • 请看下例:
      • //持久层
        public class OrderDaoImpl implements OrderDao {
            @Override
            public void saveOrder() {
                System.out.println("持久层:保存订单...");
            }
        }
        //业务逻辑层
        public class OrderServiceImpl implements OrderService {
            // 编写成员属性,一定需要提供该属性的set方法
            private OrderDao orderDao;
            // 一定需要提供该属性的set方法,IOC容器底层就通过属性的set方法方式注入值
            public void setOrderDao(OrderDao orderDao) {
                this.orderDao = orderDao;
            }
            // 消息
            private String msg;
            // 年龄
            private int age;
            public void setMsg(String msg) {
                this.msg = msg;
            }
            public void setAge(int age) {
                this.age = age;
            }
            @Override
            public void saveOrder() {
                System.out.println("业务层:保存订单..."+msg+" - "+age);
                // 调用
                orderDao.saveOrder();
            }
        }
        <!--spring的配置文件-->
        <!--DI:依赖注入-->
        <bean id="os" class="cn.tx.service.OrderServiceImpl">
            <property name="orderDao" ref="od" />
            <property name="msg" value="你好" />
            <property name="age" value="30" />
        </bean>
        <bean id="od" class="cn.tx.dao.OrderDaoImpl"></bean>

      • 实现原理:
        • 通过property标签获取到属性名:orderDao、msg、age 
          • property标签的name是属性名。
          • ref是要注入的bean对象的id,是引用
        • 通过属性名推断出set方法名:setOrderDao、setMsg、setAge(这里读者可以去测试一下,当我们把set方法注释掉后会报错,指出没有setter方法)
        • 通过反射机制调用setOrderDao()、setMsg()、setAge()方法给属性赋值
  • 构造方法注入
    • 通过调用构造方法来给属性赋值。

    • 如下例:

      • public class Car {
            // 名称
            private String cname;
            // 金额
            private Double money;
            public Car(String cname, Double money) {
                this.cname = cname;
                this.money = money;
            }
            @Override
            public String toString() {
                return "Car{" +
                        "cname='" + cname + '\'' +
                        ", money=" + money +
                        '}';
            }
        }
        
        
        //核心配置文件
        <bean id="car" class="cn.tx.demo2.Car">
            <constructor-arg name="cname" value="大奔" />
            <constructor-arg name="money" value="400000" />
         </bean>

3、数组,集合(List,Set,Map),Properties等的注入

这里直接上代码,首先我们先创建一个CollectionBean的对象,用来完成该案例

public class CollectionBean {

    // 数组
    private String [] strs;
    public void setStrs(String[] strs) {
        this.strs = strs;
    }

    private List<String> list;
    public void setList(List<String> list) {
        this.list = list;
    }

    private Map<String,String> map;
    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    private Properties properties;
    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    @Override
    public String toString() {
        return "CollectionBean{" +
                "strs=" + Arrays.toString(strs) +
                ", list=" + list +
                ", map=" + map +
                ", properties=" + properties +
                '}';
    }
}

 spring的配置文件

<!--给集合属性注入值-->
    <bean id="collectionBean" class="cn.tx.demo3.CollectionBean">
        <property name="strs">
            <array>
                <value>美美</value>
                <value>小凤</value>
            </array>
        </property>
        <property name="list">
            <list>
                <value>熊大</value>
                <value>熊二</value>
            </list>
        </property>
        <property name="map">
            <map>
                <entry key="aaa" value="老王"/>
                <entry key="bbb" value="小王"/>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="username">root</prop>
                <prop key="password">123456</prop>
            </props>
        </property>
    </bean>

4、关于Spring的配置文件

  • Spring引入外部属性配置文件

    • 我们这里以jdbc的信息为例,在类路径下新建jdbc.properties文件

      • driver=com.mysql.cj.jdbc.Driver
        url=jdbc:mysql://localhost:3306/spring
        username=root
        password=root123

    •  在spring配置文件中引入context命名空间。
      • <?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:context="http://www.springframework.org/schema/context"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                                   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
        
        </beans>

    • 在spring中配置使用jdbc.properties文件。

      • <?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:context="http://www.springframework.org/schema/context"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                                   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
        
            <context:property-placeholder location="jdbc.properties"/>
            
            <bean id="dataSource" class="com.powernode.spring6.beans.MyDataSource">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </bean>
        </beans>

  • 配置多个spring的配置文件
    • 主配置文件中包含其他的配置文件:
      <import resource="applicationContext2.xml"/>
      
      工厂创建的时候直接加载多个配置文件:
      ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
      "applicationContext.xml","applicationContext2.xml");

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值