• 【JavaEE---复习】一、.Spring的Ioc和DI


    1.Spring的Ioc和DI

    1.1 Spring简介

    ​ Spring是分层的JavaSE/EE应用full-stack轻量级开源框架,以IOC和AOP为内核。

    IOC: 反转控制 AOP:面向切面编程

    ​ IOC Inversion of control(控制反转) :将对象的创建权反转给Spring

    ​ IOC的方法就是工厂+反射+配置文件

    ​ 如果想调用其他类,只需要修改配置文件就可以了

    //配置文件

    //工厂

    public class BeanFactory {

    public static Object getBean(String id) {

    // 解析配置文件

    ApplicationContext ac = new ClassPathXmlApplicationContext("xxx.xml");

    // 反射

    Class forName = UserDao.class.forName(id);

    return forName.newInstance();

    }

    DI:依赖注入

    ​ 前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来

    ​ 一站式框架就是有javaEE每一层解决方案的框架。

    ​ **WEB层:**SpringMVC

    Service层:Spring层的Bean管理,Spring的声明式事务

    DAO层: Spring的jdbc模板,Spring的ORM模块(用于和ORM框架整合,如mybatis)

    ​ 优势:1)方便解耦,简化开发

    ​ 2)AOP编程的支持

    ​ 3)声明式事务的支持

    ​ 4)方便程序的测试

    ​ 5)方便集成各种优秀框架

    ​ 6)降低JavaEE API的使用难度

    ​ 7)Java源码时经典学习范例

    1.2 Spring开发步骤

    ​ 1)在pom.xml 导入Spring开发的基本包坐标

    ​ spring-context

    ​ 2)编写Dao接口和实现类

    ​ 3)创建Springle核心配置文件applicationContext.xml

    ​ 4)在SPringle配置文件中配置UserDaoImpl

    ​ 5)使用Spring的API获得Bean实例

    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

    UserDao userDao = (UserDao) applicationContext.getBean("userDao");

    userDao.save();

    1.3 Spring配置文件

    1.3.1 Bean标签基本配置

    ​ 用于配置对象交由Spring来创建。

    ​ 默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。

    ​ 基本属性:

    ​ 1.id Bean实例在Spring容器中的唯一标识

    ​ 2.class Bean的全限定名称

    ​ 3.scope 指对象的作用范围,取值如下

    取值范围说明
    singleton默认值,单例的
    prototype多例的
    requestWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中
    sessionWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中
    global sessionWEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当 于 session

    1.3.2 Bean标签范围配置

    1)当scope的取值为singleton时

    Bean的实例化个数:1个

    Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例

    Bean的生命周期:

    对象创建:当应用加载,创建容器时,对象就被创建了

    对象运行:只要容器在,对象一直活着

    对象销毁:当应用卸载,销毁容器时,对象就被销毁了

    2)当scope的取值为prototype时

    Bean的实例化个数:多个

    Bean的实例化时机:当调用getBean()方法时实例化Bean

    Bean的生命周期:

    对象创建:当使用对象时,创建新的对象实例

    对象运行:只要对象在使用中,就一直活着

    对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了

    1.3.3 Bean生命周期配置

    ​ init-method 指定类中初始化方法名称

    ​ destory-method 指定类中销毁方法名称

    1.3.4 Bean实例化三种方式

    无参构造方法实例化

    会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败

    工厂静态方法实例化

    public class StaticFactoryBean {

    public static UserDao createUserDao(){

    return new UserDaoImpl();

    }

    }

    工厂实例方法实例化

    public class DynamicFactoryBean { public UserDao createUserDao(){ return new UserDaoImpl(); } }

    1.3.5 Spring的属性注入

    1)构造方法的注入

    2) set方法的方式的属性注入

    3)SpEL的属性注入

    // SpEL:Spring Expression Language,Spring的表达式语言。

    4)集合类型的属性注入
    ①注入数组类型

    王东

    赵洪

    李冠希

    ②注入list集合

    李兵

    赵如何

    邓凤

    ③注入set集合

    aaa

    bbb

    ccc

    ④注入Map集合

    Spring的重点配置

    标签

    **id属性:**在容器中Bean实例的唯一标识,不允许重复

    class属性:要实例化的Bean的全限定名

    scope属性:Bean的作用范围,常用是Singleton(默认)prototype

    **标签:**属性注入

    name属性:属性名称

    **value属性:**注入的普通属性值

    **ref属性:**注入的对象引用值

    标签

    map标签

    标签

    标签

    标签:导入其他的Spring的分文件

    1.4 Spring相关API

    1.4.1 ApplicationContext 的继承体系

    applicationContext:

    接口类型,代表应用上下文,可以通过其实例获得 Spring 容器中的 Bean 对象。

    1.4.2 ApplicationContext的实现类

    1)ClassPathXmlApplicationContext

    它是从类的根路径下加载配置文件 推荐使用这种

    2)FileSystemXmlApplicationContext

    它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。

    3)AnnotationConfigApplicationContext

    当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。

    1.4.3 Spring的重点API

    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

    UserService userService1 = (UserService) applicationContext.getBean("userService");

    UserService userService2 = applicationContext.getBean(UserService.class);

    1.5 Spring的注解开发

    ​ Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,多以注解开发时一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。

    1.5.1 Spring原始注解

    ​ 主要是代替的配置

    ​ 注解开发时,需要在appilcationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。

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

    注解说明
    @Component使用在类上用于实例化Bean
    @Controller使用在web层类上用于实例化Bean
    @Service使用在service层类上用于实例化Bean
    @Repository使用在dao层类上用于实例化Bean
    @Autowired使用在字段上用于根据类型依赖注入
    @Qualifier结合@Autowired一起使用用于根据名称进行依赖注入
    @Resource相当于@Autowired+@Qualifier,按照名称进行注入
    @Value注入普通属性
    @Scope标注Bean的作用范围
    @PostConstruct使用在方法上标注该方法是Bean的初始化方法
    @PreDestroy使用在方法上标注该方法是Bean的销毁方法

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

    使用@Compont或@Service标识UserServiceImpl需要Spring进行实例化

    使用@Autowired或者@Autowired+@Qulifier或者@Resource进行userDao的注入

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

    使用@Value进行字符串的注入

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

    使用@Scope标注Bean的范围

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

    使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法

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

    1.5.2 Spring新注解

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

    在这里插入图片描述

    1.6 Spring集成Junit

    1.6.1 Spring集成Junit步骤

    ① 导入spring集成Junit的坐标

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

    ② 使用@Runwith注解替换原来的运行期

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

    ③ 使用@ContextConfiguration指定配置文件或配置类

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

    ④ 使用@Autowired注入需要测试的对象

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

    ⑤ 创建测试方法进行测试

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

  • 相关阅读:
    【力扣算法简单五十题】06.X的平方根
    Java升级:JDK 9新特性全面解析“
    Android Studio实现简单的图书馆订座系统
    JAVA计算机毕业设计动物在线领养网站Mybatis+系统+数据库+调试部署
    PHP WebShell 免杀
    机器学习笔记 - 时间序列的混合模型
    lock 和 synchronized 区别
    Combiner和Partitioner
    三分钟带你了解AD20中的3D元器件如何改变显示色彩
    【Node.JS】buffer类缓冲区
  • 原文地址:https://blog.csdn.net/ketemstion/article/details/127615464