Spring第一章:Spring入门

该系列为imooc Spring从入门到进阶笔记,跟随课程加入自己见解,同时也为项目中碰到一些问题做了解答

1、Spring的概述

1. 什么是Spring

  • Spring 是一个开源框架
  • Spring 为简化企业级应用开发而生,使用Spring可以使简单的JavaBean 实现以前只有EJB才能实现的功能
  • Spring 是JavaSE/EE的一站式框架
    JAVA EE在开发过程中,会将服务器端分为了Web层、业务层、持久层

Spring有每一层的解决方案
web层(SpringMVC)
业务层(Bean管理:IOC/事务管理)
持久层(JDBC模板/和orm整合–hibernate、Mybatis)

2. Spring的优点

  • 方便解耦,简化开发:
    Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理。

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

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

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

  • 方便继承各种优秀框架:
    Spring不排斥各种优秀的开眼框架,其内部提供了对各种优秀框架(hibernate、Mybatis…)的直接支持

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

  1. Spring的模块
    在这里插入图片描述

2 、Spring IOC的底层原理实现

  1. 好的程序设计的原则:
    OCP原则:(open-close原则)对程序扩展是open的 ,对修改程序代码是close.
    也就是尽量做到不修改程序代码,实现对程序的扩展。

  2. Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
      其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。
      IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

  3. Spring的IOC底层实现原理:通过工厂模式+反射+配置文件的方式实现,达到解耦的目的

  4. 工厂类FactoryBean的作用:代替(封装省去)我们去new对象的过程。
    大神写的详细IOC
    在这里插入图片描述

3、Spring IOC的快速入门案例

3.1、Spring IOC入门案例开发流程

  1. 下载spring开发包
    官方下载Spring 4.x 最新开发版本
    Spring 4.2版本目录结构
    在这里插入图片描述
  2. 复制spring开发jar包到工程
  3. 理解IOC控制反转和DI依赖注入
  4. 编写Spring核心配置文件
  5. 在程序中读取Spring配置文件,通过Spring框架获得Bean,完成相应操作

3.2、实现Spring IOC入门案例

  1. 使用idea Maven创建Web项目
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 导入Spring核心开发包到创建好的project中
    在这里插入图片描述
    再集成log4j、junit
    在项目pom文件中引入依赖
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.2.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.2.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.2.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>4.2.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
  </dependencies>
  1. 编写代码
    在main下新建java文件夹,右键java文件夹
    在这里插入图片描述
    这样就可以在java文件夹下创建包或编写java代码了

  2. 在java文件夹>新建com.imooc.ioc.demo1包>新建UserService接口

package com.imooc.ioc.demo1;

public interface UserService {
    public void sayHello();
}

  1. 在com.imooc.ioc.demo1包>新建UserServiceImpl类(UserService接口的实现类)
package com.imooc.ioc.demo1;

public class UserServiceImpl implements UserService{
    @Override
    public void sayHello() {
        System.out.println("Hello Spring");
    }
}

  1. 创建Spring配置文件
    在main下>新建resources文件夹>新建Spring Config XML文件(Spring配置文件默认命名为applicationContext.xml该名称我们可以自定义)
    在这里插入图片描述
    maven 项目,右键 New --> XML Configuration File 时,无 Spring Config 选项的解决办法
<?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">
    <!--UserService的创建权交给Spring    -->
    <bean id="userService" class="com.imooc.ioc.demo1.UserServiceImpl"></bean>
</beans>
  1. 在com.imooc.ioc.demo1包>新建SpringDemo1测试类
package com.imooc.ioc.demo1;

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

public class SpringDemo1 {
    @Test
    //传统方式开发
    public void demo1(){
        UserService userService=new UserServiceImpl();
        userService.sayHello();
    }
    @Test
    //Spring的方式实现
    public void demo2(){
        //创建Spring的工厂
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过工厂获得类
        UserService userService=(UserService) applicationContext.getBean("userService");

        userService.sayHello();
    }
}

  1. 运行测试方法
    使用传统方式
    在这里插入图片描述
    使用Spring方式
    在这里插入图片描述
    使用Spring方式的小节
  • 在resources目录下新建Spring配置文件:applicationContext.xml
  • 配置类文件映射:
  • 通过ApplicationContext创建类对象
    ApplicationContext application = new ClassPathApplicationContext(xml路径);
    Object object = applicationContext.getBean(beanId);

4、Spring中的IOC与DI

  • IOC:Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spring框架管理,简单说,就是创建UserService对象控制权被反转到了Spring框架
  • DI:Dependency Injection 依赖注入的概念,就是在Spring创建这个对象的过程中,将这个对象所依赖的属性注入进去,DI是依赖于IOC的,也就是说必须先有IOC

演示DI依赖注入

  1. 修改UserServiceImpl,添加name属性
package com.imooc.ioc.demo1;

public class UserServiceImpl implements UserService{
    //添加属性
    private String name;

    @Override
    public void sayHello() {
        System.out.println("Hello Spring"+name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  1. 在SpringDemo1中演示传统方式来设置对象属性,并使用UserServiceImpl类中的sayHello方法
package com.imooc.ioc.demo1;

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

public class SpringDemo1 {
    @Test
    //传统方式开发
    public void demo1(){
        //要使用UserServiceImpl的方法,就不能再向上转型,因为UserService中没有name属性
        //UserService userService=new UserServiceImpl();
        UserServiceImpl userService=new UserServiceImpl();
        //设置属性
        userService.setName("张三");
        userService.sayHello();
        //使用传统方式会修改代码,耦合高
    }
        @Test
    //Spring的方式实现
    public void demo2(){
        //创建Spring的工厂
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过工厂获得类
        UserService userService=(UserService) applicationContext.getBean("userService");

        userService.sayHello();
    }
}
  1. 演示DI的方式来设置对象属性,并使用UserServiceImpl类中的sayHello方法
    修改applicationContext.xml,添加<property name="属性名" value="属性值"/>
<?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">
    <!--UserService的创建权交给Spring    -->
    <bean id="userService" class="com.imooc.ioc.demo1.UserServiceImpl">
        <!--   设置属性     -->
        <property name="name" value="李四"/>
    </bean>

</beans>

在SpringDemo1中使用Spring DI方式实现,demo2无需做任何修改,启动测试代码demo2
在这里插入图片描述
可见程序正常输出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翘脚猴子耍把戏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值