Spring框架从入门到入土(一):初识Spring框架

核心技术:ioc、aop

依赖:classa中使用的classb的属性或者方法,叫做classa依赖classb

核心功能ioc(Incersion of Control)

控制反转,是一个理论,概念,思想。

描述的:把对象的创建,赋值,管理工作都交给代码之外的容器实现,也就是对象的创建是有其他外部资源完成。

  • 控制:创建对象,对象的赋值属性,对象之间的关系管理。

  • 反转:把原来的开发人员管理,创建对象的权限交给代码之外的容器实现。由容器代替开发人员管理对象。创建对象,给属性赋值。

  • 正转:由开发人员在代码中,使用new构造方法创造对象,开发人员主动管理对象。

        public static void main(String[] args) {
            Student student = new Student();
        }
    
  • 容器:是一个服务软件,一个框架。

    为什么要使用ioc?

    目的是为了减少对代码的改动,也能实现不同的功能。实现解耦合!

java中创建对象的方式

  1. 构造方法,new 对象()
  2. 反射
  3. 序列化
  4. 克隆
  5. ioc:容器创建对象

ioc的一个体现:servlet

  1. 创建类继承HttpServlet
  2. 在web.xml注册servlet
  3. 没有创建servlet对象
  4. Servlet是Tomcat这个容器创建的。

IOC的技术实现:

DI是ioc的技术实现,DI(Dependency Injection):依赖注入,只需要在程序中提供要使用的对象的名称就可以了,对象在容器中如何创建,赋值,查找都是用容器内部来实现的。

spring是使用di实现了ioc的功能,spring底层创建对象,使用的是反射机制。

spring也是一个容器,可以管理对象,给对象赋值,底层是反射创建对象。

第一个例子

  • 创建一个自定义对象

实现步骤:

  1. 创建maven项目。
  2. 加入maven依赖。
<!--spring的依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
  1. 创建类(接口和实现类)和没有使用框架一样,就是普通的类。
package com.liang.service;

/**接口
 * @author liar
 * @date 编写时间: 2022/3/22 15:12
 */
public interface SomeService {

    /**
     * 这是一个测试方法
     */
    void doSome();
}
package com.liang.service.service.impl;

import com.liang.service.SomeService;

/**
实现类
 * @author liar
 * @date 编写时间: 2022/3/22 15:14
 */
public class SomeServiceImpl implements SomeService {
    @Override
    public void doSome() {
        System.out.println("执行了someserviceimpl的dosome方法");
    }
}
  1. 创建spring需要使用的配置文件,声明类的信息,这些类由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创建对象
    声明bean,就是告诉spring要创建某个类的对象
    id:对象的自定义名称,唯一值。spring通过这个名称找到对象
    class:类的全限定名称(不能是接口,因为spring是反射机制创建对象,必须使用类,不能使用接口)
    spring就完成SomeService someservice = new SomeServive();
    spring就是把创建好的对象放入到map中,spring框架中有一个map存放对象的。
    springMap.put(id的值,对象)
    
    一个bean声明一个java对象
    -->
    <bean id="SomeService" class="com.liang.service.impl.SomeServiceImpl"/>

</beans>
<!--
spring的配置文件
1. beans:是根标签,spring把java对象称为bean。
2. spring-beans.xsd:是约束文件,和mybatis指定的dtd一样。
-->
  1. 测试spring的创建。
//spring默认创建对象的时间:在创建spring容器的时候,会创建配置文件中的所有对象。
    @Test
    public void test02(){
        //使用spring容器
        //1. 指定spring配置文件名称
        String config = "beans.xml";
        //2. 创建表示spring容器的对象,ApplicationContext
        //ApplicationContext就是表示spring容器,通过容器获取对象
        //ClassPathXmlApplicationContext:表示从类路径中加载spring的配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);

        //从容器中获取某个对象,调用对象的方法
        SomeService service = (SomeService)ac.getBean("SomeService");
        //使用创建好的对象
        service.doSome();
    }
  1. 测试结果

image-20220322161653118

  • 创建一个非自定义对象
  1. 编写xml文件
    <!--spring能创建一个非自定义的对象吗,创建一个存在的某个类对象-->
    <bean id="mydate" class="java.util.Date"/>
  1. 测试方法
   /**
     *创建非自定义对象
     *spring创建对象,默认调用无参构造
     */
    @Test
    public void test04(){
        String config = "beans.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);

        //从容器中获取某个对象,调用对象的方法
        Date date = (Date)ac.getBean("mydate");
        //使用创建好的对象
        System.out.println(date);
    }
  1. 测试结果

image-20220323122504104