IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring概括:控制反转与依赖注入 -> 正文阅读

[Java知识库]Spring概括:控制反转与依赖注入

Spring

一:Spring概述

  1. 什么是Spring?
    1. 分层设计(持久层mybatis、业务层、控制层)

    2. Java SE/Java EE应用full-stack(全栈式)轻量级 开源的框架

      1. 轻量级:
        • 服务
        • 资源
        • 耦合度
    3. 两大核心

      • IOC :控制反转(创建对象角度:new;Spring容器)

      • AOP:面向切面编程(在我们不改变源代码的情况下,对业务进行更改)

        • public void  say(){   sout(123);sout(456) }
          
2:Sprig框架的发展史
  • 1997:IBM EJB
  • 2002年的,EJB
  • 2006年:EJB 3.0
  • 2017年:spring 5
3:Spring优势
  1. 方便解耦,简化开发(IOC)
    • spring容器,它可以对所有对象的创建和销毁提供维护,实现了解耦
      1. 耦合度:对象之间的一种关系。所以要合理的使用耦合度(Spring_IOC)

2.AOP编程的支持

  • 了解:面向切面编程

3.声明式事务的支持(数据库)

  • 通过配置(xml)来完成事务的支持,不再需要手动的编写代码

4.方便调试,能够使用Juit测试单元

5.方便集成各种优秀的框架

  • spring框架,不仅仅生产技术,搬运集成其他的技术

  • 依赖

    • 也是一种关系(类和类);maven体系,整个项目依赖了一些jar。某些类在依赖
4:Spring体系结构
  • https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=spring%20runntime&step_word=&hs=0&pn=4&spn=0&di=5170&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=undefined&cs=1923595979%2C3392501547&os=1235087408%2C2511900368&simid=1923595979%2C3392501547&adpicid=0&lpn=0&ln=1816&fr=&fmq=1632879421723_R&fm=&ic=undefined&s=undefined&hd=undefined&latest=undefined&copyright=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=https%3A%2F%2Fgimg2.baidu.com%2Fimage_search%2Fsrc%3Dhttp%3A%2F%2Fimg-blog.csdnimg.cn%2F20200125154101269.png%3Fx-oss-process%3Dimage%2Fwatermark%2Ctype_ZmFuZ3poZW5naGVpdGk%2Cshadow_10%2Ctext_aHR0cHM6Ly9oYW5xdWFuLmJsb2cuY3Nkbi5uZXQ%3D%2Csize_16%2Ccolor_FFFFFF%2Ct_70%26refer%3Dhttp%3A%2F%2Fimg-blog.csdnimg.cn%26app%3D2002%26size%3Df9999%2C10000%26q%3Da80%26n%3D0%26g%3D0n%26fmt%3Djpeg%3Fsec%3D1635471874%26t%3D5df400ffba22fdd67e41f939d04aa416&fromurl=ippr_z2C%24qAzdH3FAzdH3Fks52_z%26e3Bvf1g_z%26e3BgjpAzdH3Fftgwp_9d9bnn98AzdH3Fw6ptvsjAzdH3F1jpwtsfAzdH3F8a9abncna&gsm=5&rpstart=0&rpnum=0&islist=&querylist=&nojc=undefined

二:IOC :控制反转 -----》解耦

  • 解耦的原则

    • 编译时期不依赖,运行时依赖

      •   //第一种方式
                DriverManager.registerDriver(new com.mysql.jdbc.Driver());
                //第二种方式:反射
                Class.forName("com.mysql.jdbc.Driver");
        
  • 自定义IOC

    • 实现services层和dao层进行解耦(反射)

    • 步骤分析

      1. 创建Java项目,导入自定义的相关IOC坐标
      2. 编写Dao层和它的实现类
      3. 编写Servces层和实现类
      4. 编写测试代码

三:Spring框架入门案例

  • 实现services层和dao层进行解耦
    • 第一步:创建项目,导入依赖(Spring)
    • 第二步:定义xml(解决硬编码)
    • 第三步:容器中取相关对象
    • 第四步:测试代码

四:SpringAPI

  • BeanFactory

    • IOC容器的核心接口,它定义了ico的基本功能(解析,ioc)

    • XmlBeanFactory xmlBeanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
              Object u = xmlBeanFactory.getBean("u"); //getbean :创建的实例
      
  • ApplicationContext

    • 代表应用上下问对象(spring项目),可以获取spring容器中的对象 :容器启动的时候

      •   ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        
  • 常用类

    • ClassPathXmlApplicationContext :当前项目中 推荐使用
      FileSystemXmlApplicationContext:随意的方法
      
  • 常用方法

    • getBean(String name):根据id获取ioc容器中的对象
      getBean(String  name,Class<T> class_ ) :根据id和运行时状态
      
      
      

五:Spring配置文件

  • bean标签

    • id:Bean在spring容器中的唯一标识
      class:全限定路径名
      * 默认情况调用的式类中的无参构造方法,如果没有无参构造,则会创建失败
      
  • bean标签的范围配置

    • <bean id="c1" class="com.domain.Car" scope="prototype"></bean>
      prototype:多例
      singleton:单例
      
      
  • bean的声明周期配置

    •  <bean id="c2" class="com.domain.Car"  init-method="init" destroy-method="destory"></bean>
      init:对象创建的时候
      detroy:对象销毁的时候
      

六:bean的实例化

  • 无参构造方法

    • <bean id="c1" class="com.domain.Car" scope="prototype"></bean>
      
  • 工厂方式

package com.Utils;

import com.dao.User02;

public class BeanFactory {

    private static User02 user02;

    static {

        user02 = new User02();

    }

    public static User02  getUser02(){
        return  user02;
    }
    //一步到位
//    public static User02 createBean(){
//        return new User02();
//    }
}
  • 静态

    •  <bean id="c3" class="com.utils.StaticCarFactory" factory-method="getCar">
        
            </bean>
      
package com.Utils;

import com.dao.User02;

public class InstranceFactory {
    private User02 user02;

    public InstranceFactory(){
        user02 = new User02();
    }

    public User02 getUser02(){
        return  user02;
    }

    /*
    public class InstranceFactory(){
     System.out.println("正在创建中")
    }
    public User02 createBean(){
     return new User02;
    }
     */

}
  • 实例

    •   <bean id="if" class="com.utils.InstanceCarFactory"></bean>
            <bean id="c4" class="com.domain.Car" factory-bean="if" factory-method="getCar"></bean>
      
    • 静态工厂:只需要一个bean;实例化工厂至少需要两个bean

  • 依赖注入:
    • 它也是Spring框架的IOC的具体体现

      • 在我们编写代码的时候,创建对象的权力交给Spring(IOC),代码中不可能出现没有依赖的情况。

        IOC只能降低他们的依赖关系,但不能消除;Serveices —》Dao

      • 那这种类似业务层和数据持久层的依赖关系。在使用Spring以后,就让Spring来维护了。依赖注入

  • 依赖注入分类
    • 构造方法

      • <bean id="um" class="com.mapper.imp.UserMapperImp">
              <!-- <constructor-arg value="孙悟空"></constructor-arg>
               <constructor-arg value="15"></constructor-arg>-->
              <!-- <constructor-arg index="0" value="12"></constructor-arg>
               <constructor-arg index="1" value="苏"></constructor-arg>-->
               <constructor-arg name="name" value="wuuw"></constructor-arg>
                <constructor-arg name="age" value="11"></constructor-arg>
           </bean>
        
    • set方法

      • <bean class="com.domain.User" id="user"></bean>
            <!--set实现注入-->
            <bean id="um2" class="com.mapper.imp.UserMapperImp">
                <property name="name" value="小猪猪"></property>
                <property name="age" value="23"></property>
                <property name="u" ref="user"></property>
            </bean>
        
    • p空间命名法

      • 引入p约束

      • xmlns:p="http://www.springframework.org/schema/p"
        
      •  <bean id="um3" class="com.mapper.imp.UserMapperImp" p:u-ref="user"></bean>
        

依赖注入:(基本类型/以用类型)

  • 数组、List集合、map集合、自定义

  • 环境搭建

    1. 导入依赖

      • <dependencies>
               <dependency>
                   <groupId>org.springframework</groupId>
                   <artifactId>spring-context</artifactId>
                   <version>5.2.17.RELEASE</version>
               </dependency>
        
               <dependency>
                   <groupId>junit</groupId>
                   <artifactId>junit</artifactId>
                   <version>4.12</version>
                  
               </dependency>
           </dependencies
        
  • 配置文件

    • <?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">
      
      
      </beans>
      
  • 实验相关类

    • package com;
      
      public class Book {
      }
      -------------------------------
      package com;
      
      import java.util.Arrays;
      import java.util.List;
      import java.util.Map;
      
      public class User {
          private  String name;
          private  int age;
          private List<String> lists;
          private  List<Book>  books;
          private  String[]  arr;
          private  Book[] arrbook;
          private Map<String,String> maps;
          private  Map<String,Book> map_books;
      
          public User() {
          }
      
          public User(String name, int age, List<String> lists, List<Book> books, String[] arr, Book[] arrbook, Map<String, String> maps, Map<String, Book> map_books) {
              this.name = name;
              this.age = age;
              this.lists = lists;
              this.books = books;
              this.arr = arr;
              this.arrbook = arrbook;
              this.maps = maps;
              this.map_books = map_books;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public int getAge() {
              return age;
          }
      
          public void setAge(int age) {
              this.age = age;
          }
      
          public List<String> getLists() {
              return lists;
          }
      
          public void setLists(List<String> lists) {
              this.lists = lists;
          }
      
          public List<Book> getBooks() {
              return books;
          }
      
          public void setBooks(List<Book> books) {
              this.books = books;
          }
      
          public String[] getArr() {
              return arr;
          }
      
          public void setArr(String[] arr) {
              this.arr = arr;
          }
      
          public Book[] getArrbook() {
              return arrbook;
          }
      
          public void setArrbook(Book[] arrbook) {
              this.arrbook = arrbook;
          }
      
          public Map<String, String> getMaps() {
              return maps;
          }
      
          public void setMaps(Map<String, String> maps) {
              this.maps = maps;
          }
      
          public Map<String, Book> getMap_books() {
              return map_books;
          }
      
          public void setMap_books(Map<String, Book> map_books) {
              this.map_books = map_books;
          }
      
          @Override
          public String toString() {
              return "User{" +
                      "name='" + name + '\'' +
                      ", age=" + age +
                      ", lists=" + lists +
                      ", books=" + books +
                      ", arr=" + Arrays.toString(arr) +
                      ", arrbook=" + Arrays.toString(arrbook) +
                      ", maps=" + maps +
                      ", map_books=" + map_books +
                      '}';
          }
      }
      
      

数组类型

  • <?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="book" class="com.Book">
            <property name="page" value="10"></property>
       </bean>
         <bean id="u1" class="com.User">
              <property name="age" value="12"></property>
              <property name="name" value="武松"></property>
              <!--数组-->
              <property name="arr">
                   <array>
                        <value>a</value>
                        <value>b</value>
    
                   </array>
              </property>
              <property name="arrbook">
                  <array>
                       <ref bean="book"></ref>
                  </array>
              </property>
         </bean>
    </beans>
    
  • 测试代码

    •  @org.junit.Test
          public  void method01(){
      
              ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
      
              System.out.println(context.getBean("u1",User.class));
          }
      

List集合和数组一样

Map和properties集合

<!--        list集合-->
        <property name="lists">
            <list>
                <value>aaa</value>
                <value>bbb</value>
            </list>
        </property>
        <property name="books">
            <list>
                <ref bean="book"></ref>
            </list>
        </property>
<!--        map集合-->
        <property name="maps">
            <map>
                <entry key="tom" value="wudi"></entry>
                <entry key="som" value="hahha"></entry>
            </map>
        </property>
        <property name="map_books">
            <map>
                <entry key="kkk" value-ref="book"></entry>
            </map>
        </property>
<!--        properties集合-->
        <property name="properties">
            <props>
                <prop key="01">张三</prop>
                <prop key="02">历史</prop>
            </props>
        </property>
    </bean>

配置文件模块化(spring)

  • 传统的配置文件方式,依赖注入太多,容易乱。我们就可以对配置文件进行拆分,该方式就被称为配置文件模块化(三层架构/功能)

  • 实施

    • 主从配置文件

    •  <import resource="a.xml"></import>
      

spring整合DBUtils(账户 增删改查 三层架构)

  • sql语句

    • CREATE DATABASE spring_db;
      
      USE spring_db;
      CREATE TABLE account(
         id INT PRIMARY KEY AUTO_INCREMENT,
         NAME VARCHAR(20),
         money DOUBLE
      );
      INSERT INTO	account VALUES (NULL,'猪八戒',1000);
      
      
  • 依赖坐标

    • <?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>org.example</groupId>
          <artifactId>spring_dbuitls</artifactId>
          <version>1.0-SNAPSHOT</version>
      
          <dependencies>
              <dependency>
                  <groupId>mysql</groupId>
                  <artifactId>mysql-connector-java</artifactId>
                  <version>5.1.49</version>
              </dependency>
              <dependency>
                  <groupId>commons-dbutils</groupId>
                  <artifactId>commons-dbutils</artifactId>
                  <version>1.6</version>
              </dependency>
              <dependency>
                  <groupId>com.alibaba</groupId>
                  <artifactId>druid</artifactId>
                  <version>1.2.7</version>
              </dependency>
              <dependency>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>4.12</version>
      
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-context</artifactId>
                  <version>5.2.17.RELEASE</version>
              </dependency>
          </dependencies>
      </project>
      
  • 创建实体类

    • package com.domain;
      
      public class Account {
      
          private  int id;
          private  String name;
          private  double money;
      
          public Account() {
          }
      
          public Account(int id, String name, double money) {
              this.id = id;
              this.name = name;
              this.money = money;
          }
      
          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 double getMoney() {
              return money;
          }
      
          public void setMoney(double money) {
              this.money = money;
          }
      
          @Override
          public String toString() {
              return "Account{" +
                      "id=" + id +
                      ", name='" + name + '\'' +
                      ", money=" + money +
                      '}';
          }
      }
      
      
  • 创建DAO

    • 接口

      • package com.Dao;
        
        import com.domain.Account;
        
        import java.util.List;
        
        public interface AccountDao {
        
            //查找所有的账户
            public List<Account> findAll();
            //查找单个用户
            public  Account findByid(Integer id);
            //插入账户
            public  void  insert(Account account);
            //修改账户
            public  void  update(Account account);
            //删除账户
            public  void  delete(Integer id);
        
        }
        
        
    • 实现类

      • package com.Dao.imp;
        
        import com.Dao.AccountDao;
        import com.domain.Account;
        
        import java.util.List;
        
        public class AccountDaoImp  implements AccountDao {
            @Override
            public List<Account> findAll() {
                return null;
            }
        
            @Override
            public Account findByid(Integer id) {
                return null;
            }
        
            @Override
            public void insert(Account account) {
        
            }
        
            @Override
            public void update(Account account) {
        
            }
        
            @Override
            public void delete(Integer id) {
        
            }
        }
        
        
  • Services

    • 接口

      • package com.services;
        
        import com.domain.Account;
        
        import java.util.List;
        
        public interface AccountServices {
        
            //查找所有的账户
            public List<Account> findAll();
            //查找单个用户
            public  Account findByid(Integer id);
            //插入账户
            public  void  insert(Account account);
            //修改账户
            public  void  update(Account account);
            //删除账户
            public  void  delete(Integer id);
        }
        
        
    • 实现类

      • package com.services.imp;
        
        import com.Dao.imp.AccountDaoImp;
        import com.domain.Account;
        import com.services.AccountServices;
        
        import java.util.List;
        
        public class AccountServicesImp implements AccountServices {
            //需要Dao层对象
            private AccountDaoImp accountDaoImp;
        
            public AccountServicesImp() {
            }
        
            public AccountServicesImp(AccountDaoImp accountDaoImp) {
                this.accountDaoImp = accountDaoImp;
            }
        
            @Override
            public List<Account> findAll() {
                return accountDaoImp.findAll();
            }
        
            @Override
            public Account findByid(Integer id) {
                return accountDaoImp.findByid(id);
            }
        
            @Override
            public void insert(Account account) {
                accountDaoImp.insert(account);
            }
        
            @Override
            public void update(Account account) {
                accountDaoImp.update(account);
            }
        
            @Override
            public void delete(Integer id) {
                accountDaoImp.delete(id);
            }
        }
        
        
  • 实现查询所有用户

    • dao层查询所有方法

      • package com.services.imp;
        
        import com.Dao.imp.AccountDaoImp;
        import com.domain.Account;
        import com.services.AccountServices;
        
        import java.util.List;
        
        public class AccountServicesImp implements AccountServices {
            //需要Dao层对象
            private AccountDaoImp accountDaoImp;
        
            public AccountServicesImp() {
            }
        
            public AccountServicesImp(AccountDaoImp accountDaoImp) {
                this.accountDaoImp = accountDaoImp;
            }
        
            @Override
            public List<Account> findAll() {
                return accountDaoImp.findAll();
            }
        
            @Override
            public Account findByid(Integer id) {
                return accountDaoImp.findByid(id);
            }
        
            @Override
            public void insert(Account account) {
                accountDaoImp.insert(account);
            }
        
            @Override
            public void update(Account account) {
                accountDaoImp.update(account);
            }
        
            @Override
            public void delete(Integer id) {
                accountDaoImp.delete(id);
            }
        }
        
        
    • ioc依赖注入

      • <?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">
        
            <!--把数据库连接池交给ioc容器管理-->
            <bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
                <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
                <property name="url"  value="jdbc:mysql:///spring_db"></property>
                <property name="username" value="root"></property>
                <property name="password" value="12345"></property>
            </bean>
            <!--把QueryRunner交给ioc-->
            <bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
                <constructor-arg name="ds" ref="datasource"></constructor-arg>
            </bean>
            <!--把AccountDaoImp-->
            <bean id="accountDaoImp" class="com.Dao.imp.AccountDaoImp">
                <property name="queryRunner" ref="queryRunner"></property>
            </bean>
            <!--把AccountService交给ioc容器管理-->
            <bean id="accountServicesImp" class="com.services.imp.AccountServicesImp">
                <constructor-arg name="accountDaoImp" ref="accountDaoImp"></constructor-arg>
            </bean>
        </beans>
        
    • 测试数据

      •  //查询所有操作
            @Test
            public  void method(){
        
                //spring+dbutils+druid整合
                ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
                AccountServicesImp imp = context.getBean("accountServicesImp", AccountServicesImp.class);
                List<Account> all = imp.findAll();
                System.out.println(all);
            }
        

Spring引入jdbc.properties文件

  • 引入context命名空间和约束路径

    • 命名空间s
      xmlns:context="http://www.springframework.org/schema/context"
      约束
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
      
  • xml文件配置

    •   <context:property-placeholder location="jdbc.properties"></context:property-placeholder>
      
    • 注意事项

      • properties文件键和注入的成员变量名称区分开(jdbc.)

注解

  • 开启注解扫描

    •  <context:component-scan base-package="com"></context:component-scan>
      
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-09 16:08:22  更:2021-10-09 16:09:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:23:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码