Spring-01,Spring入门介绍,核心容器,工程搭建,控制反转与依赖注入,Bean的配置(未完)

2023-10-29

Spring框架

1.什么是Spring?

Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能

1.1spirng的优点

1.方便解耦,简化开发

通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

2.AOP编程的支持

通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。

3.声明式事务的支持

在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。

4.方便程序的测试

可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。

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

Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。

6.降低Java EE API的使用难度

Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
在这里插入图片描述

2.Spring核心容器

Spring容器会负责控制程序之间的关系,而不是由程序代码直接控制。Spring为我们提供了两种核心容器,分别为BeanFactory和ApplicationContext

2.1 BeanFactory

创建BeanFactory实例时,需要提供Spring所管理容器的详细配置信息,这些信息通常采用XML文件形式来管理,其加载配置信息的语法如下:

 BeanFactory beanFactory = 
           new XmlBeanFactory(new FileSystemResource("F: /applicationContext.xml"));

2.2 ApplicationContext

继承了BeanFactory,不但实现了的功能,并且能够增加国际化,资源访问,事件传播等

常用实现类

ClassPathXmlApplicationContext 主要用户获取 resource 路径下的配置

	//大多数使用这种方式
ApplicationContext applicationContext = new 			                               						 ClassPathXmlApplicationContext("classpath:bean01.xml");
Student student = applicationContext.getBean(Student.class);

FileSystemXmlApplicationContext 主要获取绝对路径的配置

		ApplicationContext applicationContext = new 								   				           FileSystemXmlApplicationContext("src\\main\\resources\\bean01.xml");
Student student = applicationContext.getBean(Student.class);

3.工程搭建

3.1 创建java工程,引入依赖

<properties>
        <!--在当前pom 或者父类pom 中声明属性  -->
        <spirng.version>5.0.16.RELEASE</spirng.version>
</properties>

<!-- 引入spring 核心依赖  -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spirng.version}</version>
</dependency>

3.2 在resource创建spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--
        再配置文件 告诉容器 需要创建拿下对象  <bean>就是一个对象
    -->
    <!--  一个bean 就是一个对象  就是让容器创建一个对象-->
    <bean id="student" class="com.yth.entity.Student">
        <!--  设置属性值-->
        <property name="id" value="100"></property>
        <property name="name" value="赵四"></property>
    </bean>
</beans>

3.测试

@Test
public void Test01(){
    BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("src\\main\\resources\\bean01.xml"));
    Student student = beanFactory.getBean(Student.class);
    System.out.println(student);
}
@Test
public void Test02(){
    ApplicationContext applicationContext =  new ClassPathXmlApplicationContext("classpath:bean01.xml");
    Student student = applicationContext.getBean(Student.class);
    System.out.println(student);
}
@Test
public void Test03(){
    ApplicationContext applicationContext = new FileSystemXmlApplicationContext("src\\main\\resources\\bean01.xml");
    Student student = applicationContext.getBean(Student.class);
    System.out.println(student);
}

4.控制反转与依赖注入

4.1 控制反转IOC

控制反转,IOC。在使用Spring框架之后,**对象的实例不再由调用者来创建,而是由Spring容器来创建,**Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是控制反转。

将**创建对象的权力交给容器,我们只需要告诉容器你需要常见那些对象就可以了,并且容器会一直持有这个对象,管理对象的声明周期,通过getBean()**获取对象

自建创建

// 自己手动创建对象
        Student student = new Student();

容器创建

  		// spring容器获取对象步骤:
        // 1.bean.xml 声明要创建的对象
        // 2.使用BeanFactory 的子类 去加载 bean.xml 配置 ,按照配置文件创建 bean对象,并且放置在容器中
        // 3. getBean(Student.class);  使用getBean 根据类型获取  

4.2 依赖注入DI

DI的全称是Dependency Injection,中文称之为依赖注入

从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入。

依赖注入主要用来控制容器中对象之间的依赖关系

	<!-- 声明一个id为studentDao的实例   -->
    <bean id="studentDao" class="com.yth.dao.impl.StudentDaoImpl"></bean>
    <!-- 通过ref="iStudentDao"  容器中idiStudentDao 的对象 设置到StudentServiceImpl 对应studentDao 属性内  -->
    <bean id="studentService" class="com.yth.service.impl.StudentServiceImpl">
        <property name="studentDao" ref="studentDao"></property>
    </bean>

测试

 ApplicationContext applicationContext =  new ClassPathXmlApplicationContext("classpath:bean01.xml");
        StudentService studentService = (StudentService) applicationContext.getBean("studentService");
        // 不需要手动控制依赖 使用容器控制依赖关系
        // studentService.setStudentDao(StudentDao);
        Student student = studentService.getStudentByID(10);
        System.out.println(student);

5. Bean的配置

5.1 什么是Bean?

如果把Spring看做一个大型工厂,则Spring容器中的Bean就是该工厂的产品。要想使用这个工厂生产和管理Bean,就需要在配置文件中告诉它需要哪些Bean,以及需要使用何种方式将这些Bean装配到一起。

Bean的本质就是Java中的对象,而Spring中的Bean其实就是对实体类的引用,来生产Java类对象,从而实现生产和管理Bean 。

5.2 Bean的属性

Bean的配置使用xml配置,XML配置文件的根元素是,中包含了多个子元素,每一个子元素定义了一个Bean,并描述了该Bean如何被装配到Spring容器中。关于元素的常用属性如下表所示:

image-20200520230325929

注意:

id必须是Bean中唯一的,而name可以有多个

<!--  一个bean 就是一个对象  就是让容器创建一个对象
    id 容器创建对象的唯一标识
    name 也为对象取一个标识 name  name可以有多个 使用,或者; 分割
-->
<bean id="student" name="zhaosi,si" class="com.yth.entity.Student">
    <!--  设置属性值-->
    <property name="id" value="100"></property>
    <property name="name" value="赵四"></property>
</bean>
//根据属性名获取student
@Test
public void Test05(){
    ApplicationContext applicationContext = new FileSystemXmlApplicationContext("src\\main\\resources\\bean01.xml");
    Student student = (Student) applicationContext.getBean("zhaosi");
    System.out.println(student);
    Student student2 = (Student) applicationContext.getBean("si");
    System.out.println(student2);
}

5.3 Bean的实例化

在Spring中,要想使用容器中的Bean,也需要实例化Bean。实例化Bean有三种方式,分别为构造器实例化、静态工厂方式实例化和实例工厂方式实例化(其中最常用的是构造器实例化)。

5.3.1 默认无参构造方法

容器调用无参构造方法创建对象

5.3.2 静态工厂实例方法

好处就是:可以自定创建的对象,并且将对象交给容器管理

创建静态工厂

package com.yth.Factory;
import com.yth.entity.Student;
/**
 * @author yth
 * @date 2020/10/19 - 20:33
 */
public class StaticStudentFactory {
    /**
     * 自定义 Student 对象的创建
     * 获取了创建对象的权力
     * @return
     */
    public static Student createStudent(){
        Student student = new Student();
        // 比如name 去网络查询 数据库查询
        student.setName("广坤");
        student.setId(101);
        return student;
    }
}

声明使用工厂创建的对象

	<!--
        bean 像容器声明创建对象  此时创建对象是由静态工厂创建  而不是容器直接创建
        class="com.qfedu.factory.StaticStudentFactory" 创建对象的静态工厂
        factory-method="createStudent"  制定创建对象的静态工厂方法
    -->
<bean id="student" class="com.yth.Factory.StaticStudentFactory" factory-method="createStudent"></bean>

测试获取对象

ApplicationContext applicationContext = new FileSystemXmlApplicationContext("classpath:Factory\\StaticStudentFactory.xml");
Student student = (Student) applicationContext.getBean("student");
System.out.println(student);

5.4.3 实例工厂实例化

作用和静态工厂实例化一致

创建实例工厂

package com.yth.Factory;
import com.yth.entity.Student;
/**
 * @author yth
 * @date 2020/10/19 - 20:48
 */
public class StudentFactory {
    public Student creatStudent(){
        Student student = new Student();
        // 自定义初始化  student
        student.setName("xiaoming");
        student.setId(1000);
        return student;
    }
}

声明实例工厂并用实例工厂创建对象

<!--  声明实例工厂 创建实例工厂对象 -->
<bean id="studentFactory" class="com.yth.Factory.StudentFactory"></bean>
<!--
    通过实例工厂创建对象
    factory-bean="studentFactory"  引用实例工厂
    factory-method="creatStudent" 调用实例工厂的 creatStudent 创建自定义的Student对象 并放置到容器中
-->
<bean id="student" factory-bean="studentFactory" factory-method="creatStudent"></bean>

测试

//实例工厂创建bean
@Test
public void Test07(){
    ApplicationContext applicationContext = new FileSystemXmlApplicationContext("classpath:Factory\\StudentFactory.xml");
    Student student = (Student) applicationContext.getBean("student");
    System.out.println(student);
}

5.4.4 总结

静态工厂实例化和工厂实例化的作用是更具自己定义需求创建对象,主要用于dao层连接的初始(解决MySQL密码加密问题)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring-01,Spring入门介绍,核心容器,工程搭建,控制反转与依赖注入,Bean的配置(未完) 的相关文章

  • Java 中的 <-- 是什么? [复制]

    这个问题在这里已经有答案了 我遇到了下面的片段 它输出到4 3 2 1 我从来没有遇到过 lt 在爪哇 Is lt 使 var1 的值变为 var2 的运算符 public class Test public static void mai
  • Java LostFocus 和 InputVerifier,按反向制表符顺序移动

    我有一个 GUI 应用程序 它使用 InputVerifier 在产生焦点之前检查文本字段的内容 这都是很正常的 然而 昨天发现了一个问题 这似乎是一个错误 但我在任何地方都找不到任何提及它的地方 在我将其报告为错误之前 我想我应该问 我在
  • 我们可以有条件地声明 spring bean 吗?

    有没有一种方法可以有条件地声明 Spring bean 例如
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • ThreeTen 向后移植与 JSR-310 的比较

    由于某些原因 我们现在无法使用 java 8 我们仍然停留在 java 7 上 不过 我想使用新的JSR 310 date time APIs现在 使用官方向后移植 ThreeTen http www threeten org threet
  • 为什么解析这个 JSON 会抛出错误?

    我正在尝试解析这个 JSONObject query yahoo count 1 results rate Name USD INR id USDINR Time 12 19pm Date 10 31 2015 Bid 65 405 Ask
  • 如何使用双重调度来分析图形基元的交集?

    我正在分析图形基元 矩形 直线 圆形等 的交互并计算重叠 相对方向 合并等 这被引用为双重调度的一个主要示例 例如维基百科 http en wikipedia org wiki Double dispatch 自适应碰撞算法通常要求 不同的
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • Joshua Bloch 的构建器设计模式有何改进?

    早在 2007 年 我就读过一篇关于 Joshua Blochs 所采用的 构建器模式 的文章 以及如何修改它以改善构造函数和 setter 的过度使用 特别是当对象具有大量属性 其中大部分属性是可选的 时 本文对此设计模式进行了简要总结
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 如何向页面添加 HTML 页眉和页脚?

    如何使用 itext 从 html 源添加标题到 pdf 目前 我们已经扩展了 PdfPageEventHelper 并重写了这些方法 工作正常 但当我到达 2 个以上页面时 它会抛出 RuntimeWorkerException Over
  • 我们如何使用 thymeleaf 绑定对象列表的列表

    我有一个表单 用户可以在其中添加任意数量的内容表对象这也可以包含他想要的列对象 就像在 SQL 中构建表一样 我尝试了下面的代码 但没有任何效果 并且当我尝试绑定两个列表时 表单不再出现 控制器 ModelAttribute page pu
  • Azure Java SDK:ServiceException:ForbiddenError:

    尝试了基本位置检索器代码 如下所示 String uri https management core windows net String subscriptionId XXXXXXXX 5fad XXXXXX 9dfa XXXXXX St
  • java实现excel价格、收益率函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Spring Data Rest 多对多 POST

    首先 让我解释一下我的用例 这非常简单 有一个用户实体和一个服务实体 我使用 UserService 作为连接实体 连接表 在用户和服务之间建立多对多关联最初 会有一些用户集和一些服务集 用户可以在任何时间点订阅任何服务 在这种情况下 将向
  • 使用 Apache 允许 Glassfish 和 PHP 在同一服务器中协同工作

    是否可以建立从 Java 到 php 文件的桥梁 我有一个用 Java 编写的应用程序 我需要执行http piwik org http piwik org 这是用 PHP 编写的 在服务器中 我正在运行 PHP 但无法从浏览器访问 php
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上

随机推荐

  • TightVNC H264编解码(一)

    时光流逝 时间过的真快啊 疲于工作 发现近一个多月没写文章了 此文算是对最近的工作做个总结吧 经过尽二个月的不断摸索 TightVNC终于支持H264编解码了 前期真正编写H264编解码器只花了一周左右时间 但是测试发现效果并不是太理想 帧
  • 2022年android面试题,Android资深架构师分享学习经验及总结

    前言 最近有些朋友提问 Android QQ空间 换肤实现原理是什么 于是 我决定在这里做一下回答 对这个方面感兴趣的朋友也可以来看下 手q的换肤机制主要是通过拦截系统resource中的sPreloadedDrawables静态缓存变量
  • 为什么说“低估值买入,买到即赚到”?

    投资究竟能不能挣到钱 到底是由哪个环节决定的 买入还是卖出 直觉上说 这个问题的答案理所当然是 卖出 就连路边卖杂货的小商贩都明白 只要卖出价高于买入价 就可以挣到钱 直到我看了 穷查理宝典 接触到价值投资的理念 想法有了根本性改变 买入的
  • 对opencl helloworld代码的修正

    由于代码比较乱 数组也容易越界 故重新加了个类 用了stl vector 代码如下 test cl kernel void hello kernel global const float a global const float b glo
  • java jdbc线程池的使用

    好久没直接使用jdbc了 今天重温了一下相关知识 并对连接池的使用写了简单的示例 记录在此以便需要的同行参考和方便自己查阅 不足之处欢迎批评指正 1 dbcp数据源 所需jar包 dbcp 连接池的实现 commons pool2 连接池实
  • RedisTemplate 使用 Redis 缓存

    与使用注解方式不同 注解方式可以零配置 只需引入依赖并在启动类上加上 EnableCaching 注解就可以使用 而使用 RedisTemplate 方式麻烦些 需要做一些配置 Redis 配置 第一步还是引入依赖和在启动类上加上 Enab
  • 设计模式:策略模式

    我们玩游戏会有策略游戏 设计模式也会有策略模式 最开始接触策略模式的使用场景 是关于校验 针对不同的业务要进行不同的校验 同样的场景 优惠券折扣 不同渠道的信息发布等 Strategy Design Pattern 以下是GoF 是指提出和
  • 开发实况4.1.linux相关-CRT连接虚拟机提示用户名或密码错误

    文章目录 开发实况4 1 linux相关 CRT连接虚拟机提示用户名或密码错误 一 简介 二 问题解决 开发实况4 1 linux相关 CRT连接虚拟机提示用户名或密码错误 一 简介 已知我输入的用户名和密码正确但是却跳failed 二 问
  • Mac下使用GitHub+Hexo搭建个人博客

    首发链接 开始之前需要在电脑上安装好Git和node js Mac上可以使用Homebrew命令行工具来安装Git和node js 安装Homebrew 在命令行工具输入以下命令 如果已经安装过Homebrew可以忽略 usr bin ru
  • pjsip库使用时,顺序也有一定要求,

    LIBS PWD third lib pjsip lib libpjsua aarch64 unknown linux gnu a LIBS PWD third lib pjsip lib libpjsip ua aarch64 unkno
  • Arrays.asList(T...a)的使用问题

    我们经常会使用Arrays asList来初始化一个列表List 例如 List
  • 希尔排序图文详解+代码实现

    希尔排序也是一种插入排序 它是直接插入排序经过改进之后的一个更高效的版本 也称为缩小增量排序 性质 1 时间复杂度 O nlogn 2 空间复杂度 O 1 下面先介绍一下直接插入排序 理解了直接插入排序 希尔排序就很好理解了 实现代码也是由
  • 徐泽阳7.28黄金白银涨跌走势预测;期货原油实时策略指导

    黄金消息面与基本面解析 现货黄金反弹 因美元指数承压下行 但后者仍运行在92 50上方附近 在美联储政策会议召开之际 市场情绪趋于谨慎 美联储重点将围绕缩减购债以及对通胀飙升的忍耐度展开讨论 同时还要审慎考虑防疫形势可能的恶化 美元指数已从
  • mqtt 发送消息过多_物联网宠儿mqtt.js那些事儿

    常见的mq有Kafka RocketMQ和RabbitMQ 大家也很常见 前者很常见 MQTT是什么呢 MQTT属于IoT也就是物联网的概念 常见的mq有Kafka RocketMQ和RabbitMQ 大家也很常见 MQTT是什么呢 Kaf
  • utc时间转毫秒

    public class DateUtils private DateUtils public static final String FORMAT UTC yyyy MM dd T HH mm ss SSS Z public static
  • win10中Docker安装、构建镜像、创建容器、Vscode连接实例

    Docker方便一键构建项目所需的运行环境 首先构建镜像 Image 然后镜像实例化成为容器 Container 构成项目的运行环境 最后Vscode连接容器 方便我们在本地进行开发 下面以一个简单的例子介绍在win10中实现 Docker
  • md5文件校验 java代码_MD5文件校验码生成java代码

    import java io File import java io FileInputStream import java io IOException import java io InputStream import java nio
  • 优秀C++STL文章的索引

    2023年6月3日 周六下午 今天打算好好学习一下C 的STL库 找到了一些不错的教程 STL教程 C STL快速入门 非常详细 https www cnblogs com fusiwei p 11823234 html C STL教程入门
  • 应用篇-Zabbix对端口的监控

    配置 主机 需要添加端口监控的ip 监控项 创建监控项 按照图内填入对应端口信息 端口监控项创建完成 端口的监控不仅仅是要端口的数据的数据 更需要的是一个触发的机制 当端口不在时 触发告警 通知对应的业务人员及时处理 接下来是触发器的设置
  • Spring-01,Spring入门介绍,核心容器,工程搭建,控制反转与依赖注入,Bean的配置(未完)

    Spring框架 1 什么是Spring Spring框架是一个开放源代码的J2EE应用程序框架 由Rod Johnson发起 是针对bean的生命周期进行管理的轻量级容器 lightweight container Spring解决了开发