Spring 基于xml 的 IOC 配置,

1. 通过maven 下载相关依赖需要的jar 包

在这里插入图片描述

<!--打包成jar包-->
    <packaging>jar</packaging>
    <!--所有相关jar包依赖和下载的区域-->
    <dependencies>
        <dependency>
            <!--spring 包-->
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <!--数据访问dbutils包-->
            <groupId>commons-dbutils</groupId>
            <artifactId>commons-dbutils</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <!--c3p0,连接池,包-->
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
        <dependency>
            <!--mysql 数据库包-->
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <!--单元测试包-->
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
    </dependencies>

2.创建实体类
在这里插入图片描述3.写出业务逻辑层和数据访问层的接口,以及实现类。实现类中加入固定的IOC封装属性
在这里插入图片描述
在这里插入图片描述增删改的实现方法:
在这里插入图片描述
实现类中的具体注意代码:

//数据访问实现类具体
    //spring 提供进行封装赋值的属性和方法
    private QueryRunner runner;

    public void setRunner(QueryRunner runner) {
        this.runner = runner;
    }
    //spring 提供进行封装赋值的属性和方法---结束
    
     //业务逻辑实现类具体
    //spring 提供进行封装赋值的属性和方法
    private IStudentDao studentDao;
    public void setStudentDao(IStudentDao studentDao) {
        this.studentDao = studentDao;
    }
    //spring 提供进行封装赋值的属性和方法---结束

4.配置IOC 容器中的具体属性。也就是配置:applicationContext.xml
在这里插入图片描述知识拓展:scope=“prototype”
在这里插入图片描述
<?xml version="1.0" encoding="UTF-8"?>

        <!--配置Service -->
        <bean id = "studentService" class="huaxin.service.impl.StudentServiceImpl">
            <!--实现类的属性,注入dao-->
            <property name="studentDao" ref="studentDao"></property>
        </bean>

        <!--配置Dao对象-->
        <bean id ="studentDao" class="huaxin.dao.impl.StudentDaoImpl">
            <!--注入QueryRunner-->
            <property name="runner" ref="runner"></property>
        </bean>

        <!--配置QueryRunner对象-->
        <bean id = "runner" class="org.apache.commons.dbutils.QueryRunner">
            <!--注入c3p0数据源-->
            <constructor-arg name="ds" ref="dataSource"></constructor-arg>
        </bean>

            <!--配置c3p0数据源-->
        <bean id ="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <!-- 配置c3p0连接数据库的4个基本信息 ,注意c3p0的 name 名是固定的字符。-->
            <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"></property>
            <property name="user" value="root"></property>
            <property name="password" value="123"></property>
        </bean>
</beans>

5.单元测试类
在这里插入图片描述

@Test
    public void testquery(){
        //1.获取spring IOC容器
        ApplicationContext ac =
          new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.得到业务层对象
        IStudentService ss = ac.getBean("studentService",IStudentService.class);
        //3.执行方法
        List<Student> students = ss.query();
        for (Student student : students) {
            System.out.println(student);
        }
    }

day31 2019-08-30 笔记重点:

三、耦合和解耦
1. 什么是耦合
	模块之间的关联程度, 依赖程度
2. 什么是解耦
	降低模块之间的耦合度(依赖关系)
3. 解耦的目的
	编译器不依赖,运行期才依赖
4. 解耦思路
	1) 把全限类名都放到配置文件中
	2)  通过工厂帮助创建对象
七、IOC的细节
1、容器对象的类结构图
a、beanFactory 是spring容器的顶层接口
b、接口ApplicationContext是 beanFactory子接口
	实现类:ClassPathXmlApplicationContext  -- 从类路径之下读取配置文件 (常用)
				 FileSystemXmlApplicationContext - 从绝对路径指定的配置文件读取
				 AnnotationConfigApplicationContext -- 纯注解配置使用的类 (常用)

2、getBean方法(掌握)

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //根据名称获取该对象
//        Object userDao = ac.getBean("userDao");
//        System.out.println(userDao);
//        根据类型获取该对象
//        如果该类型有两个实现类,会执行异常
//        UserDao userDao = ac.getBean(UserDao.class);
//        System.out.println(userDao);
//        得到是id为userDao1的对象,类型为UserDao接口的实现类
        UserDao userDao = ac.getBean("userDao2", UserDao.class);
        System.out.println(userDao);

3、bean对象的范围和生命周期(掌握)

springIOC容器默认的单例模式:  单例模式的对象在创建容器时创建,销毁容器时销毁
scope:prototype 原型模式(多例模式):获取时创建,当对象长时间不在被引用, 则被垃圾回收机制回收
scope:singleton :单例模式
scope :request:  请求范围
scope: session : 回话范围
scope:global session :全局范围 -- spring 5的新特性中被删除了
UserDao userDao1 = ac.getBean("userDao", UserDao.class);
System.out.println(userDao1);

UserDao userDao2 = ac.getBean("userDao", UserDao.class);
System.out.println(userDao2);

6、构造方法注入(掌握)

	value 属性只能赋值简单的类型:基本数据类型和String类型
    ref:  pojo类型,复杂类型, 关联创建好的对象
<!--默认创建对象方式,使用默认的空的构造方法创建对象-->
<bean id="user" class="com.itheima.domain.User">
    <!--通过构造方法参数的索引赋值-->
    <!--<constructor-arg index="0" value="1"></constructor-arg>-->
    <!--<constructor-arg index="1" value="张三"></constructor-arg>-->
    <!--通过构造方法参数类型赋值-->
    <!--<constructor-arg type="java.lang.Integer" value="2"></constructor-arg>-->
    <!--<constructor-arg type="java.lang.String" value="李四"></constructor-arg>-->
    <!--通过构造方法参数名字赋值-->
    <constructor-arg name="id" value="3"></constructor-arg>
    <constructor-arg name="username" value="王五"></constructor-arg>
		<constructor-arg name="sex" value="男"></constructor-arg>
    <constructor-arg name="birthday" ref="birthday"></constructor-arg>
</bean>

<bean id="birthday" class="java.util.Date"></bean>

7、set方法注入属性(常用)(掌握)

<bean id="user2" class="com.itheima.domain.User">
    <!--property :属性注入 , 先找到set方法,才能最终找到属性-->
    <property name="username" value="王朝"></property>
    <property name="birthday" ref="birthday"></property>
    <property name="sex" value="男"></property>
    <property name="id" value="4"></property>
</bean>
8、p名称空间注入:基于set方法注入--- 了解
    a、在头部文件中引入p名称空间
	b、使用p名称空间注入属性
    <bean id="user3" class="com.itheima.domain.User"
        p:id="5" p:username="马汉" p:sex="男" p:birthday-ref="birthday"
        ></bean>

9、注入集合属性(掌握)

<bean id="user4" class="com.itheima.domain.User">
    <!--array ,list ,set 结构相同,标签可以混用-->
    <property name="list">
        <set>
            <value>javaSE</value>
            <value>javaEE</value>
            <value>javaME</value>
        </set>
    </property>

    <property name="set">
        <array>
            <value>javaSE</value>
            <value>javaEE</value>
            <value>javaME</value>
        </array>
    </property>
    <property name="strs">
        <list>
            <value>javaSE</value>
            <value>javaEE</value>
            <value>javaME</value>
        </list>
    </property>
    
    <!--map集合properties结构相同,可以通用-->
    <property name="map">
       <props>
        <prop key="五" >five</prop>
        <prop key="六" >six</prop>
        <prop key="七" >seven</prop>
    </props>
    </property>

    <property name="properties">
        <map>
            <!--键值对配置-->
            <entry key="一" value="one"></entry>
            <entry key="二" value="two"></entry>
            <entry key="三" value="three"></entry>
            <entry key="四" value="four"></entry>
        </map>
    </property>
</bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值