• SSM框架学习记录-Spring_day02


    1.IOC/DI配置管理第三方bean

    之前都是基于自己写的类,如果有需求去管理第三方Jar包中的类,该如何管理?


    案例:数据源对象管理

    使用SpringIOC容器来管理Druid连接池对象


    思路分析

    1. 要使用第三方的技术,需要在pom.xml添加依赖

    2. 在配置文件中将第三方的类(指DruidDataSource)制作成一个bean,让IOC容器进行管理

    3. 数据库连接需要基础的四要素(驱动、连接、用户名和密码)如何注入到对应的bean中?setter注入(因为Druid源码中没有构造器方法能接受这四个参数)

    4. 四要素写死在配置文件中不利于后期为维护,该如何修改?将值提取到外部的properties配置文件,Spring再去读取

    代码实现

    参考Spring_09_dataSource


    2.核心容器

    简单理解就是ApplicationContext

    代码参考Spring_10_container


    容器的创建方式

    // 1.加载类路径下的配置文件(常用)
    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    // 2.从文件系统下加载配置文件(需要写绝对路径)
    ApplicationContext ctx = new FileSystemXmlApplicationContext("xxx\\applicationContext.xml");
    
    • 1
    • 2
    • 3
    • 4
    Bean的三种获取方式

    BookDao bookDao1 = (BookDao) ctx.getBean("bookDao");  // 每次获取的时候都需要进行类型转换
    BookDao bookDao2 = ctx.getBean("bookDao",BookDao.class);  // 多加了一个参数
    BookDao bookDao3 = ctx.getBean(BookDao.class);  // 必须要确保IOC容器中该类型对应的bean对象只能有一个
    
    • 1
    • 2
    • 3
    总结

    • 容器相关:

      • BeanFactoryIOC容器的顶层接口,初始化BeanFactory对象时,加载bean是延迟加载(即需要在代码中使用到bean才会去初始化)
      • ApplicationContext接口是Spring容器的核心接口,初始化时bean立即加载(不过有没使用到bean,只要加载了配置文件都会去初始化)
      • ApplicationContext接口提供基础的bean操作相关方法,通过其他接口扩展其功能
      • ApplicationContext接口常用初始化类:
        • ClassPathXmlApplicationContext(常用)
        • FileSystemXmlApplicationContext
    • bean相关:

    在这里插入图片描述

    • 依赖注入相关:

    在这里插入图片描述

    3.IOC/DI注解开发


    注解开发定义bean

    使用配置文件定义bean时,需要写以下代码,使用注解开发时该如何定义bean

    <bean id="bookDao" class="com.psj.dao.impl.BookDaoImpl"/>
    
    • 1

    代码参考Spring_11_annotation_bean


    • 删除原XML配置
    • BookDaoImpl类上添加@Component注解:
      • 不可添加在接口上,因为接口无法创建对象
      • 如果不起别名,会有以当前类名首字母小写为默认名称
      • 该注解还有三个衍射注解:
        • @Controller::用于定义表现层bean
        • @Service:用于定义业务层bean
        • @Repository:用于定义数据(Dao)层bean

    在这里插入图片描述

    • 配置Spring的注解包扫描:为了让Spring框架能扫描到写在类上的注解,需要在配置文件上进行包扫描
    <context:component-scan base-package="com.psj"/>
    
    • 1
    纯注解开发模式

    上面代码中还是使用了配置文件用于对包进行扫描,纯注解开发模式则使用Java类替代配置文件,也就不需要applicationContext.xml

    代码参考Spring_11_annotation_bean


    • 创建配置类SpringConfig

    • 标识SpringConfig为配置类:添加@Configuration注解

    • 用注解替换包扫描配置:添加包扫描注解@ComponentScan(需要添加多个扫描路径用数组格式)

    • 运行时使用AnnotationConfigApplicationContext

    bean作用范围与生命周期管理

    代码参考Spring_12_annotation_bean_manager


    • Bean的作用范围:比如要将BookDaoImpl变成非单例,只需要在其类上添加@scope注解(默认值singleton,可选值prototype)

    • Bean的生命周期:

      • BookDaoImpl中添加两个方法,方法名可以任意
      • 在对应的方法上添加@PostConstruct@PreDestroy注解即可(注意要在pom文件中添加javax.annotation的依赖,因为JDK9移除了)
    注解开发依赖注入

    Spring为了使用注解简化开发,没有提供构造函数注入、setter注入对应的注解,只提供了自动装配(自动装配基于反射设计创建对象并通过暴力反射为私有属性进行设值,所以无需setter方法)的注解实现

    代码参考Spring_13_annotation_bean_manager


    • 按照类型注入:@Autowired默认按照类型自动装配,如果IOC容器中同类的Bean找到多个,就按照变量名和Bean的名称匹配
    @Service
    public class BookServiceImpl implements BookService {
        @Autowired
        private BookDao bookDao;
        ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 按照名称注入:
      • @Qualifier注解后的值就是需要注入的Bean的名称
      • @Qualifier不能独立使用,必须和@Autowired一起使用
    @Service
    public class BookServiceImpl implements BookService {
        @Autowired
        @Qualifier("bookDao1")
        private BookDao bookDao;
        ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 简单数据类型注入:使用@Value注解

      • 将值直接写入注解的参数
      @Repository("bookDao")
      public class BookDaoImpl implements BookDao {
          @Value("psj")
          private String name;
      	...
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 读取配置文件:
        • @PropertySource属性可用数组形式指定多个
        • @PropertySource属性中不支持使用通配符*
        • @PropertySource属性中可以把classpath:加上,代表从当前项目的根路径找文件
      // ①使用注解加载properties配置文件
      @Configuration
      @ComponentScan("com.psj")
      @PropertySource("jdbc.properties")
      public class SpringConfig {
      }
      // ②读取配置文件
      @Repository("bookDao")
      public class BookDaoImpl implements BookDao {
          @Value("${name}")
          private String name;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12

    4.IOC/DI注解开发管理第三方bean

    前面定义bean时候是在自己开发的类上面写注解,如果是第三方的类则没有办法在类上面添加注解,该怎么办?

    代码参考Spring_14_annotation_third_bean_manager


    管理第三方bean

    • 新建JdbcConfig配置类:该类代码可以直接写在SpringConfig类中,但是不利于区分和管理

    • 把数据源配置到该类下,并在方法上添加@Bean注解,表示将方法的返回值制作为Spring管理的bean对象:

    public class JdbcConfig {
        @Bean
        public DataSource dataSource(){
            DruidDataSource ds = new DruidDataSource();
            ds.setDriverClassName("com.mysql.jdbc.Driver");
            ...
            return ds;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • SpringConfig使用@Import引入JdbcConfig配置类:
    @Configuration
    @Import({JdbcConfig.class})  
    public class SpringConfig {}
    
    • 1
    • 2
    • 3
    第三方bean注入资源*

    在使用@Bean创建bean对象时,如果方法在创建的过程中需要其他资源该怎么办?


    • 注入简单类型:
      • 类中提供四个属性
      • 使用@Value注解引入值
    public class JdbcConfig {
        @Value("com.mysql.jdbc.Driver")
        private String driver;
        @Value("jdbc:mysql://localhost:3306/xxxx")
        private String url;
        @Value("xxxx")
        private String userName;
        @Value("xxxx")
        private String password;
        
        @Bean
        public DataSource dataSource(){
            DruidDataSource ds = new DruidDataSource();
            ds.setDriverClassName(driver);
            ...
            return ds;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 注入引用类型:只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象
    @Bean
    public DataSource dataSource(BookDao bookDao){
        System.out.println(bookDao);  // 前提是要扫描到该bean
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ...
        return ds;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5.注解开发总结


    在这里插入图片描述

    6.Spring整合

    使用Spring整合其他框架其实就是将其他框架需要的配置文件中的信息以bean的形式注入到Spring的容器中管理


    整合Mybatis

    代码参考Spring_15_spring_mybatis

    未整合前,Mybatis的核心文件为App.javaproperties配置文件,其中哪些对象可交给Spring来管理?

    • SqlSessionFactory(SqlSession对象在SqlSessionFactory中已经造出来了,并不属于核心对象):
    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    
    • 1
    • Mapper接口和Mapper映射文件(如果使用注解就没有映射文件),这个是在获取到SqlSession后执行具体操作时用:
    <mappers>
        <package name="com.psj.dao">package>
    mappers>
    
    • 1
    • 2
    • 3

    • Spring管理MyBatis中的SqlSessionFactory
    public class MybatisConfig {
        // 定义bean,SqlSessionFactoryBean,用于产生SqlSessionFactory对象
        // SqlSessionFactoryBean中将SqlSessionFactory的创建进行了封装,简化对象的创建,
        @Bean
        public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){  // dataSource在JdbcConfig中已经注入到Spring中
            SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
            // 下面两句分别是对SqlMapConfig.xml配置文件中typeAliases和environments的替换
            ssfb.setTypeAliasesPackage("com.psj.domain");
            ssfb.setDataSource(dataSource);
            return ssfb;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • Spring要管理Mapper接口的扫描:
    // 定义bean,返回MapperScannerConfigurer对象
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        // MapperScannerConfigurer用来处理原始配置文件中的mappers相关配置,加载数据层的Mapper接口类
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        // 对SqlMapConfig.xml配置文件中mappers的替换
        msc.setBasePackage("com.psj.dao");
        return msc;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    Spring整合Junit

    代码参考Spring_16_spring_junit

    重点在于添加相应的依赖以及在测试类中完成相关配置


    参考


    https://www.bilibili.com/video/BV1Fi4y1S7ix?p=17-30

  • 相关阅读:
    LeetCode377. 组合总和 Ⅳ
    聊聊 mysql 事务?(一)
    基于python下django框架 实现校园教室图书馆座位预约系统详细设计
    代理模式(Proxy模式)
    TVM 从入门到精通 | 安装 TVM (Part 1)
    WebSecurityConfigurerAdapter过时的替代方式
    Linux基本指令及周边(第一弹)
    使用Jekyll搭建博客,并绑定域名
    【树莓派】windows和树莓派之间文件共享(Samba)
    基于DevEco Studio的OpenHarmony应用原子化服务(元服务)入门教程
  • 原文地址:https://blog.csdn.net/qq_41398418/article/details/128182541