Spring学习笔记(一)

Spring

1.1、简介

  • Spring:翻译为:春天------> 可以理解为是给软件行业带来了春天

  • 范围:任何 Java 应用

  • 目的:解决企业级服务器的开发

  • 历史

    • 2002 ,首次推出 Spring框架的雏形 Interface21框架
    • 2004年3月24号 ,正式发布 Spring 1.0
    • Rod Johnson Spring Framework创始人。悉尼大学音乐学博士
    • **Spring 的理念:**使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架!
  • SSH:Struct2 + Spring + Hibernate !

  • SSM:SpringMVC + Spring + Mybatis !

官网:https://spring.io/projects/spring-framework#learn

官方下载地址:https://repo.spring.io/release/org/springframework/spring/

GITHUB:https://github.com/spring-projects/spring-framework

Maven:https://mvnrepository.com/artifact/org.springframework/spring-webmvc/5.2.8.RELEASE

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>


<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>

1.2、优点

  • Spring 是一个开源的免费的框架(容器)!
  • Spring 是一个轻量级的,非入侵式的框架 !
  • 控制反转(IOC)、面向切面编程(AOP)
  • 支持事务的处理,对其他框架整合支持。
    • 事务:对一系列数据库统一的提交和回滚

总结:Spring 就是一个 轻量级的控制反转(IOC) 和 面向切面编程(AOP) 的框架!

1.3、组成

img

1.4、

现代化的 Java 开发

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bNelsPC4-1600994927103)(C:\Users\acer\AppData\Roaming\Typora\typora-user-images\image-20200908142859533.png)]

  • Spring Boot
    • 快速开发的脚手架
    • 基于springboot可以快速开发单个微服务
    • 使 ==> 约定大于配置
  • Spring Cloud
    • Spring Cloud 是基于Spring Boot实现的。

现在大多数公司都在使用 Springboot 进行快速开发,学习SpringBoot的前提,需要完全掌握Spring 及 SpringMVC!!(承上启下的作用!)

弊端:发展了太久之后,违背了原来的理念!配置十分繁琐,人称:“配置地狱”。

2、IOC理论推导

在我们之前的业务中,用户需求可能会影响我们原来的代码,我们需要根据用户的需求就行修改源代码!如果程序的代码量非常大,修改一次代码的代价是否昂贵!

在这里插入图片描述

我们使用一个Set接口实现。

//    private UserDao userDao = new UserDaoImpl();
      private UserDao userDao;
//  利用set 进行动态实现值的注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
  • 之前,程序是主动创建对象的:UserDao userDao = new UserDaoImpl();
  • 使用Set注入后,程序不再具有主动性,而是编程了被动的接收对象。(用户需要用到什么我们就传入到 set 什么,少了可以在进行创建新的。)

这种思想,从本质上解决了问题,我们不用再去管理对象的创建了。系统的耦合性大大的降低,可以更加专注在业务的实现上。这是 IOC 的原型!

在这里插入图片描述

IOC本质

控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码(完全写死的)在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了

在这里插入图片描述

IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。

Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从Ioc容器中取出需要的对象。

在这里插入图片描述

采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。

3、HelloSpring

实体类

public class Hello {
    private String str;

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    @Override
    public String toString() {
        return "Hello{" +
                "str='" + str + '\'' +
                '}';
    }
}

beans.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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    使用 spring 来创建对象。在spring中都成文bean

        bean = 对象  new Hello()
        id = 变量名
        class = new 的对象
        property 相当于给对象中的属性设置一个值
-->
    <bean id="hello" class="com.lsw.pojo.Hello">
        <property name="str" value="Spring"/>
    </bean>

</beans>
  • bean => 对象 new Hello() ——>进行对象的托管
  • id => 变量名/对象名
  • class => new 的class对象
  • property => 相当于给对象中的属性设置一个值
  • name:属性名
    • ref 是引用 Spring 容器中创建好的对象
    • value 是具体创建的值,基本数据类型!

这个过程称为 控制反转

控制:谁来控制对象的创建,传统的应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的。

反转:程序本身不创建对象,而变成被动的接收对象。

依赖注入:就是利用 Set 的方法来进行注入【必须要有set方法】。

IOC 是一种编程思想,由主动的编程编程 被动的接收

可以通过该 newClassPathXmlApplicationContext 去浏览一下底层的源码。

到现在,我们可以不用在程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的IOC ,一句话就是 对象由Spring创建,管理,装配!

测试类

public class MyTest {
    public static void main(String[] args) {
//        获取spring 的上下文对象!
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//        我们的对象都在 Spring中管理,我要使用,直接去里面取出来就可以了。
//      get我们需要的bean的id,强转成我们需要的对象
        Hello hello = (Hello) context.getBean("hello");
        System.out.printf( hello.toString());
    }
}

实例化容器

获取 spring 的上下文对象。**Spring 实例化容器就相当于 “婚介网站” **

我们的对象都在 Spring 中管理,我要使用,直接去beans.xml里面取出来就可以了。

getBean 取出我们需要的bean,通过 bean 的 id 进行标记,强转成我们需要的对象

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

提供给ApplicationContext构造函数的一个或多个位置路径是资源字符串,可让容器从各种外部资源(例如本地文件系统,Java等)加载配置元数据CLASSPATH

实例化的时候会把里面的所有对象都创建出来

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="UserMysqlImpl" class="com.lsw.dao.UserMysqlImpl"/>
    <bean id="UserOracleImpl" class="com.lsw.dao.UserOracleImpl"/>
  
    <bean id="UserServiceImpl" class="com.lsw.service.UserServiceImpl">

        <property name="userDao" ref="UserMysqlImpl"/>

    </bean>
</beans>

总结

  • 所有的类都需要装备到 Bean 中
  • 所有的Bean 都需要容器去取
  • 容器中取得的 Bean 就是一个对象

4、IOC创建对象的方式

使用无参构造方法创建对象(默认)

 public User() {
        System.out.println("User 的无参构造方法。");
    }
    <bean id="user" class="com.lsw.pojo.User">
        <property name="name" value="时倾"/>
    </bean>
public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//      get我们需要的bean的id,强转成我们需要的对象
        User user = (User) context.getBean("user");
        user.show();
    }

使用有参构造方法创建对象

    public User(String name) {
        this.name = name;
    }

1.参数下标赋值

<!--  第一种方式,下标赋值 -->
    <bean id="user" class="com.lsw.pojo.User">
        <constructor-arg index="0" value="卢大大"/>
    </bean>

2.类型匹配

不建议使用

        <bean id="user" class="com.lsw.pojo.User">
            <constructor-arg type="java.lang.String" value="asdf..."/>
        </bean>

3.直接通过参数名

        <bean id="user" class="com.lsw.pojo.User">
            <constructor-arg type="name" value="asdf..."/>
        </bean>

总结:

在配置文件 beans.xml 加载的时候,实例化容器中的对象都已经被全部创建初始化出来了

无论是不是用,都会初始化容器里面的东西。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页