Spring框架的使用(一)

一、Spring

聊一聊Spring

Spring是一个轻量级Java开发框架,目的是为了解决企业级应用开发的业务逻辑和其他各层的耦合。Spring可以做很多事,为企业级开发提供丰富的功能,其底层都依赖于两个特性:

依赖注入(DI)

面向切面编程(AOP)

可简单理解为:

Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架

设计理念与优缺点

1.设计理念

通过Ioc容器管理POJO对象以及他们之间的耦合关系,通过AOP以动态非侵入的方式增强服务。

  • 动态非入侵:使用spring编写业务类时不需要继承spring特定的类,通过配置完成依赖注入后就可以使用,此时,spring就没有侵入到业务代码里。

2.优点

  • 方便解耦,简化开发。可将所有对象的创建和依赖关系交给Spring管理
  • 支持面向切面编程(AOP),可方便的实现对程序进行权限拦截、运行监控等功能
  • 方便集成各种框架
  • 方便接口调用。Spring对一些API如JDBC、提供了封装,方便调用

3.缺点

Spring依赖,反射影响性能

二、聊一聊IOC

IOC理论

在没有IOC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方

举个栗子

image

IOC本质

将传统的由程序生产或获取对象的形式变为由Spring来创建,管理和装配。所谓控制反转就是对组件对象控制权的转移在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入(DI)

==控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。(Dependency Injection,DI)==

所谓IOC就是对象由Spring来创建,管理,装配

三、Spring 的使用

maven项目依赖

1
2
3
4
5
6
7
8
9
10
11
12
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>

第一个案例:HelloSpring

beans.xml骨架

1
2
3
4
5
6
7
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>
1
2
//获取Spring的上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

最终的效果就是:彻底不需要修改代码,只需要修改配置文件

所谓IOC就是对象由Spring来创建,管理,装配

四、IOC创建对象的方式

1.无参构造

默认是使用无参构造

来看一个案例

不写无参构造方法再执行,发现会报错

2.有参构造

有参构造创建对象有三种方式

①下标赋值

1
2
3
4
<!--    第一种赋值-->
<bean id="user" class="cool.yolin.pojo.User">
<constructor-arg index="0" value="猪大头"/>
</bean>

②类型

1
2
3
4
<!--    第二种 通过类型创建,不建议使用-->
<bean id="user" class="cool.yolin.pojo.User">
<constructor-arg type="java.lang.String" value="朱同心"/>
</bean>

③参数名

1
2
3
4
<!--    第三种,直接通过参数名来设置-->
<bean id="user" class="cool.yolin.pojo.User">
<constructor-arg name="name" value="张金"/>
</bean>

==多学一点:在配置文件加载的时候,容器context中的对象就已经初始化了==

五、import的使用

import多用于团队开发,它可以将多个配置文件,导入合并为一个

使用时直接使用总的配置就可以了

六、DI依赖注入

什么是Spring的依赖注入

即组件之间的依赖关系由容器在应用系统运行期来决定,也就是有容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件中。

依赖注入基本原则

配置对象的工作由IoC容器负责,他会把符合依赖关系的对象通过属性(Setter)构造器传递给需要的对象

依赖注入实现方式

  1. 构造器依赖注入:通过容器触发一个类的构造器来实现,该类有一系列参数,每个参数代表一个对其他类的依赖
  2. Setter方法注入:容器通过调用无参static工厂方法实例化bean后,调用该bean的setter方法,即实现了基于setter的依赖注入

看一个例子

beans3.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="address" class="cool.yolin.pojo.Address">
<property name="address" value="西安"></property>
</bean>
<bean id="student" class="cool.yolin.pojo.Student">
<!-- 第一种,普通注入,value-->
<property name="name" value="猪头新"/>

<!-- 第二种,Bean注入,ref-->
<property name="address" ref="address"/>

<!-- 数组-->
<property name="books">
<array>
<value>红楼梦</value>
<value>西游记</value>
<value>水浒传</value>
<value>三国演义</value>
</array>
</property>
<!-- List-->
<property name="hobbys">
<list>
<value>打篮球</value>
<value>绘画</value>
<value>滑板</value>
</list>
</property>
<!-- Map-->
<property name="card">
<map>
<entry key="身份证" value="414254242424"/>
<entry key="银行卡" value="4454242447777"/>
</map>
</property>
<!-- Set-->
<property name="games">
<set>
<value>英雄联盟</value>
<value>深海迷航</value>
</set>
</property>
<!-- null-->
<property name="wife">
<null></null>
</property>
<!-- properties-->
<property name="info">
<props>
<prop key="stuid">172988</prop>
<prop key="name">张三</prop>
</props>
</property>
</bean>
</beans>

七、bean的作用域

Spring框架支持以下五种bean的作用域:

  • singleton:bean在每个Spring IoC容器中只有一个实例
  • prototype:一个bean的定义可以有多个实例
  • request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效
  • session:在一个HTTP Session中,一个bean定义对应一个实例,该作用域仅在基于web的Spring ApplicationContext情形下有效
  • global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效

注意:缺省的Spring bean的作用域是Singleton,使用prototype作用域需要慎重思考,因为频繁创建和销毁bean会带来很大的性能开销

  1. 单例模式(Spring默认机制)

  1. 原型模式:每次从容器中get 的时候,都会产生一个新对象!

  1. 其余的request、session、application只能在web开发中使用到!

请我喝杯咖啡吧~

支付宝
微信