IOC容器

85 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情

Spring框架两个核心部分:IOC和Aop

1.IOC:控制反转,把创建对象过程交给Spring处理

2.Aop,面向切面,不修改源代码进行功能增强

IOC容器

一.IOC底层原理

(1)xml配置文件,配置创建的对象

<bean id="user" class="com.it.spring5.User"></bean>

(2)有service和dao类,创建工厂类

class UserFactory{
    public static UserDao getDao(){
        String classValue = class属性值; //1.xml解析
        //2.通过反射创建对象
        Class clazz = Class.forName(classValue);
        //3.创建对象
        return (UserDao)clazz.newInstance();
 }
}

二.IOC接口(BeanFactory)

1.IOC思想基于IOC容器完成,IOC容器底层就是对象工厂

2.Spring提供IOC容器实现两种方式(两种接口)

(1)BeanFactory : IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用

加载配置文件时不会创建对象,在获取对象(使用)才去创建对象

(2)ApplicationContext : BeanFactory接口的子接口,提供了更多更强大的功能,一般由开发人员使用

加载配置文件时就会把在配置文件对象进行创建

三.IOC操作Bean管理

1.什么是Bean管理

(1)Spring创建对象

(2)Spring注入属性

2.Bean管理操作有两种方式

1.基于xml配置文件方式实现

1.基于xml方式创建对象
<bean id="user" class="com.it.spring5.User"></bean>

(1)在Spring配置文件中,使用bean标签,标签里添加对应属性,就可以实现对象创建

(2)在bean标签有很多属性,常用属性

id属性:为对象取唯一标识

class属性:类全路径(包类路径)

2.基于xml方式注入属性

(1)DI:依赖注入,就是注入属性

1.第一种注入方式:使用set方法进行注入

1.创建类,定义属性和对应的set方法

2.在Spring配置文件配置对象创建,配置属性注入

 	<!--  2.set方法注入属性  -->
    <bean id="book" class="com.it.spring5.Book">
        <!--  
            使用property完成属性注入
            name:类里面属性名称
            value:向属性注入的值
        -->
        <property name="bname" value="数据结构"></property>
    </bean>
2.第二种注入方式:使用有参构造函数进行注入

(1)创建类,定义属性,创建属性对应有参构造方法

(2)在Spring配置文件中配置

<!--    有参构造方法注入属性-->
    <bean id="orders" class="com.it.spring5.Orders">
        <constructor-arg name="oname" value="笔记本"></constructor-arg>
        <constructor-arg name="addrss" value="China"></constructor-arg>
<!--    可以根据索引值对应到属性    -->
<!--        <constructor-arg index="" value=""></constructor-arg>-->
    </bean>
3.p名称空间注入

(1)使用p名称空间注入,可以简化基于xml配置方式

第一步 添加p名称空间在配置文件中

<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">

第二部 进行属性注入,在bean标签里面进行操作

<bean id="book" class="com.it.spring5.Book" p:bname="线代" p:bauthor="老师"></bean>
</beans>
3.xml注入其他类型属性
(1)null值
 <property name="address">
            <null></null>
        </property>
(2)包含特殊符号
<!--   属性值包含特殊符号
            1.进行转义 &lt; &gt;
            2.把带特殊符号的内容写到CDATA中
        -->
        <property name="address">
            <value><![CDATA[<<新乡>>]]></value>
        </property>
4.注入属性-外部bean

(1)创建两个类service和dao类

(2)在service类调用dao里面的方法

(3)在spring配置文件中配置

<bean id="UserService" class="com.it.spring5.service.UserService">
    <!--   注入userDao对象
           ref属性:创建userDao对象bean标签的id值
    -->
        <property name="userDao" ref="userDaoImpl"></property>
    </bean>
    <bean id="userDaoImpl" class="com.it.spring5.dao.UserDaoImpl"></bean>
5.注入属性-内部bean

(1)一对多关系:部门和员工

(2)在实体类之间表示一对多关系

(3)在spring文件中配置

<bean id="emp" class="com.it.spring5.bean.Emp">
        <property name="ename" value="xiaohui"></property>
        <property name="gender" value="女"></property>
        <property name="dept">
            <bean id="dept" class="com.it.spring5.bean.Dept">
                <property name="dname" value="卷狗部"></property>
            </bean>
        </property>
    </bean>
6.注入属性-级联赋值
<bean id="emp" class="com.it.spring5.bean.Emp">
        <property name="ename" value="xiaohui"></property>
        <property name="gender" value="女"></property>
        <!--    级联赋值    -->
        <!--    1.第一种写法    -->
        <property name="dept" ref="dept"></property>
        <!--    2.第二种写法    -->
        <property name="dept.dname" value="技术部"></property>
    </bean>

2.xml注入集合属性

1.注入数组类型属性
2.注入List集合类型属性
3.注入Map集合类型属性

(1)创建类,定义数组,list,map,set类型属性,生成对应set方法

(2)在spring配置文件中配置

<bean id="stu" class="com.it.spring5.collectiontype.Stu">
    <!--    数组类型属性注入    -->
        <property name="courses">
            <array>
                <value>java</value>
                <value>mysql</value>
            </array>
        </property>
        <!--    list类型属性注入    -->
        <property name="list>">
            <list>
                <value>xiaohui</value>
                <value>huihuizi</value>
            </list>
        </property>
        <!--    map类型属性注入    -->
        <property name="map>">
            <map>
                <entry key="JAVA" value="java"></entry>
                <entry key="MYSQL" value="mysql"></entry>
            </map>
        </property>
        <!--    set类型属性注入    -->
        <property name="sets>">
            <set>
                <value>mysql</value>
                <value>redis</value>
            </set>
        </property>
    </bean>
4.在集合里面设置对象类型值
<!--   注入list集合类型,值是对象     -->
        <property name="courseList">
            <list>
                <ref bean="course1"></ref>
                <ref bean="course2"></ref>
            </list>
        </property>
<!--  创建多个Course对象  -->
    <bean id="course1" class="com.it.spring5.collectiontype.Course">
        <property name="cname" value="Spring"></property>
    </bean>
    <bean id="course2" class="com.it.spring5.collectiontype.Course">
        <property name="cname" value="MyBatis"></property>
    </bean>
5.把集合注入部分提取出来

(1)在spring配置文件中引用名称空间util

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

(2)使用util标签完成list集合注入提取

 <!--  1.提取list集合类型属性注入  -->
    <util:list id="bookList">
<!--        <ref bean=""></ref>-->
        <value>1</value>
        <value>2</value>
        <value>3</value>
    </util:list>
    <!--  2.提取list集合类型属性注入使用  -->
    <bean id="book" class="com.it.spring5.collectiontype.Book">
        <property name="list" ref="bookList"></property>
    </bean>

四.IOC操作Bean管理(FactoryBean)

1.Spring有两种类型bean,一种普通bean,另外一种工厂bean(FactoryBean)

2.普通bean:在配置文件中定义的bean类型就是返回类型。

3.工厂bean:在配置文件中定义的bean类型可以和返回类型不一样

(1)创建类,作为工厂bean,实现接口FactoryBean

(2)实现接口方法,在方法中定义返回的bean类型

<bean id="mybean" class="com.it.spring5.factorybean.MyBean">
public class MyBean implements FactoryBean<Course> {
    @Override
    public boolean isSingleton() {
        return FactoryBean.super.isSingleton();
    }

    @Override
    public Course getObject() throws Exception {
        Course course = new Course();
        course.setCname("abc");
        return course;
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }
}
@Test
    public void testMyBean(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
        Course course = context.getBean("mybean", Course.class);
        System.out.println(course);
    }