[Spring+SpringMVC+Mybatis]框架学习笔记(一):SpringIOC概述

上一章:[Spring+SpringMVC+Mybatis]框架学习笔记:前言_目录
下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(二):Spring-IOC-DIhtml

第1章 SpringIOC概述

Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。java

1.1 控制反转IOC

IOC(inversion of controller)是一种概念,是把咱们程序中的类与类之间的依赖关系交给容器去处理,通常有两种方式(面试):web

  • 依赖查找DL(dependency lookup):程序提供查找方式,交给容器去查找(至关于se中的回调函数);
  • 依赖注入DI(dependency injection):程序不提供查找方式,提供合适的构造方法或者set方法,让容器进行注入来解决依赖关系。

Spring的控制反转就是经过依赖注入来实现。面试

1.2 依赖

依赖:简单的说,一个类实现某个功能须要依靠另一个类的帮助。spring

1.3 回顾:基于接口编程的开发方式

当一个方法有多种实现的状况下,咱们通常是基于接口的方式进行编程。数据库

简单模拟用户登陆的功能,这里省略后台数据库链接部分。编程

1)DAO层app

接口IUserDao:框架

package com.steven.spring.sysmanage.dao;
/**
 * 用于登陆验证的DAO的接口
 * @author Administrator
 *
 */
public interface IUserDao{
    public boolean loginUser(String userName, String password);
}
//接口实现的两种方式:UserDaoImplJdbc.java和UserDaoImplOther.java
package com.steven.spring.sysmanage.dao.impl;

import com.steven.spring.sysmanage.dao.IUserDao;

public class UserDaoImplJdbc implements IUserDao {
    public boolean loginUser(String userName, String password) {
        System.out.println("这是经过JDBC进行登陆验证的DAO方法");
        return true;
    }

}

package com.steven.spring.sysmanage.dao.impl;

import com.steven.spring.sysmanage.dao.IUserDao;

public class UserDaoImplOther implements IUserDao {
    public boolean loginUser(String userName, String password) {
        System.out.println("这是经过其它方式进行登陆验证的DAO方法");
        return true;
    }

}

2) 服务层函数

package com.steven.spring.sysmanage.service;

import com.steven.spring.sysmanage.dao.IUserDao;

/**
 * 用于用户登陆、增删改查的服务类
 * @author Administrator
 *
 */
public class UserService {
    boolean flag = false;
    
    IUserDao userDao;
    
    public UserService(){
        
    }
    
    //方式1:经过构造器的方式
    public UserService(IUserDao userDao){
        this.userDao = userDao;
    }

    //方式2:经过set方式,这种方式更灵活
    public void setUserDao(IUserDao userDao) {
        this.userDao = userDao;
    }
    
    /**
     * 经过调用与数据库交互的UserDao里面的loginUser方法,判断是否验证成功
     * @param userName
     * @param password
     * @return
     */
    public boolean loginUser(String userName, String password){
        flag = userDao.loginUser(userName, password);
        return flag;
    }
    
}

3)测试类

package com.steven.spring.sysmgr.action;

import org.junit.Test;

import com.steven.spring.sysmgr.dao.impl.UserDaoImplJdbc;
import com.steven.spring.sysmgr.service.UserService;

public class LoginTest {
    @Test
    public void loginUsingJava(){
        //方式1:使用构造方法
//      UserService userService = new UserService(new UserDaoImplOther());
        
        //方式2:使用set方法
        UserService userService = new UserService();
        userService.setUserDao(new UserDaoImplJdbc());
        
        userService.loginUser("abc", "123");
        
    }
}

因为Java是一种编译性语言,维护时直接改编码,须要再次编译才能上线使用,这样就增大了维护的工做难度和工做量。 ----> 而更改配置文件就不须要从新编译!

1.4 依赖注入

依赖注入DI是指一个对象须要另一个对象时,无需在代码中建立所需求对象,而是依赖于外部容器,由外部容器建立后传递给程序。

依赖注入是目前为止最好的解耦方式,由于依赖关系是依靠配置文件的方式组织在一块儿,而不是在程序中的硬编码。

1.5 Spring的IOC

Spring的IOC容器经过依赖注入来实现程序之间的依赖关系,达到解耦的做用。

老项目:3.2版本;新项目:4.2版本

1)Spring项目环境搭建依赖的jar包

java工程jar包放在项目根目录的libs文件夹下;web工程jar包放在WebContent/WEB-INF/libs文件夹下。

再加上junit的jar包:(注意junit4.10之后是拆分了两个包)

再加上日志包:

2)配置文件applicationContext.xml,加上bean约束

在spring-framework-4.2.1.RELEASE\docs\spring-framework-reference\html下有xsd-configuration.html文件中有初始配置。

IOC的实现原理:反射

无反射无框架,无代理无框架

在上面例子的基础上,增长spring配置xml文件,更改实现层。

1)spring配置文件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"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!-- 至关于Java代码中的 IUserDao userDaoImplJdbc = new UseDaoImplJdbc() -->
    <bean id="userDaoImplJdbc" class="com.steven.spring.sysmanage.dao.impl.UserDaoImplJdbc"></bean>
    
    <bean id="userDaoImplOther" class="com.steven.spring.sysmanage.dao.impl.UserDaoImplOther"></bean>
    
    <bean id="userService" class="com.steven.spring.sysmanage.service.UserService">
        <!-- 方式1:经过构造方法的方式注入 -->
        <constructor-arg ref="userDaoImplOther"></constructor-arg>
        
        <!-- 方式2:经过set方法的方式注入,注意这里的的name的值需与set方法名后面的部分保持一致,且首字母小写-->  
        <property name="userDao" ref="userDaoImplOther"/>
    </bean>
    
</beans>

2)更改测试类

package com.steven.spring.sysmgr.action;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.steven.spring.sysmgr.dao.impl.UserDaoImplJdbc;
import com.steven.spring.sysmgr.service.UserService;

public class LoginTest {    
    @Test
    public void loginUsinSpring(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService)ac.getBean("userService");
        userService.loginUser("abc", "123");
    }
}

上一章:[Spring+SpringMVC+Mybatis]框架学习笔记:前言_目录
下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(二):Spring-IOC-DI

相关文章
相关标签/搜索