Spring第一天Spring入门以及常见的一些注解和IOC以及讨厌的xml配置原理详解

Spring体系结构

在这里插入图片描述

包含核心容器AOP springJDBCTemplate, springMVC,单元测试

先写一段最朴素的数据库查询代码
在这里插入图片描述
上面的代码是需要依赖mysql的jar包的,如果把mysql的依赖去掉,那程序在编译的时候,就会发生编译期错误,还没等到运行期,在编译期就会发生错误。这个代码的耦合性特别强,独立性特别差!!!在代码中直接用到了某个包,这样的代码依赖性特别强,没有这个包,那在编译期就会发生错误
在这里插入图片描述在这里插入图片描述在这里插入图片描述
换成上面的代码,如果没有MySQL的jar包,那么在编译期间就不会发生错误了,而是在运行期间发生错误

解耦的思路:第一步: 使用反射来创建对象,避免使用new关键字,因为new 关键字必须得需要一个类,必须得依赖这个类,而上面的代码中用了反射就只需要一个字符串了,只依赖这个字符串了,这样就会降低当前代码和new后面这个类的耦合性了

第二步:那个字符串在代码中写死了,所以我们就可以通过配置文件来获取要创建的对象的类名

依赖问题分析

先写一个业务层的实现类,写一个保存账户的实现类
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

这种new来new去肯定不行啊,耦合性太强了,独立性太差了,那该怎么办呢? 我们可以用工厂模式来解耦,我们可以创建一个生产bean对象的工厂类beanFactory
在这里插入图片描述

那啥是bean呢?bean就是可重用组件的意思,可重用就是可反复使用的意思,组件就是这个项目的组成部分
javabean是不等于实体类的,,,Javabean是用Java语言编写的可重用组件,而实体类只是其中一个组件而已

上面我们说了,要解耦,有两步:第一,反射 第二、配置文件
这里配置文件有xml和properties
这里我们先用properties,因为xml可以设计其他的一些知识点
在这里插入图片描述在这里插入图片描述在这里插入图片描述

分析工厂模式中的问题并改造

在这里插入图片描述在这里插入图片描述
此时,这5个对象是多例的
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
这样单例模式下,每次初始化得到的 i 都是 1,这样就不需要多例模式了在这里插入图片描述
通过newinstance() 每次创建的都是一个新的对象,所以要想得到单例模式,newinstance只能使用一次

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

IOC的概念 Inversion of Control

在这里插入图片描述在这里插入图片描述在这里插入图片描述

Spring基于XML的IOC环境搭建和入门

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
先看一下之前创建的properties配置文件 是key和value形式 key=value
在这里插入图片描述在这里插入图片描述
之前解析properties是自己解析的,而现在解析xml就交给Spring了

在这里插入图片描述

ApplicationContext的三个实现类

在这里插入图片描述在这里插入图片描述
单例模式:只在开始的时候创建一次对象,后面就不创建了,只在容器中拿之前创建的对象比较节省,只第一次吃新鲜菜,之后都是吃剩菜所以适合用ApplicationContext,在刚开始的时候就把所有的对象都创建出来,然后放到容器中,之后想要就到这个容器中来取

多例模式:每次用的时候,都会新创建一个对象。不用容器里面的每次都吃新鲜菜。所以适合用BeanFactory,用的时候才去创建对象。不然的话,如果像ApplicationContext那样,就会每次用的时候都会把所有类都创建一次对象,太浪费了我本来只吃一种菜,结果你却把所有的菜都煮熟了。我第二次又想只吃一种菜,结果你又把所有的菜都煮熟了,这岂不是太浪费了

Spring对bean的管理细节

首先先明确一下,bean id=“某某某” class=“其他”> 这里面属性id对应的某某某就是map的key, class属性对应的其他就是类名,这个类名到时候通过反射生成对象

Spring中bean的细节之三种创建Bean对象的方式

在这里插入图片描述

额外补充个知识点:就是最简单的构造方法知识点
构造方法:专门用来创建对象的方法,当我们通过关键字new创建对象时,其实就是在调用构造方法,

在这里插入图片描述
1、构造方法必须和所在的类名称完全一样,就连大小写也要一样
2、构造方法不要写返回值类型,连void都不写
3、构造方法不能return一个具体的返回值
4、如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数,也没有方法体
5、一旦编写了至少一个构造方法,那么编译器将不再赠送
6、构造方法也是可以进行重载的

在这里插入图片描述在这里插入图片描述

存在jar包中的类怎么创建bean对象呢?

在这里插入图片描述在这里插入图片描述在这里插入图片描述

第三种方式,配置工厂类里面静态方法返回的对象

在这里插入图片描述在这里插入图片描述

补充个知识点,判断bean创建的对象是单例还是多例,只需要在默认构造函数里面加一个打印语句,第一次创建对象,肯定会打印这条语句,第二次创建对象,如果还打印这条语句,那就是多例模式,如果第二次不打印就是单例模式了,这是一种方法。另外一种方法,直接打印这两个对象,然后判断是不是相等,如果相等,就说明是一个对象,那就是单例模式了,如果不相等,则反之

Spring中bean的细节之作用范围

在这里插入图片描述
如果bean标签里面的scope设置为singleton,则bean标签创建的对象就是单例的,之后用这个bean标签创建的对象都是同一个

如果bean标签里面的scope设置为prototype,则bean标签创建的对象就是多例的,之后用这个bean标签创建的对象都是不一样的,每次创建都是不同的对象

在这里插入图片描述
global-session 就是把集群中的服务器的session都当成是一个session,也就是global-session

Spring中bean的细节之生命周期

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

Spring的依赖注入

service 肯定会调用 dao,IOC的作用是降低耦合,但是依赖关系肯定还在,依赖关系的管理就交给Spring来维护
依赖关系:在当前类中需要用到其他类的对象
依赖关系的维护就叫做依赖注入

依赖注入有三类:基本类型和String,其他的bean类型,复杂类型集合类型
注入的方式有3种:第一种,使用构造函数提供 第二种,使用set方法提供 第三种,使用注解提供

构造函数注入

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

set方法注入,使用property标签

在这里插入图片描述
在这里插入图片描述

复杂类型的注入

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

Spring的新注解Configuration和ComponentScan

在这里插入图片描述
细节注意点:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解@Configuration可以不写

Spring的新注解Bean

在这里插入图片描述在这里插入图片描述在这里插入图片描述
细节注意一下:当我们使用注解配置方法时,如果方法有参数,Spring框架会去容器中查找有没有可用的bean对象,查找的方法和Autowired注解的作用是一样的

比如:上面

@Bean(name="runner")
public QueryRunner createQueryRunner(DataSource dataSource){
	return new QueryRunner(dataSource)
}

这里面我们用@Bean注解配置方法,但是方法里面有DataSource 参数,所以我们必须要看看这个DataSource是不是bean对象,如果不是,必须要注入

Spring的新注解Import

在这里插入图片描述
在这里插入图片描述

总结一下:
AnnotationConfigApplicationContext 类创建对象时,传入的类字节码,那么这些类上面的@Configuration都是可写可不写。否则的话,就必须写!
如果其他的配置还不想写的话,那么就可以用@Import注解

猜你喜欢

转载自blog.csdn.net/qq_42350785/article/details/106883301