Spring和SpringBoot学习

Spring的两个核心特性:依赖注入(dependency injection,DI)和面向切面编程(aspect-oriented programming,AOP)

第1章 Spring之旅

Spring的使命:简化Java开发

为了降低Java开发的复杂性,Spring采取了以下4种关键策略:

  1. 基于POJO的轻量级和最小侵入性编程;
  2. 通过依赖注入和面向接口实现松耦合;
  3. 基于切面和惯例进行声明式编程;
  4. 通过切面和模板减少样板式代码。

一、依赖注入(dependency injection,DI)

目的是松耦合 ,关键是如何进行装配:

方法1.XML的配置

 

方法2.基于Java的配置

 ----------------------------------------------------------------------------------------------------------------

二、面向切面编程(aspect-oriented programming,AOP)

允许把遍布应用各处的功能分离出来形成可重用的组件,确保POJO的简单性。

 在xml文件中配置  把Minstrel声明为一个Spring切面

 ---------------------------------------------------------------------------------------------------------------------------

三、使用模板消除样板式代码

Spring旨在通过模板封装来消除样板式代码。Spring的JdbcTemplate使得执行数据库操作时,避免传统的JDBC样板代码成为了可能。

例:旧的,不适用模板的连接数据库查询操作

 使用模板进行查询:

 -------------------------------------------------------------------------------------------------------------------------------

四、Bean

对象生存于Spring容器(container)中。

Spring自带了多个容器实现,可以归为两种不同的类型:

  1. bean工厂(由org.springframework. beans.factory.eanFactory接口定义)是最简单的容器,提供基本的DI支持。
  2. 应用上下文(由org.springframework.context.ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。(更高级,更常使用)

1.使用应用上下文

  • AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文。
  • AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文。
  • ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。
  • FileSystemXmlapplicationcontext:从文件系统下的一个或多个XML配置文件中加载上下文定义。
  • XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义。

例如,如下代码展示了如何加载一个FileSystemXmlApplicationContext:

 类似地,可以使用ClassPathXmlApplicationContext从应用的类路径下加载应用上下文:

如果想从Java配置中加载应用上下文,那么可以使用AnnotationConfigApplicationContext

 

在这里没有指定加载Spring应用上下文所需的XML文件,AnnotationConfig-ApplicationContext通过一个配置类加载bean。


应用上下文准备就绪之后,就可以调用上下文的getBean()方法从Spring容器中获取bean。

2.bean的生命周期

 

1.Spring对bean进行实例化;
2.Spring将值和bean的引用注入到bean对应的属性中;
3.如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法;
4.如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
5.如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来;
6.如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法;
7.如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法。类似地,如果bean使用initmethod声明了初始化方法,该方法也会被调用;
8.如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法;
9.此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
10.如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。

---------------------------------------------------------------------------------------------------------------------------------

五、Spring模块

 第2章 装配Bean

装配:创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入(DI)的本质

配置Spring容器最常见的三种方法:

  1. 在XML中进行显式配置。
  2. 在Java中进行显式配置。
  3. 隐式的bean发现机制和自动装配

建议是尽可能地使用自动配置的机制。显式配置越少越好

一、自动化装配bean

Spring从两个角度来实现自动化装配:

  1. 组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean。
  2. 自动装配(autowiring):Spring自动满足bean之间的依赖。

例:带有@Component注解的CompactDisc实现类

 组件扫描默认是不启用的。我们还需要显式配置一下Spring,从而命令它去寻找带有@Component注解的类,并为其创建bean:

 另外,还可以通过XML来启用组件扫描,使用Spring context命名空间的<context:component-scan>元素:(不常用)

1.为组件扫描的bean命名  @Component

默认是将类名的第一个字母变为小写。如果想为这个bean设置不同的ID,你所要做的就是将期望的ID作为值传递给@Component注解。比如说,如果想将这个bean标识为lonelyHeartsClub,那么你需要将SgtPeppers类的@Component注解配置为如下所示:

 另外,还有一种:@Named  (不常用)

 

2.设置组件扫描的基础包 @ComponentScan

有一个原因会促使我们明确地设置基础包,那就是我们想要将配置类放在单独的包中,使其与其他的应用代码区分开来。如果是这样的话,那默认的基础包就不能满足要求了。
为了指定不同的基础包,所需要做的就是在@ComponentScan的value属性中指明包的名称:

 如果你想更加清晰地表明你所设置的是基础包,那么你可以通过basePackages属性进行配置:

如果想设置多个基础包,只需要将basePackages属性设置为要扫描包的一个数组即可:

 

 除了将包设置为简单的String类型之外,@ComponentScan还提供了另外一种方法,那就是将其指定为包中所包含的类或接口:

3.通过为bean添加注解实现自动装配 @Autowired

自动装配就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring应用上下文中寻找匹配某个bean需求的其他bean。为了声明要进行自动装配,可借助Spring的@Autowired注解。

 eg:通过自动装配,将一个CompactDisc注入到CDPlayer之中

 注意:@Autowired是Spring特有的注解。如果不愿意在代码中到处使用Spring的特定注解来完成自动装配任务的话,那么可以考虑将其替换为@Inject:

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340