1-Spring-基础知识

4 篇文章 0 订阅

Spring-基础知识


一. 简介

Spring 解决的是业务逻辑层与其他层的松耦合问题,将面向接口的思想贯穿整个系统应用。也有人称为粘合剂,用于粘合其余别的层的框架。

web程序开发分层一般如下:

web层
service层
dao/mapper/repositorey层
  • web层: apache struts1, apache struts2(xwork), springmvc
  • service层:spring
  • dao/mapper/repositorey层:jdbc,DbUtils,mybatis,springdata
  • SpringBoot 不属于任何一层,是搭建项目基础平台的框架,提倡 0配置,不写xml文件。用java形式运行javaweb项目

1.1 优点

Spring 的出现解决了 JaveEE 的实际问题

  • 方便解耦(高内聚、低耦合):Spring 是一个超级工厂(超级容器),可以将对象的创建和依赖关系交给 Spring工厂 去管理
  • AOP编程:Spring 提供面向切面编程(底层是动态代理),可以方便的对程序进行运行监控,权限验证等操作
  • 声明事务:只需要通过配置就完成对事务的管理,无需手动编程
  • 方便测试:Spring支持junit4,可以使用Spring注解方式测试程序
  • 方便集成各种框架
  • 降低JaveEE API的使用难度

1.2 核心技术

IOC(Inverse of Control) 控制反转:将对象的创建权力交给Spring工厂进行管理
AOP(Aspect Oriented Programming) 面向切面编程:基于动态代理的功能增强方式

二. IOC技术

2.1 搭建环境

在idea中选择maven方式构建项目,在pom.xml文件中导入Spring

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

2.2 IOC概念

IOC是一种设计思想。

  • 举例:传统编程使用某个类,会创建对象然后调用方法。
  • 存在问题:当前代码与 new 出来的对象紧密绑定,如果程序进一步升级,那就比较麻烦。(web 创建service对象,service创建dao对象,三层严重耦合在一起)
  • 常见操作:在 service层 创建 dao层 对象,调用其中方法
  • IOC思想:将对象的创建与维护交给Spring框架,自己书写的代码仅仅只需向 Spring 框架索要对应的对象使用即可。无需关心如何创建对象,对象的生命周期
  • 控制反转:将对象的创建、维护、销毁权力交给 IOC容器,前提是需要告诉 IOC容器 应该维护哪些对象,需要通过 xml 或者注解的方式告诉Spring。学习Spring的核心在于学习如何配置

2.3 IOC快速入门

我们创建一个最基本的web例子,仅包含service层、dao层、pojo类,
文件结构如下:
在这里插入图片描述

其中书写代码如下:
配置pom.xml如下,主要是配置Spring和junit

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.20.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

其中书写代码如下:

pojo类:

public class User {
}

dao层:

public class UserDao {
    public void addUser(User user) {
        System.out.println("将user添加入数据库");
    }
}

service层:

public class UserService {

    private UserDao dao;

    public void setDao(UserDao dao) {
        this.dao = dao;
    }

    public void addUser(User user){
        dao.addUser(user);
    }
}

以上代码是简化的web流程,由service调用Dao, Dao操作数据库。

接下来配置Spring配置文件,文件名:applicationContext.xml。通过配置的方式告诉Spring需要管理那些类

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

    <!--
        在Spring框架中,任何类均为JavaBean,只要需要它管理的类,均为bean,
        使用xml进行配置时,都应该使用bean标签进行配置
            id属性/name属性:用来给当前管理的bean起名,将来在程序中通过id/name的值进行
            class属性:需要呗管理的类
    -->
    <bean id="userDao" class = "org.buaa.dao.UserDao" ></bean>
    <bean id="userService" class="org.buaa.service.UserService">
        <property name="dao" ref="userDao" />
    </bean>

</beans>

正式使用Spring

public class SpringTest {

    @Test
    public void testAddUser(){
        // 1.获取Spring的核心对象
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 2.向Spring容器要我们想使用的UserService对象
        UserService userService = (UserService) context.getBean("userService");// getBean返回值为Object,需要向下强制转换类型
        // 3.通过对象调用方法
        userService.addUser(null);// 打印结果: 将user添加入数据库
    }
}

2.4 DI依赖注入

DI:Dependency Injection。 IOC 和 DI 本质是一回事,只是不同角度说明问题。在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件。简而言之:可以将一个bean对象动态嵌入到另一个bean中

举例:service层使用dao层对象,无论时service层的类还是dao的类都交给Spring容器创建和维护。那么Service层的bean中就可以之间将dao层的bean注入到其中。而无需再service层的代码中再从Spring容器获取dao层的bean。

DI和IOC区别IOC更强调对象的创建、维护、销毁等管理;DI更强调对象彼此间的依赖关系

这段配置中,就是告诉Spring,UserService需要UserDao,这就是一个依赖关系

    <bean id="userDao" class = "org.buaa.dao.UserDao" ></bean>
    <bean id="userService" class="org.buaa.service.UserService">
        <property name="dao" ref="userDao" />
    </bean>

DI前提需要提供依赖对象的set方法。如下:

public class UserService {

    private UserDao dao;
    // 需要有这个set方法
    public void setDao(UserDao dao) {
        this.dao = dao;
    }
    ...
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值