【 Spring 的 IOC 解决程序耦合 】

什么是 Spring?

Spring 是一个 开源框架,是于 2003 年兴起的一个 轻量级 的 Java 开发框架,其基础版本只有 2 MB 左右的大小。

Spring 框架目标是简化Java企业级应用开发,通过启用基于 POJO 编程模型来促进良好的编程实践。

Spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。然而,Spring 的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。

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

使用 Spring 框架的好处是什么?

  • 方便解耦,简化开发:Spring 就是一个大工厂,专门负责生成 Bean,可以将所有对象创建和依赖关系维护由Spring 管理

  • AOP编程的支持:Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能

  • 声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无需手动编程

  • 方便程序的测试:Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程序

  • 方便集成各种优秀框架:Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的支持

  • 降低JavaEE API的使用难度:Spring 对 JavaEE 开发中一些难用的API(JDBC、JavaMail、远程调用 webservice 等),都提供了封装,使这些 API 应用难度大大降低

Spring 官网:https://spring.io/

官网 jar 包下载地址:https://repo.spring.io/release/org/springframework/spring/
https://repo.spring.io/libs-release-local/org/springframework/spring/

Spring 现在有很多框架,如 Spring、SpringMVC、Spring-Data、Sprint-Boot 等等。
【 Spring 的 IOC 解决程序耦合 】

jar 包说明【 Spring 的 IOC 解决程序耦合 】

spring5 版本是用 jdk8 编写的,所以要求我们的 jdk版本是 8及以上。 同时 tomcat 的版本要求 8.5及以上。

对版本号的意义加以说明

  • Alpha
    Alpha是内部测试版,一般不向外部发布,会有很多 Bug。除非你也是测试人员,否则不建议使用。是希腊字母的第一位,表示最初级的版本,alpha 就是α,beta 就是β ,alpha 版就是比beta还早的测试版,一般都是内部测试的版本。

  • Beta:
    该版本相对于α版已有了很大的改进,消除了严重的错误,但还是存在着一缺陷,需要经过多次测试来进一步消除。这个阶段的版本会一直加入新的功能。

  • RC:(Release Candidate)
    Candidate是候选人的意思,用在软件上就是候选版本。Release.Candidate.就是发行候选版本。和Beta版最大的差别在于Beta阶段会一直加入新的功能,但是到了RC版本,几乎就不会加入新的功能了,而主要着重于除错! RC版本是最终发放给用户的最接近正式版的版本,发行后改正bug就是正式版了,就是正式版之前的最后一个测试版。

  • GA:(general availability)
    比如:Apache Struts 2 GA这是Apache Struts 2首次发行稳定的版本,GA意味着General Availability,也就是官方开始推荐广泛使用了。

  • Release:
    该版本意味“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式版本,是最终交付用户使用的一个版本。该版本有时也称为标准版。一般情况下,Release不会以单词形式出现在软件封面上,取而代之的是符号®。

Spring 的核心 jar 包

  • spring-core
    包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心。

  • spring-beans
    所有应用都要用到的,它包含访问配置文件、创建和管理 bean 以及进行 Inversion of Control(IoC) / Dependency Injection(DI) 操作相关的所有类

  • spring-context
    Spring 提供在基础 IoC 功能上的扩展服务,此外还提供许多企业级服务的支持,如邮件服务、任务调度、JNDI 定位、EJB 集成、远程访问、缓存以及各种视图层框架的封装等。

  • spring-expression
    Spring 表达式语言

  • com.springsource.org.apache.commons.logging-1.1.1.jar
    第三方的主要用于处理日志

入门实例

步骤一:创建一个 maven 项目,添加相应的依赖

导入4核心(beans、core、context、expression) + 1个依赖(common-logging.jar)

pom.xml

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>

【 Spring 的 IOC 解决程序耦合 】

步骤二:编写一个简单的 Dao

/**
 * 账户的持久层接口
 */
public interface IAccountDao {

    /**
     * 模拟保存账户
     */
    void saveAccount();
}
/**
 * 账户的持久层实现类
 */
public class AccountDaoImpl implements IAccountDao {

    public  void saveAccount(){

        System.out.println("保存了账户");
    }
}

步骤三:编写一个简单的 Service

/**
 * 账户业务层的接口
 */
public interface IAccountService {

    /**
     * 模拟保存账户
     */
    void saveAccount();
}
/**
 * 账户的业务层实现类
 */
public class AccountServiceImpl implements IAccountService {

    private IAccountDao accountDao ;

    public AccountServiceImpl(){
        System.out.println("对象创建了");
    }

    public void  saveAccount(){
        accountDao.saveAccount();
    }
}

步骤四:传统方式调用

AccountDao userService = new AccountDaoImpl();

步骤五:使用 Spring IoC 控制反转 创建实例

① 编写 Spring 的核心 xml 配置文件,可以取名为:beans.xml

配置文件的约束可以访问:/spring-framework-5.0.2.RELEASE/docs/spring-framework-reference/html5/core.html 网页查看

【 Spring 的 IOC 解决程序耦合 】
上面的地址是联网的地址,如果离线编写程序,需要离线配置文件约束提示的配置。

获取离线配置文件约束的方式为:打开 联网的地址 ,例如:http://www.springframework.org/schema/beans/spring-beans.xsd ,鼠标右键 另存为 文件名为 spring-beans.xsd 。

</beans>
<?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 标签:用于配置让 spring 创建对象,并且存入 ioc 容器之中
        id 属性:对象的唯一标识。
        class 属性:指定要创建对象的全限定类名
     -->

    <!--把对象的创建交给spring来管理-->
    <bean id="accountService" class="cn.ys.service.impl.AccountServiceImpl"></bean>

    <bean id="accountDao" class="cn.ys.dao.impl.AccountDaoImpl"></bean>
</beans>

② 读取 Spring 的配置文件来获取 Bean

【 Bean 其实就是一个 new 好的对象】

/**
 * 模拟一个表现层,用于调用业务层
 */
public class Client {

    /**
     * 获取spring的Ioc核心容器,并根据id获取对象
     *
     * @param args
     */
    public static void main(String[] args) {
        //1.获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");

        //2.根据id获取Bean对象
        IAccountService as  = (IAccountService)ac.getBean("accountService");
        IAccountDao adao = ac.getBean("accountDao", IAccountDao.class);

        System.out.println(as);
        System.out.println(adao);
        as.saveAccount();

    }
}

控制台打印

[AAA, BBB, CCC]
[AAA, BBB, CCC]
[AAA, BBB, CCC]
{testD=ddd, testC=ccc}
{testA=aaa, testB=BBB}

【 Spring 的 IOC 解决程序耦合 】
【 Spring 的 IOC 解决程序耦合 】
【 Spring 的 IOC 解决程序耦合 】