全网最详细的Spring入门教程

一文学会Spring,Spring最简单的入门教程(万字好文) spring教程 阅读详情
AI摘要

该博客是Spring入门教程,介绍了Spring来源,通过解耦代码降低类间耦合性。阐述其本质为完全解耦,涉及IOC、DI等概念。还讲解了Spring使用方法,包括无注解和注解实现步骤,以及Spring的优化,如注入配置文件、第三方类,整合MyBatis、AOP和SpringMVC。

全网最详细的Spring入门教程

目录

全网最详细的Spring入门教程

一.Spring的来源

1.耦合代码如下:

2.解耦合代码如下:

二.Spring的本质

基本概念:

三.Spring的使用

1.无Spring注解具体实现步骤:

1.1.大致步骤:

创建 接口1 类1 接口2 类2

写 bean文件

写bean的配置

获取类

1.2.有简单类型依赖和无依赖的类实现方式如下:

项目框架:

pom.xml

ApplicationContext.xml

测试类(需要被容器创建的类)

客户类(使用者):

运行结果:

1.3.有集合类型依赖的类实现方式如下:

项目框架:

pom.xml

ApplicationContext.xml

测试类(需要被容器创建的类)

客户类(使用者):

运行结果:

1.4.有引用类型依赖的类实现方式如下:

项目框架:

pom.xml

ApplicationContext.xml

测试类(需要被容器创建的类)

客户类(使用者):

运行结果:

2.Spring注解具体实现步骤:

plus:Spring中的常用注解

2.1.大致步骤:

创建 接口1 类1 接口2 类2

在需要new的类加上注解

写 bean文件

写bean的配置 : 扫描命令代码

获取类

2.2.1有简单类型依赖和无依赖的类实现方式如下:

项目框架:

pom.xml

ApplicationContext.xml

测试类(需要被容器创建的类)

客户类(使用者)

运行结果:

2.2.2有简单类型依赖和无依赖的类实现方式如下:优化版:

项目框架:

pom.xml

SpringBeanConfiguration类的配置:

测试类(需要被容器创建的类)

客户类(使用者)

运行结果:

2.3.有集合类型依赖的类实现方式如下:

项目框架:

pom.xml

SpringBeanConfiguration类的配置:

测试类(需要被容器创建的类)

客户类(使用者)

运行结果:

2.4.有引用类型依赖的类实现方式如下:

项目框架:

pom.xml

SpringBeanConfiguration类的配置:

被依赖的类

测试类(需要被容器创建的类):

客户类(使用类)

运行结果:

四.Spring的优化

1.Spring注入propertis配置文件:

1.1无注解开发注入properties配置文件:

1.2有注解开发注入properties配置文件:

2.Spring注入第三方类

2.1无注解注入第三方类

2.2有注解注入第三方类

第一种方法:

第二种方法:

2.3在第三方类里面加入依赖类型

3.整合MyBatis:

3.1mybatis的复习

3.2整合操作分析:

3.3.Spring注解方式整合MyBatis具体操作

1.环境准备:

JDK:

Maven:

建立数据库表:

2.项目框架:

3.pom:

4.数据源的配置文件:MyBatis.properties:

5.pojo类:

6.Mapper类

7.实现接口:

8.实现类:

9.Jdbc配置类:

10.Mybatis配置类:

11.核心最重要:Spring配置类 !!!

12.测试类

13.测试结果:

4.AOP面向切面编程:

面向切面编程来源和概念:

项目框架:

pom.xml

实现的接口 和实现的类如下:

MyAdvice类的书写:

SpringBeanConfiguration的书写

客户类(使用类)

运行结果:

5.Spring整合SpringMVC

SpringConfig类:

SpringMVC类:

ServletContainerIniti类:

SpringMVCConfig类:


一.Spring的来源

其实spring的来源就是一个词语,完全解耦,为什么叫做完全解耦,还得从两个类的调用说起,接口1的实现类,我们叫做类1,接口2的实现类,我们叫做类2,现在我们有一个前提条件,就是,类2里面去new类1,且把类1的方法给到类2使用,我们现在形容类2和类1有依赖关系,也就是类2要依赖类1,那么如果出现一个境况也就是如果类1发生了改变,那么我们如何去使用类2,那我们在使用类2的时候就需要去改变类2里面的代码,一方面需要从新new一次类1,二方面需要把类2里面的方法对应新的类1的方法。此时这样的依赖之间的耦合性就会非常高。所以我们就有了一个策略,类2里面写new接口1,也就是在类二里面写一个set方法,这个方法的传参是一个实现类,方法的内容是把传入的实现类给到类2里面new的接口1,也就是说类2可以通过set的方法给类2里面new的接口1变成实现类1,这样就在我们每一次new 类2的时候,只需要new类2后,调用一次set方法就可以实现类2里面new类1,这样我们就实现了不用每次更改接口1的实现类的时候需要在类2里面修改代码了,我们就实现了一个解耦。

什么是耦合性:

类1实现接口1 类2实现接口2 而类2里面创建了类1,且把类1的方法调用在类2的方法中

1.耦合代码如下:

Interface1:

package com.dao;
​
public interface Interface1 {
    public void method1();
}
​


Class1:

package com.service;

import com.dao.Interface1;

public class Class1 implements Interface1 {
    @Override
    public void method1() {
        System.out.println("this is class1");
    }
}


Interface2:

package com.dao;

public interface Interface2 {
    public void method2();
}


Class2:

package com.service;
​
import com.dao.Interface1;
import com.dao.Interface2;
import org.eclipse.tags.shaded.org.apache.bcel.generic.NEW;
​
public class Class2 implements Interface2 {
    private Interface1 cl1 = new Class1();
    
    @Override
    public void method2() {
        cl1.method1();
    }
}
​

客户使用类:

package com.tang;
​
import com.service.Class2;
​
public class ClientUseClass {
    public static void main(String[] args){
        Class2 class1 = new Class2();
        class1.method2();
    }
}

如上明显是有耦合性的两个类,一旦类1的代码需要改变,类2也得需要重新new,且重新把类1的方法放入类2的方法,

这样耦合性太高代码的使用就会很麻烦,所以就出现了如下的解决方法:

2.解耦合代码如下:
Interface1:

package com.dao;
​
public interface Interface1 {
    public void method1();
}
​


Class1:

package com.service;
​
import com.dao.Interface1;
​
public class Class1 implements Interface1 {
    @Override
    public void method1() {
        System.out.println("this is class1");
    }
}
​

Interface2:

package com.dao;

public interface Interface2 {
    public void method2();
}


Class3

package com.service;

import com.dao.Interface1;
import com.dao.Interface2;

public class Class3 implements Interface2 {
    private Interface1 cl1;

    public void setClass (Interface1 m1){
        this.cl1 = m1;
    }

    @Override
    public void method2() {
        cl1.method1();
    }
}

客户使用类:

package com.tang;

import com.service.Class1;
import com.service.Class2;
import com.service.Class3;

public class ClientUseClass {
    public static void main(String[] args) {
        Class3 cl3 = new Class3();
        cl3.setClass(new Class1());
        cl3.method2();

    }
}

这样就发现我们的类3里面的类1的创建不是我们主动去改类3的代码,而是我们客户自己进行一个set,等于说,我们类的创建的方式不是我们手动创建了,而是我们去接受类,这样就从一个主观变成了被动,这样大大的减少了代码的耦合。

二.Spring的本质

本质其实就是完全解耦,用户通过容器来接受他们想要的类。就像我们把一些类放入到一个自动售卖机,我们

需要什么类就从里面拿,而不是自己去new。

基本概念:

这样我们类1的创建就有了这种方式创建,那么我们是不是也可以把类2的创建也可以这样创建呢,也是可以的,所以我们从上面来看,我们可以把类放在一个类似于set的这种结构和有客户new的结构里面,我们称这两种结构的总和叫做容器,也就是说我们可以通过容器来得到普通类,和有依赖关系的类,那么这些由容器创建的类叫做Bean,而这个解耦的技术叫做IOC,依赖反转技术,而用容器创建有依赖关系的类又叫做DI,也就是依赖注入,那么一下就出现了这几个名词,DI,IOC,bean,容器。

容器:创建类的一个封装的抽象概念。

bean:又容器创建的类的统称。

DI:由容器创建有依赖关系的类的技术,叫做依赖反转。

IOC:完全解耦,也就是包括有依赖关系的类的new和无依赖关系的new的统称的解耦的技术。

IOC技术是用容器放bean和DI。

而一个类可以依赖 简单数据类型 ,集合数据类型 , 引用数据类型 ,其实说白了都是类

三.Spring的使用

如何使用呢,刚才我们看到我们在使用多个类之间的关系的时候,我们在用Spring一共有几个必要的东西。

第一:得到无依赖的类。

接口1 类1 bean文件 bean的配置 获取类

第二:得到有依赖的类。

1.无Spring注解具体实现步骤:

1.1.大致步骤:
创建 接口1 类1 接口2 类2
写 bean文件
写bean的配置
获取类

1.2.有简单类型依赖和无依赖的类实现方式如下:

项目框架:

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
​
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
​
  <groupId>com.tang</groupId>
  <artifactId>TestSpring</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
​
  <name>TestSpring Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
​
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>
​
  <dependencies>
​
    <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-servlet-api -->
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-servlet-api</artifactId>
      <version>10.0.4</version>
​
    </dependency>
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>5.0.0</version>
    </dependency>
    <dependency>
      <groupId>jakarta.servlet.jsp</groupId>
      <artifactId>jakarta.servlet.jsp-api</artifactId>
      <version>3.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>jakarta.servlet.jsp.jstl</artifactId>
      <version>3.0.1</version>
    </dependency>
​
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
​
    <!--        Mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.5</version>
    </dependency>
    <!--        Mysql连接依赖-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.21</version>
    </dependency>
      
      
​
    <!--导入spring的context坐标,context依赖core、beans、expression-->
​
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.5.RELEASE</version>
      </dependency>
​
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
      </dependency>
​
​
​
  </dependencies>
​
  <build>
    <finalName>TestSpring</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

ApplicationContext.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
http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--bean就是java对象 , 由Spring创建和管理-->
 <bean id="User" class="com.tang.pojo.TestUser">
     <property name="id" value="22"/>
     <property name="name" value="eddie"/>
     <property name="hobby" value="sports"/>
     <property name="age" value="22"/>
 </bean>
</beans>

测试类(需要被容器创建的类)

package com.tang.pojo;

public class TestUser {

    //封装数据 可以用alter + insert 的方式来放入
    private int id;
    private String name;
    private String hobby;
    private int age;

    //无参构造
    public TestUser(){
    }

    //有参构造
    public TestUser(int id, String name, String hobby, int age) {
        this.id = id;
        this.name = name;
        this.hobby = hobby;
        this.age = age;
    }

    //setter and getter
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //toString的输出
    @Override
    public String toString() {
        return "TestUser{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", hobby='" + hobby + '\'' +
                ", age=" + age +
                '}';
    }

    public void printSometh(){
        System.out.println("this is from TestUserClass");
    }
}

客户类(使用者):

package com.tang.test;

import com.tang.pojo.TestUser;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestUserClass {
    public static void main(String[] args) {
        //new ApplicationContext对象,记住要把ApplicationContent.xml要放入到文件里面
        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
		//通过context.getBean来get类后我们去接收
        TestUser usr = (TestUser)context.getBean("User");
        usr.printSometh();


    }
}

运行结果:

1.3.有集合类型依赖的类实现方式如下:

项目框架:

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
​
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
​
  <groupId>com.tang</groupId>
  <artifactId>TestSpring</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
​
  <name>TestSpring Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
​
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>
​
  <dependencies>
​
    <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-servlet-api -->
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-servlet-api</artifactId>
      <version>10.0.4</version>
​
    </dependency>
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>5.0.0</version>
    </dependency>
    <dependency>
      <groupId>jakarta.servlet.jsp</groupId>
      <artifactId>jakarta.servlet.jsp-api</artifactId>
      <version>3.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>jakarta.servlet.jsp.jstl</artifactId>
      <version>3.0.1</version>
    </dependency>
​
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
​
    <!--        Mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.5</version>
    </dependency>
    <!--        Mysql连接依赖-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.21</version>
    </dependency>
      
     
    <!--导入spring的context坐标,context依赖core、beans、expression-->
​
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.5.RELEASE</version>
      </dependency>
​
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
      </dependency>
​
​
​
  </dependencies>
​
  <build>
    <finalName>TestSpring</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

ApplicationContext.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
http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--bean就是java对象 , 由Spring创建和管理-->
     <bean id="User" class="com.tang.pojo.TestUser">
         <property name="id" value="22"/>
         <property name="name" value="eddie"/>
         <property name="hobby" value="sports"/>
         <property name="age" value="22"/>
     </bean>
    <bean id="ListUser" class="com.tang.pojo.TestListUser">
        <property name="strlist">
            <list>
                <value>yes</value>
                <value>no</value>
                <value>and</value>
            </list>
        </property>
    </bean>
</beans>

测试类(需要被容器创建的类)

package com.tang.pojo;
​
import java.util.List;
​
public class TestListUser {
    private List<String> strlist;
​
    public void setStrlist(List<String> strlist) {
        this.strlist = strlist;
    }
​
    @Override
    public String toString() {
        return "TestListUser{" +
                "strlist=" + strlist +
                '}';
    }
    public void printSomething(){
        System.out.println("this is testlistuser class");
    }
}
​
​

客户类(使用者):

package com.tang.test;
​
import com.tang.pojo.TestListUser;
import com.tang.pojo.TestUser;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
public class TestUserClass {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        TestListUser listUser = (TestListUser)context.getBean("ListUser");
        String s = listUser.toString();
        System.out.println(s);
        listUser.printSomething();
​
    }
}
​

运行结果:

1.4.有引用类型依赖的类实现方式如下:
项目框架:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
​
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
​
  <groupId>com.tang</groupId>
  <artifactId>TestSpring</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
​
  <name>TestSpring Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
​
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>
​
  <dependencies>
​
    <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-servlet-api -->
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-servlet-api</artifactId>
      <version>10.0.4</version>
​
    </dependency>
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>5.0.0</version>
    </dependency>
    <dependency>
      <groupId>jakarta.servlet.jsp</groupId>
      <artifactId>jakarta.servlet.jsp-api</artifactId>
      <version>3.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>jakarta.servlet.jsp.jstl</artifactId>
      <version>3.0.1</version>
    </dependency>
​
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
​
    <!--        Mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.5</version>
    </dependency>
    <!--        Mysql连接依赖-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.21</version>
    </dependency>
​
    <!--导入spring的context坐标,context依赖core、beans、expression-->
​
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.5.RELEASE</version>
      </dependency>
​
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
      </dependency>
​
​
​
  </dependencies>
​
  <build>
    <finalName>TestSpring</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

ApplicationContext.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
http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--bean就是java对象 , 由Spring创建和管理-->
     <bean id="User" class="com.tang.pojo.TestUser">
         <property name="id" value="22"/>
         <property name="name" value="eddie"/>
         <property name="hobby" value="sports"/>
         <property name="age" value="22"/>
     </bean>
​
    <bean id="ListUser" class="com.tang.pojo.TestListUser">
        <property name="strlist">
            <list>
                <value>yes</value>
                <value>no</value>
                <value>and</value>
            </list>
        </property>
    </bean>
​
    <bean id="DiUser" class="com.tang.pojo.TestDiUser">
        <property name="testUser" ref="User"/>
    </bean>
​
</beans>

测试类(需要被容器创建的类)
package com.tang.pojo;
​
public class TestDiUser {
​
    private TestUser testUser;
​
    public void setTestUser(TestUser testUser) {
        this.testUser = testUser;
    }
​
    public  void printsomething(){
        testUser.printSometh();
        System.out.println("this is a TestDiUser Class");
    }
}
​

客户类(使用者):

package com.tang.test;
​
import com.tang.pojo.TestDiUser;
import com.tang.pojo.TestListUser;
import com.tang.pojo.TestUser;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
public class TestUserClass {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        TestDiUser listUser = (TestDiUser) context.getBean("DiUser");
        listUser.printsomething();
​
​
    }
}
​

运行结果:

2.Spring注解具体实现步骤:

plus:Spring中的常用注解

@Component:使用在类上用于实例化Bean @Controller:使用在web层类上用于实例化Bean(作用于@Component一致) @Service:使用在service层类上用于实例化Bean(作用于@Component一致) @Repository:使用在dao层类上用于实例化Bean(作用于@Component一致) @Autowired:使用在字段上用于根据类型依赖注入 @Qualifier:结合@Autowired一起使用用于根据名称进行依赖注入 @Resource:相当于@Autowired+@Qualifier,按照名称进行注入 @Value:注入普通属性 @Scope:标注Bean的作用范围 @PostConstruct:使用在方法上标注该方法是Bean的初始化方法 @PreDestroy:使用在方法上标注该方法是Bean的销毁方法 以上的这些注解主要是替代 Bean 标签的配置。但是这些注解还不能全部替代xml配置文件,包括以下几个新注解:

@Configuration:用于指定当前类是一个Spring 配置类,当创建容器时会从该类上加载注解 @ComponentScan:用于指定Spring 在初始化容器时要扫描的包 @Bean:使用在方法上,标注将该方法的返回值存储到Spring 容器中 @PropertySource:用于加载.properties 文件中的配置 @Import:用于导入其他配置类

2.1.大致步骤:
创建 接口1 类1 接口2 类2
在需要new的类加上注解
写 bean文件
写bean的配置 : 扫描命令代码
获取类

2.2.1有简单类型依赖和无依赖的类实现方式如下:
项目框架:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
​
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
​
  <groupId>com.tang</groupId>
  <artifactId>TestSpring</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
​
  <name>TestSpring Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
​
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>
​
  <dependencies>
​
    <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-servlet-api -->
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-servlet-api</artifactId>
      <version>10.0.4</version>
​
    </dependency>
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>5.0.0</version>
    </dependency>
    <dependency>
      <groupId>jakarta.servlet.jsp</groupId>
      <artifactId>jakarta.servlet.jsp-api</artifactId>
      <version>3.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>jakarta.servlet.jsp.jstl</artifactId>
      <version>3.0.1</version>
    </dependency>
​
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
​
    <!--        Mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.5</version>
    </dependency>
    <!--        Mysql连接依赖-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.21</version>
    </dependency>
​
    <!--导入spring的context坐标,context依赖core、beans、expression-->
​
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.5.RELEASE</version>
      </dependency>
​
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
      </dependency>
​
​
​
  </dependencies>
​
  <build>
    <finalName>TestSpring</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

ApplicationContext.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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context.xsd">
    
    <context:component-scan base-package="com.tang.pojo"/>
</beans>

测试类(需要被容器创建的类)

package com.tang.pojo;
​
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
​
@Component("testuser")
public class TestUser {
​
    @Value("eddie")
    private String id ;
​
    public void setId(String id) {
        this.id = id;
    }
​
​
    //无参构造
    public TestUser(){
    }
​
    public void printSometh(){
        System.out.println("this is from TestUserClass");
        System.out.println("this is the id : " + id);
    }
}
​

客户类(使用者)

package com.tang.test;
​
import com.tang.pojo.TestDiUser;
import com.tang.pojo.TestListUser;
import com.tang.pojo.TestUser;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
public class TestUserClass {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        TestUser testUser = (TestUser)context.getBean("testuser");
        testUser.printSometh();
    }
}
​

运行结果:

2.2.2有简单类型依赖和无依赖的类实现方式如下:优化版:

项目框架:

pom.xml

同上面没有优化的pom的配置一样

SpringBeanConfiguration类的配置:
package com.tang.config;
​
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
​
@Configuration
@ComponentScan("com.tang.pojo")
public class SpringBeanConfiguration {
}
​

测试类(需要被容器创建的类)
package com.tang.pojo;
​
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
​
@Component("testuser")
public class TestUser {
​
    @Value("eddie")
    private String id ;
​
    public void setId(String id) {
        this.id = id;
    }
​
​
    //无参构造
    public TestUser(){
    }
​
    public void printSometh(){
        System.out.println("this is from TestUserClass");
        System.out.println("this is the id : " + id);
    }
}

客户类(使用者)

package com.tang.test;
​
import com.tang.config.SpringBeanConfiguration;
import com.tang.pojo.TestDiUser;
import com.tang.pojo.TestListUser;
import com.tang.pojo.TestUser;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
public class TestUserClass {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringBeanConfiguration.class);
        TestUser testUser = (TestUser)context.getBean("testuser");
        testUser.printSometh();
    }
}
​

运行结果:

2.3.有集合类型依赖的类实现方式如下:
项目框架:

pom.xml

同上

SpringBeanConfiguration类的配置:
package com.tang.config;
​
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
​
@Configuration
@ComponentScan("com.tang.pojo")
public class SpringBeanConfiguration {
}
​

测试类(需要被容器创建的类)
package com.tang.pojo;
​
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
​
import java.util.List;
​
@Component("testuser")
public class TestUser {
​
    @Value("eddie")
    private String id ;
​
    @Value("{hello,hello}")
    private List<String> list;
​
    public void setList(List<String> list) {
        this.list = list;
    }
​
    public void setId(String id) {
        this.id = id;
    }
​
​
    //无参构造
    public TestUser(){
    }
​
    public void printSometh(){
        System.out.println("this is from TestUserClass");
        System.out.println("this is the id : " + id);
        System.out.println("this is the list :" + list);
    }
}
​

客户类(使用者)
package com.tang.test;

import com.tang.config.SpringBeanConfiguration;
import com.tang.pojo.TestDiUser;
import com.tang.pojo.TestListUser;
import com.tang.pojo.TestUser;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestUserClass {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringBeanConfiguration.class);
        TestUser testUser = (TestUser) context.getBean("testuser");
        testUser.printSometh();
    }
}

运行结果:

2.4.有引用类型依赖的类实现方式如下:

项目框架:

pom.xml

同上

SpringBeanConfiguration类的配置:
package com.tang.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.tang.pojo")
public class SpringBeanConfiguration {
}

被依赖的类

package com.tang.mapper;

import com.tang.pojo.User;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

import java.util.List;

@Repository   //这里注意也需要加上注解加载到bean中 
public interface Mapper {


    List<User> getListUser();

    int insertUser(User user);



}

测试类(需要被容器创建的类):
   package com.tang.pojo;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;

    @Component("testdiuser")
    public class TestDiUser {

        @Autowired
        private TestUser testUser;

        public void setTestUser(TestUser testUser) {
            this.testUser = testUser;
        }

        public  void printsomething(){
            testUser.printSometh();
            System.out.println("this is a TestDiUser Class");
        }
    }

客户类(使用类)
package com.tang.test;
​
import com.tang.config.SpringBeanConfiguration;
import com.tang.pojo.TestDiUser;
import com.tang.pojo.TestListUser;
import com.tang.pojo.TestUser;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
public class TestUserClass {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringBeanConfiguration.class);
        TestDiUser testdiuser = (TestDiUser) context.getBean("testdiuser");
        testdiuser.printsomething();
    }
}
​

运行结果:

四.Spring的优化

优化就是用spring这个ioc的思想和实现来new一下和整合一下我们经常用的东西。

比如我们用spring容器来整合mybatis,创建propertis类,整合springmvc。

1.Spring注入propertis配置文件:

如何用注解开发或者说用spring注入开发的方式来做到注解开发呢?

1.1无注解开发注入properties配置文件:

在bean文件中加入:

<context:property-placeholder location="classpath:db.properties,classpath:data.properties"></context:property-placeholder>

    <context:property-placeholder ignore-unresolvable="true" location="classpath:jdbc.properties,classpath:filePath.properties"/>


<context:property-placeholder 
	location="属性文件,多个之间逗号分隔"  
    file-encoding="文件编码"  
	ignore-resource-not-found="是否忽略找不到的属性文件"  
	ignore-unresolvable="是否忽略解析不到的属性,如果不忽略,找不到将抛出异常"  
	properties-ref="本地Properties配置"  
	local-override="是否本地覆盖模式,即如果true,那么properties-ref的属性将覆盖location加载的属性,否则相反"  
	system-properties-mode="系统属性模式,默认ENVIRONMENT(表示先找ENVIRONMENT,再找properties-ref/location的),NEVER:表示永远不用ENVIRONMENT的,OVERRIDE类似于ENVIRONMENT"  
	order="顺序"  
        />

1.2有注解开发注入properties配置文件:
@PropertySource("classpath:data.properties")
2.Spring注入第三方类

注入第三方类的意思是,我们需要注入到容器里面的类不是在我们new的实现类和实现接口里面,而是我们

自己需要从外部加载进来的类。

我们这里如下的举例就用我们在整合Mybatis时需要把datasource数据源放入到容器中

2.1无注解注入第三方类

<?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">
<!--管理DruidDataSource对象-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql:///library?useSSL=false"/>
    <property name="username" value="root"/>
    <property name="password" value="1234"/>
</bean>
</beans>
2.2有注解注入第三方类

第一种方法:

把第三方类写一个类出来如下:

这里的重点的是 不是说bean这个类就不像之前不是第三方类那样是直接在类上面表controller,service,component,reposity这样,而是在一个可以返回类的方法上去做这个操作。

package com.tang.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.tang.dao.testaops;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;



public class JdbcConfig {

    @Value("${jdbc.driver}")
    public String driver;

    @Value("${jdbc.url}")
    public String url;

    @Value("${jdbc.username}")
    public String username;

    @Value("${jdbc.password}")
    public String password;

    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        return ds;
    }
}

在bean类里面需要写如下import的配置:

package com.tang.config;

import org.springframework.context.annotation.*;

@Configuration
@ComponentScan("com.tang")
@EnableAspectJAutoProxy
@PropertySource("classpath:mybatisconf.properties")
//如下必须配置一个import 
@Import(JdbcConfig.class)
public class springbeanconfig {
}

第二种方法:

把第三方类写一个类出来如下:

注意这里是加了configuration

@configuration
package com.tang.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.tang.dao.testaops;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;



public class JdbcConfig {@Value("${jdbc.driver}")
public String driver;

@Value("${jdbc.url}")
public String url;

@Value("${jdbc.username}")
public String username;

@Value("${jdbc.password}")
public String password;

@Bean
public DataSource dataSource(){
    DruidDataSource ds = new DruidDataSource();
    ds.setDriverClassName(driver);
    ds.setUrl(url);
    ds.setUsername(username);
    ds.setPassword(password);
    return ds;
}
                         }

}

在bean的配置里面一定要配上扫描

@ComponentScan({"com.tang.config","com.tang.pojo","com.tang.dao"})





package com.tang.config;

import org.springframework.context.annotation.*;

@Configuration
@ComponentScan({"com.tang.config","com.tang.pojo","com.tang.dao"})
@EnableAspectJAutoProxy
@PropertySource("classpath:mybatisconf.properties")
//如下必须配置一个import
@Import(JdbcConfig.class)
public class springbeanconfig {
}

总结就是要么就是在第三方类配置上configuration,然后bean类配上扫描,要么第三方类不配置,就在bean类里面import即可

2.3在第三方类里面加入依赖类型

通过传参的方式放入第三方bean类如下:

 @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){ //这里就是传入的依赖的类
        SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
        ssfb.setDataSource(dataSource);
        return ssfb;
    }

3.整合MyBatis:

3.1mybatis的复习

jdbc就5步:

获取mysql驱动

得到connection对象

得到statement执行语句对象

得到结果集对象resultset

得到结果

从而衍生到mybatis的四步

前提条件是写好配置文件和一个mapper也就是sql语句的文件:

sqlsessionfactory.builder()里面加入配置文件得到sqlsessionfactory

调用opensession的方法后得到sqlsession 也就是是类似于得到一个preparestatement类

用sqlsession对象去调用delete update select 方法,而如果是查询和更新的话 直接把放入数据库的类和

需要查询依据的数据字段和需要放入的内容放入这些方法中,被sqlsesion调用后,会操作进入数据库从而直接得到结果

如上是其中一种方法,还有一种方法是:

sqlsessionfactory.builder()里面加入配置文件得到sqlsessionfactory

调用opensession的方法后得到sqlsession 也就类似于得到一个preparestatement类

sqlsession调用getmapper后得到dao对象

对象执行对应的语句得到结果或者把数据传入数据库中

这两种方法的对比其实就是一个是把操作类集成了一个具体的类 这个具体的类里面的方法

的名字也就是配置文件对应的sql语句的id,而方法的传参就是语句执行传入数据库的值或者是

查询的依据对象,而方法返回的值是语句执行的结果。

具体实现方法可以参考下面老师写的博客:

Mybatis实现增删改查mybatis增删改查code袁的博客-优快云博客

而这其中mybatis的得到dao对象其实就是

mybatis里面的mapper.xml的namespace 对应 dao的类名 , mapper.xml里面的 id 对应dao的方法名

把一个dao类里面的多个方法对应 增删改查的方法mapper.xml里面的sql语句:

方法的传参就是放到数据库里面的东西,方法的返回值就是从数据库里面拿出来的东西

而方法名和mapper.xml里面的id名对应即可

3.2整合操作分析:

所以在整合mybatis的时候要主要是去整合如下代码:


inputstream in = Resource.getResourceAsStream("mybatisConfi.xml");

SqlsessionFactroy sqlsessionfactory = new SqlSessionFactoryBuilder().build("in");



SqlSession sqlsession = sqlsessionfactory.opensession();

Mapper mapper = sqlsession.getMapper("mapper.xml");

List<User> list = mapper.getListUser();

把所有的步骤分为了两大块,第一块就是上面两行代码,第二块就是下面的两行代码:

那么先从第一块代码开始:

首先是数据源,也就是放入build的配置文件,配置文件里面有jdbc需要的配置和

1) 声明数据源DataSource,使用阿里的Druid连接池 2) 声明SqlSessionFactoryBean类,在这个类的内部创建SqlSessionFactory对象

3) 声明MapperScannerConfigurer类,在这个类的内部创建dao代理对象,创建的对象放在spring容器中 4) 声明service对象,把3)中的dao赋值给service对象属性

这里注意个细节,在原生mybatis开发中,创建sqlSessionFactory对象是需要mybatis-config.xml的,我们回顾,该配置文件中主要书写了三部分信息:

mybatis-config.xml 1.dataSource 记载数据库的连接信息 2.typeAliases 配置实体别名 3.mapper映射文件的注册

同理,使用SqlSessionFactoryBean来创建sqlSessionFactory对象,也需要这部分信息,需要这些,即依赖这些,就可以通过注入属性的方式得到这些信息。我们采用set注入的方式。

上面的三部分信息对应着SqlSessionFactoryBean的三个属性 1.dataSource–》指向数据库连接的配置 2.typeAliasesPackage–》指向实体类的包,可为该包下的所有类创建类名首字母小写的别名 3.mapperLocations–》值为通配符表达式,对所有匹配上的Mapper文件进行注册

此时mybatis-config.xml中的所有信息都通过注入的方式写到spring的配置文件中去了,所以mybatis-config.xml就可以不用了。

MapperScannerConfigurer spring提供MapperScannerConfigurer类来封装第二部分代码,用于生成userDao对象。 在原生开发步骤中,我们需要是用sqlSessionFactory对象来获得sqlSession对象,再指定XXXDao的class,进而获得对应的dao对象。 在spring的封装下,我们只需要在配置文件中对MapperScannerConfigurer进行配置,

sqlSessionFactoryBeanName-》sqlSessionFactory对象需要被注入 basePackage-》指定DAO接口所在的包

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--<context:component-scan base-package="com.tjise.bean"/>-->
    <!-- 加载数据库连接信息的属性文件 -->
    <context:property-placeholder location="classpath:jdbc-config.properties"/>
        <!-- 配置Druid数据源的Bean -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">

        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

    </bean>


    <!-- 配置SessionFactory的Bean -->
    <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

        <!-- 注入数据源 -->
        <property name="dataSource" ref="dataSource"/>

        <!-- 指定MyBatis配置文件的位置 -->
        <property name="configLocation" value="classpath:mybatis.xml"/>

        <!-- 给实体类起别名 -->
        <property name="typeAliasesPackage" value="com.tjise.entity"/>

    </bean>

    <!-- 配置mapper接口的扫描器,将Mapper接口的实现类自动注入到IoC容器中
     实现类Bean的名称默认为接口类名的首字母小写 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

        <!-- basePackage属性指定自动扫描mapper接口所在的包 -->
        <property name="basePackage" value="com.tjise.mapper"/>

    </bean>
</beans>




从上面的mybatis复习和用无注解spring整合mybatis可以看出,其实就是用容器的方式,

把sqlsessionfactoryBuilder(mybatisconfig.xml) 和 sqlsessionfactory.opensession() 用 sqlsessionfactorybean来代替

而 sqlsession.getmapper 的操作 用mapperscannerconfigurer 类来代替

这两个类里面又分别由datasource 和 mapper需要创建,所以 最后就整合成了 创建这两个类,在用spring创建这两个

类的过程中就是其实就做了这些操作。所以推断的意思是在bean中依赖注入这些类的时候就是在做如上几步操作。

总结一下:

1.

bean注入sqlsessionfactorybean和mapperscannerconfigurer => 也就是在new前面两个类的过程中有操作如下步骤sqlsessionfactoryBuilder(mybatisconfig.xml) 和 sqlsessionfactory.opensession() sqlsession.getmapper =>

所以最后mapper也就是实现的mapper接口,可以通过spring获取,如果需要获取实现类,就在依赖注入一次实现类即可。

往下推

2.

就是在依赖注入这如上两个类的过程中,有一些依赖也需要写到bean中,如注入 sqlsessionfactorybean时就有

dataSource类,configLocation变量,和 typeAliasesPackage。所以需要注入一次datasource,又因为datasoure的value依赖于一个properties文件所以要配置 <context:property-placeholder location="classpath:jdbc-config.properties"/>。

而在注入mapperscannerconfigurer时候又需要一个 dao,所以也要写到bean里面去。

那么汇总就需要在bean中写

  1. <context:property-placeholder location="classpath:jdbc-config.properties"/>

  2. datasource 包括 datasoure的value

  3. sqlsessionfactorybean 包括 datasource typeAliasesPackage configLocation

  4. mapperscannerconfigurer dao

3.

最后再就是走到了更简单的spring注入整合mybatis,也就是用第三方类和配置类来代替bean配置。

那么datasource需要一个类, sqlsessionfactorybean需要一个类,mapperscannerconfigurer需要一个类。

所以最后我的案例就是最简单的spring注入整合mybatis如下:

3.3.Spring注解方式整合MyBatis具体操作
1.环境准备:

JDK:

Maven:

建立数据库表:

2.项目框架:

3.pom:
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.tang</groupId>
  <artifactId>Test</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>Test Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>

    <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-servlet-api -->
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-servlet-api</artifactId>
      <version>10.0.4</version>



    </dependency>
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>5.0.0</version>
    </dependency>
    <dependency>
      <groupId>jakarta.servlet.jsp</groupId>
      <artifactId>jakarta.servlet.jsp-api</artifactId>
      <version>3.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>jakarta.servlet.jsp.jstl</artifactId>
      <version>3.0.1</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <!--        Mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.5</version>
    </dependency>
    <!--        Mysql连接依赖-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.21</version>
    </dependency>

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


    <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
    <!-- spring aop支持 -->
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>5.3.23</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.6</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>6.0.11</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.16</version>
    </dependency>

  </dependencies>

  <build>
    <finalName>TestReview</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

4.数据源的配置文件:MyBatis.properties:

这里注意连接词是&,还有时区是serverTimeZone=UTC

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/***?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC

//上面*** 是你对应的表的名称

jdbc.username=root
jdbc.password=****** 

//这里填自己的密码

5.pojo类:

package com.tang.pojo;

public class User {
    private int id;
    private int age;
    private String name;


    public User(){

    }

    public User(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

6.Mapper类

package com.tang.mapper;

import com.tang.pojo.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Service;
import java.util.List;

public interface Mapper {

    @Select("select * from test_table")
    List<User> getListUser();

    @Insert("insert into test_table(id,age,name) values(#{id},#{age},#{name})")
    int addUser(User user);
}

7.实现接口:

package com.tang.mapper;

import com.tang.pojo.User;

import java.util.List;

public interface TestMapper {

    List<User> getUsers();

    int addUsers(User u);

}

8.实现类:

package com.tang.service;

import com.tang.mapper.Mapper;
import com.tang.mapper.TestMapper;
import com.tang.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TestMapperImple implements TestMapper {

    @Autowired
    private Mapper mapper;

    public void setMapper(Mapper mapper) {
        this.mapper = mapper;
    }

    @Override
    public List<User> getUsers() {
        return mapper.getListUser();
    }

    @Override
    public int addUsers(User u) {
        return mapper.addUser(u);
    }
}

9.Jdbc配置类:
package com.tang.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;
import java.sql.Driver;

public class JdbcConfig {

    @Value("${jdbc.driver}")
    private String driver;

    @Value("${jdbc.url}")
    private  String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DataSource dataSource (){
        DruidDataSource  ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        return  ds;

    }

}

10.Mybatis配置类:
package com.tang.config;

import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

public class MyBatisConfig {

    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
        SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
        ssfb.setDataSource(dataSource);
        return ssfb;
    }

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.tang.mapper");
        return msc;
    }
}

11.核心最重要:Spring配置类 !!!

package com.tang.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:MyBatisConfig.properties")
@ComponentScan("com.tang")
@Import({JdbcConfig.class,MyBatisConfig.class})
public class SpringConfig {
}

12.测试类

package com.tang.test;

import com.tang.config.SpringConfig;
//import com.tang.service.MapperImple;
import com.tang.pojo.User;
import com.tang.service.TestMapperImple;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.List;

public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new  AnnotationConfigApplicationContext(SpringConfig.class);
        TestMapperImple mp = (TestMapperImple) context.getBean(TestMapperImple.class);
         List<User> list = mp.getUsers();
         for(User u : list){
             System.out.println(u);
         }
    }
}

13.测试结果:

4.AOP面向切面编程:

面向切面编程来源和概念:

首先还是来源是哪里,首先,在我们编写mybatis的时候,我们有一个mapper的类,而这个类最后是sqlsession返回的一个类,这个类的方法名对应着增删改查的操作步骤,可以总结为,mapper.xml文件对应了方法名,而这个mapper类执行对应的方法就是执行对应的sql语言,而sql语言也同样和方法一样,有一个输入和输出,输入就是模糊查询需要的字段,或者需要加入数据库的数据,而输出比如说是查询的结果。

总之:就是mapper.xml里面的 namespce = mapper.class

id = mapper.class里面对应的方法

就这样形成了一个对应,我们在通过sqlsession得到这个mapper的类的时候,我们操作这个类的方法其实就是操作

数据库的sql语句。

那么这个类这么重要,这个类对应了许多方法,那如果每个方法都有同样的代码,那我们就把他抽离出来,而

把这相同的代码叫做advice , 所有的方法叫做 joinpoint,而需要用同一advice的方法就叫做pointcut,

最后advice + pointcut 就叫做 Aspect

Advice 的类型

before advice, 在 join point 前被执行的 advice. 虽然 before advice 是在 join point 前被执行, 但是它并不能够阻止 join point 的执行, 除非发生了异常(即我们在 before advice 代码中, 不能人为地决定是否继续执行 join point 中的代码)

after return advice, 在一个 join point 正常返回后执行的 advice

after throwing advice, 当一个 join point 抛出异常后执行的 advice after(final) advice, 无论一个 join point 是正常退出还是发生了异常, 都会被执行的 advice. around advice, 在 join point 前和 joint point 退出后都执行的 advice. 这个是最常用的 advice. introduction,introduction可以为原有的对象增加新的属性和方法。

所以每一次我们编写有很多jointpoint的方法的类的时候,我们需要把切面单独拿出来,这样

我们写代码就不会那么的浪费资源,同一advice可以有不用的pointcut使用。

而使用方法就是把pointcut和advice 写在一个切面类中,把这个类标注切面和bean最后被spring容器扫描从而

注入到容器里面即可。其他的实现类的步骤就按正常的从spring得到类的操作正常进行即可。

项目框架:

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
​
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
​
    <groupId>com.tang</groupId>
    <artifactId>TestMybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
​
    <name>TestMybatis Maven Webapp</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>
​
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>
​
    <dependencies>
​
        <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-servlet-api -->
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-servlet-api</artifactId>
            <version>10.0.4</version>
​
        </dependency>
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>5.0.0</version>
        </dependency>
        <dependency>
            <groupId>jakarta.servlet.jsp</groupId>
            <artifactId>jakarta.servlet.jsp-api</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>jakarta.servlet.jsp.jstl</artifactId>
            <version>3.0.1</version>
        </dependency>
​
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
​
        <!--        Mybatis依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
        <!--        Mysql连接依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>
​
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.23</version>
        </dependency>
​
​
        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.7</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
        <!-- spring aop支持 -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.3.23</version>
        </dependency>
​
​
    </dependencies>
​
    <build>
        <finalName>TestReview</finalName>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

实现的接口 和实现的类如下:

接口:

package com.tang.dao;

public interface testaops {
    public void printyes();

    public void printno();


}

实现类:

package com.tang.service;


import com.tang.dao.testaops;
import com.tang.test.TestAop;
import org.springframework.stereotype.Service;

@Service
public class testaopsimpl implements testaops {
    @Override
    public void printyes() {
        System.out.println("yes");
    }

    @Override
    public void printno() {
        System.out.println("no");
    }
}

MyAdvice类的书写:

其实就是在aop的注解编程里面,其实可以把aop的切面当成一个类也是要放到bean容器里面

只是最后得到实现类的时候,调用实现类里面的方法时候会使用这个类的通知一并被调用。

但是值得注意的是这里的切点的标注是实现类的方法。

package com.tang.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;


@Component
@Aspect
public class MyAdvice {

    @Pointcut("execution(void com.tang.service.testaopimple.getAge())")
    private void pt(){}

    @Before("pt()")
    public void before(){
        System.out.println("============");
    }
}

SpringBeanConfiguration的书写

这里注意这里的componentscan一定要把切面所在的类扫到。


package com.tang.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@ComponentScan("com.tang")
@EnableAspectJAutoProxy
public class springbeanconfig {
}


客户类(使用类)

这里需要注意在getbean时候,这里放入的类不是实现类,而是接口类。这个地方和在切面类的切点的标注那里,都有点疑问,在后续学源码的时候再看看是什么原因。

package com.tang.test;
​
import com.tang.config.springbeanconfig;
import com.tang.dao.testaop;
import com.tang.dao.testaops;
import com.tang.service.testaopsimpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
​
public class testAops {
    public static void main(String[] args) {
       ApplicationContext context = new  AnnotationConfigApplicationContext(springbeanconfig.class);
       testaops test  = (testaops)context.getBean(testaops.class);
       test.printno();
       test.printyes();
    }
}

运行结果:

5.Spring整合SpringMVC

很简单:四个大类:

SpringConfig类:

package com.tang.config;
​
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;
​
@Configuration
@ComponentScan({"com.tang.service"})
@PropertySource("classpath:jdbc.properties")
@Import({DataSource.class,MybatisConfig.class})
@EnableTransactionManagement
public class SpringConfig {
}
​

SpringMVC类:

package com.tang.config;
​
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
​
@Configuration
//@ComponentScan({"com.tang.service","com.tang.controller"})
@ComponentScan({"com.tang.controller"})
@EnableWebMvc
​
public class SpringMVC {
}

ServletContainerIniti类:

package com.tang.controller;
​
import com.tang.config.SpringConfig;
import com.tang.config.SpringMVC;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
​
​
public class ServletContainerIniti extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }
​
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMVC.class};
    }
​
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

SpringMVCConfig类:

package com.tang.controller;
​
import com.tang.pojo.Book;
import com.tang.pojo.User;
import com.tang.service.MapperService;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
​
import java.util.ArrayList;
import java.util.List;
​
@RestController
@RequestMapping("/users")
public class SpringMVCConfig {
    @Autowired
    private MapperService mapperService;
​
    @PostMapping
    public Result save(User user){
        boolean flag = mapperService.save(user);
        return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);
    }
​
​
    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id){
        boolean flag = mapperService.delete(id);
        return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);
    }
​
    @PutMapping
    public Result update(User user){
        boolean flag = mapperService.update(user);
        return new Result(flag ? Code.UPDATE_OK : Code.UPDATE_ERR , flag);
    }
​
    @GetMapping("/{id}")
    public Result getUser(@PathVariable Integer id){
        User user =  mapperService.getById(id);
        if(user == null){
            return new Result(Code.GET_ERR,null);
        }
        return new Result(Code.GET_OK,user);
    }
​
    @GetMapping
    public Result getAll(){
        List<User>  users =  mapperService.getAll();
        if(users == null){
            return new Result(Code.GET_ERR,null);
        }
        return new Result(Code.GET_OK,users);
    }
}
​

Spring全面讲解(无比详细) 希望大家共同进步,有兴趣的可以互相加个关注。 阅读详情

相关推荐

Spring(全网最详细)值得收藏

接下来我们通过一段代码模拟IOC思想。创建一个集合容器,先将对象创建出来放到容器中,需要使用对象时,只需要从容器中获取对象即可,而不需要重新创建,此时容器就是对象的管理者。创建实体类// 省略getter/setter/构造方法/tostring创建Dao接口和实现类// 根据id查询学生@Override// 模拟从数据库查找出学生return new Student(1,"百战程序员","北京");@Override// 模拟从数据库查找出学生。

m0_68880377的博客 1540

Spring 最全入门教程详解

Spring 基础框架,可以视为Spring 基础设施,基本上任何其他 Spring 项目都是以 SpringFramework 为基础的。Spring 5 的模块结构图: lOC: Inversion of Control,翻译过来是反转控制。把对象创建和对象之间的调用过程,交给 Spring 进行管理Spring 的IOC 容器就是IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做 bean。在创建 bean 之前,首先需要创建IOC容器。Spring 提供了IOC容器的两种实现方式:

lucky_fd的博客 1万+

全网最详细的SpringCloud总结

构建分布式系统不需要复杂和容易出错。Spring Cloud 为最常见的分布式系统模式提供了一种简单且易于接受的编程模型,帮助开发人员构建有弹性的、可靠的、协调的应用程序。Spring Cloud 构建于 Spring Boot 之上,使得开发者很容易入手并快速应用于生产中。官方果然官方,介绍都这么有板有眼的。我所理解的 Spring Cloud 就是微服务系统架构的一站式解决方案,在平时我们构建微服务的过程中需要做如服务发现注册配置中心消息总线负载均衡断路器数据监控。

lingqu+wx bjmsb06 1028

Spring 入门教程

Spring 入门教程 1、参考资料 尚硅谷-Spring5框架最新版教程(idea版) 雷丰阳spring、springmvc、mybatis、spring一站式学习 项目地址:oneby1314/spring-learn 2、Spring 概述 2.1、Spring 框架概述 Spring 是轻量级的开源的 JavaEE 框架 Spring 为简化企业级开发而生,使用Spring,Javabean就可以实现很多以前要靠EJB才能实现的功能 Spring 有两个核心部分:IOC 和 AOP

Oneby的博客 1万+

Spring学习(汇总版)

一、Spring框架的概述 1.1 Spring框架介绍 Spring是一个轻量级的开源的Java2EE框架 1.2 Spring的主要优点 Spring可以解决企业开发的复杂性 1.3 Spring概念介绍 1、IOC IOC:全称 Inversion of Control(控制反转),把创建对象的过程交给Spring进行管理 2、AOP AOP:全称 Aspect Orient Programming(面向切面编程):不修改源码的基础上进行功能的增强 1.4 Spring的特点 方便解耦,简化开发 方

weixin_45495161的博客 1804

每天一个优秀提示词学习收藏 - 文本去AI化(四)

宝子们,今天不藏私啦!我把这段时间四处搜罗、潜心钻研出来的文本去AI化Prompt 提示词大礼包双手奉上,这可都是能让你的 AI 创作水平原地起飞的干货!走过路过不要错过,赶紧码住,开启你的 AI 创作进阶之旅吧!

2446

【Spring】全网最详细的Spring入门教程!

Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。Spring的一个最大的目的就是使JAVA EE开发更加容易。同时,Spring之所以与Struts、Hibernate等单层框架不同,是因为Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。可以说Spring是一个提供了更完善开发环境的一个框架,可以为POJO(Plain Ordinary Java Object)对象提供企业级的服务。

mf97532的博客 1515

数据库存储分层架构搭建:热数据 SSD 存储、冷数据归档的配置操作及性能对比分析

本文探讨了数据库存储分层架构的优化策略。随着数据量激增,传统单一存储模式面临成本与性能的平衡难题。文章提出通过热数据SSD加速和冷数据归档降本的分层方案,系统分析了热数据SSD配置、冷数据归档操作及性能对比。分层架构基于数据活跃度匹配存储介质,使热数据保持高性能访问,冷数据低成本存储,实现总体成本降低60%-80%的同时确保核心查询性能。文中详细介绍了硬件选型、数据库配置、数据迁移等技术细节,并强调了动态调整分层策略的重要性,为构建高效经济的数据库存储体系提供了完整解决方案。

jingjing45678的博客 1292

全网最详细的Spring Boot原理深度解析

全文通过源码分析、场景示例与架构图,揭示Spring Boot如何将复杂逻辑封装为“开箱即用”体验,助力开发者构建高效、可维护的企业级应用。理解这些原理,可精准掌控框架行为,提升问题诊断与定制化开发能力

m0_71744084的博客 8994

手把手教你用fusb302实现PD快充:从驱动移植到实战调试(附源码)

本文详细解析了基于FUSB302芯片实现USB PD快充的完整开发流程。内容涵盖芯片选型、硬件设计要点、Linux驱动移植与内核集成,并重点剖析了PD协议交互中的关键调试技巧,如“死亡15ms”时序问题与中断模式选择。文章通过实战经验,帮助嵌入式开发者高效完成从驱动移植到系统集成的全链路开发,并附有源码参考。

sky77的博客 377

哈工大2021年秋季学期数据结构期末试题

因为考完试没有收演草纸,所以题中数据与考试差距不大。选项顺序可能略有差异;选择第5题希尔排序的序列数据是后编的;简答第3题B-树的插入序列顺序可能不同,但是考察的点是一样的。其他题的数据基本可以保证和原题一样。 一、选择题 111.以下代码的时间复杂度是 for(int k=1;k<=n;k++) for(int j=1;j<=n;j++) count++; A.O(n)       B.O(nlogn) &

Castria的博客 4272

2021全网最全最详细的Spring面试题精选合集

1. Spring基础 1.1 什么是 spring? Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。 Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。 Spring可以做很多事情,

Java烂猪皮 6558

解决Google Play签名问题:Android App Bundle上传指南

摘要:本文分享了解决Android App Bundle上传至Google Play时遇到的签名问题的经验。当使用pepk.jar工具加密私钥时,出现"NoSuchAlgorithmException"错误。解决方案包括:确保使用JDK 11+版本、更新pepk.jar工具、验证密钥库信息,并提供详细命令行示例。通过升级开发环境和正确配置签名参数,最终成功生成加密密钥文件。文章为开发者提供了实用的技术参考,强调耐心排查问题的重要性。(149字)

m0_62153576的博客 146

总结:全网最详细,Spring框架整合各种常用日志方法

总结:Spring,SpringMVC,SpringBoot,Mybatis,Mybatis-Plus等框架整合日志的方法一·Spring框架整合“log4j+slf4j”日志:第一步:导入依赖第二步:在maven的resources资源文件夹下面,创建log4j的属性配置文件:log4j.properties(注意:文件名不能随便改动)注意:(1)项目里面可以正常使用@Slf4j注解二·Spring框架整合“log4j2+slf4j”日志:第一步:导入依赖第二步:在maven的resources资源文件夹

weixin_48033662的博客 3789

史上最全!研究生科研必备科研工具(含AI科研工具),附使用说明和示例

这些工具在科研中的应用非常广泛,可以帮助研究生更高效地完成研究任务。为了更好地利用这些工具,建议深入学习它们的官方文档和教程,或者参加相关的工作坊和培训。

智能AI让学术科研更容易 3945

GPU服务器维修全流程:从检测到解锁

《GPU服务器维修维保全流程指南》摘要:本文系统介绍GPU服务器从检测到解锁的完整维修流程。检测环节包含物理检查(氧化层、散热、PCB板)和电子诊断(ECC报错率、电源波动等);核心维修技术涵盖PCB板修复(微孔镀铜、BGA返修)和芯片级维修(成功率78-92%);解锁验证阶段包括性能解锁(VBIOS重写)和72小时稳定性测试。文末提供故障速查表及维保建议,强调定期除尘可降低38%故障率,推荐环境粉尘浓度控制在≤0.3mg/m³。

2401_89353317的博客 891

全网 spring 配置文件最详细讲解

【摘要】 文章目录 1. spring概述1.1 Spring是什么(理解)1.4 Spring的体系结构(了解) 2. spring快速入门2.1 Spring程序开发步骤2.2 导入Spring开... 文章目录 1. spring概述1.1 Spring是什么(理解)1.4 Spring的体系结构(了解)2. spring快速入门2.1 Spring程序开发步骤2.2 导入Spring开发的基本包坐标2.3 编写Dao接口和实现类2.4 创建Spring核心配置文件2.5 在Spring配置文件中

qq_39652397的博客 3238

使用lighttpd和开发板进行交互

本文介绍了如何在嵌入式开发板上使用Lighttpd Web服务器实现硬件交互功能。主要内容包括:Lighttpd通过CGI程序间接控制硬件的基本原理;lighttpd.conf配置文件的详细解析;开发板文件目录结构设计;用C语言编写控制GPIO的CGI程序示例;网页调用CGI实现按钮触发控制的HTML代码;常见问题调试建议。最后通过效果图展示了网页按钮点击后成功控制LED灯的实际效果,验证了Lighttpd+CGI方案在嵌入式设备Web控制中的可行性。

m0_49476241的博客 1424

全网最详细的SpringBoot入门保姆级教程

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

2401_84046545的博客 1053

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

全网最详细的Spring bean生命周期详解

全网最详细的Spring bean 生命周期详解

zhiyuanIT的专栏 1053

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

springboot整合minio全网最详细的教程

对象存储服务OSS(Object Storage Service)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。 安装minio 1、进入官网:https://min.io/ 在cmd窗口中,命令行进行minio.exe所在的文件夹,输入如下命令 server后面的地址是你图片上传之后的存储目录 minio.exe server E:\minio 因为这里api端口是9000,所以下面的yml需要配置9000端口.

Ting1king的博客 3万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: Linux硬件运维查询命令:
下一篇: 全网最详细如何下载一本电子书(能搜到基本能下载到)
YoYoYoWhatIsUp
博客等级 码龄4年 6848粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值