Spring IOC学习笔记

本人学习java Spring过程中发现对于旧知识总是会有遗忘,为此,写下本篇文章作为记录。

本文主要描述Spring的IOC模块

 

  1、IOC的目的是为了实现高内聚低耦合,利用了xml解析、工厂模式、反射。

 

 

     我们自己定义的各个 Bean 其实会转换成一个个 BeanDefinition 存在于 Spring 的 BeanFactory 中。

 

  2、IOC的执行过程

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

     2)使用工厂类

  3、IOC容器底层使用了BeanFactory和ApplicationContext,其中BeanFactoy是ApplicationContext的父类。

    

    代码如下:

ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

    其中bean.xml为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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="user" class="com.study.day01.User">
                <property name="age" value="18"></property>
                <property name="name" value="ww"></property> //需要有set函数
        </bean>

        <bean id="user1" class="com.study.day01.User">
                <constructor-arg name="age" value="19"></constructor-arg>
                <constructor-arg name="name" value="zy"></constructor-arg> //使用constructor-arg需要类存在构造器
 </bean> </beans>

    class为类的路径,id为对象的唯一标识符,上述xml建立了两个User对象,id分别为user和user1。

    为了获取上述两个对象,需要如下代码:

User user = context.getBean( "user", User.class);
User user1 = context.getBean( "user1", User.class);

   4、IOC注入Bean

     1)外部注入

<?xml version="1.0" encoding="UTF-8"?>
<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 http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="service" class="com.study.day01.service.Service">
        <property name="client" ref="dao"></property>
    </bean>

    <bean id="dao" class="com.study.day01.client.ClientImp">
    </bean>
</beans>

     上述xml使用了外部注入的方法,service.client在外部创建,由ref映射

     2)内部注入

<?xml version="1.0" encoding="UTF-8"?>
<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 http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="emp" class="com.study.day02.Emp">
        <property name="age" value="18"></property>
        <property name="name" value="ww"></property>
        <property name="dep">
            <bean id="dep" class="com.study.day02.Dep">
                <property name="depName" value="保安"></property>
            </bean>
        </property>
    </bean>
</beans>

   5、注入List、Map、Array对象

    1)内部注入

<?xml version="1.0" encoding="UTF-8"?>
<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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="stu" class="com.study.day02.Stu">
        <property name="courses">
            <array>
                <value>数学</value>
                <value>英语</value>
                <value>语文</value>
            </array>
        </property>
        <property name="list">
            <list>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </list>
        </property>
        <property name="map">
            <map>
                <entry key="JAVA" value="java"></entry>
                <entry key="CPP" value="c++"></entry>
            </map>
        </property>
    </bean>
</beans>

    2)外部注入

<?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"
       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">
    <util:list id="bookList">
        <value>三国</value>
    </util:list>

    <bean id="test" class="com.study.day02.UtilTest">
        <property name="list" ref="bookList"></property>
    </bean>

</beans>

   6、利用注解

    针对Bean管理有如下几个注解

      1)@Component 普通用法

      2)@Service 用于service业务逻辑层

      3)@Controller 用于web层

      4)@Repository 用于DAO持久层

    base-package为扫描此包下的注解

<?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"
       xmlns:util="http://www.springframework.org/schema/util"
       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/util http://www.springframework.org/schema/util/spring-util.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.study.day04"></context:component-scan>
</beans>

 

    一般来说注解中的value属性默认为类名的首字母小写,@Autowired:根据属性类型进行自动装配,@Qualifier:根据属性名称进行注入,@Resource:可以根据类型注入,可以根据名称注入

@Repository
public class Dao {

    void add() {
        System.out.println("add ...");
    }
}

@Service
public class ServiceImp {

    @Autowired
    @Qualifier(value = "dao")
    private Dao dao;

    void add() {
        dao.add();
    }

    @Test
    public void test() {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean.xml");
        ServiceImp serviceImp = context.getBean("serviceImp", ServiceImp.class);
        serviceImp.add();
    }
}

 

  以上是本人短暂学习过程中对于IOC理解,由于本人能力有限,若存在不足的地方,还望指正

 

posted on 2021-05-14 15:28  ustcwei  阅读(65)  评论(0)    收藏  举报