1.Spring介绍
轻量级一站式框架
Framework 框架:
某些组织或是个人实现了一系列的接口或者类,使用这些已经开发好的功能,完成自己的业务,简化开发的过程,提高开发效率。
Java框架大体分为三层:
表现层 业务逻辑层 数据持久层
Java主流框架(开发形式)演变:
servlet + Jsp + JavaBean
三层开发:
表现层 业务逻辑层 数据持久层
现在开发形式:
ssm:
spring + springmvc + mybatis
SpringBoot:
springboot开发,约定大于配置。 快速开发
Spring框架
Spring全家桶:
比较多的企业级的解决方案。
The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.
A key element of Spring is infrastructural support at the application level: Spring focuses on the “plumbing” of enterprise applications so that teams can focus on application-level business logic, without unnecessary ties to specific deployment environments.
Spring是一个轻量级别的开发框架,使用Spring框架的目的就是为了解决应用开发的业务逻辑与各层的耦合问题。Spring框架是一站式开发,换句话说 对 表现成 业务逻辑层 数据持久层都支持。
Spring框架的核心两点:
ioc(控制翻转)
aop(面向切面编程)
优点:
- 轻量级的开源框架
- 解决各层耦合问题
- 一站式框架
- Test :支持单元测试整合的
- Core Container:核心容器
- Aop+aspects :面向切面编程
- (以下不甚重要)
- Instrumentation:提供类加载器(不怎么用)
- Messaging:用来映射消息
- Data Access:和数据持有层进行交互的(时候,支持的……),属于事务管理
- Web:表现层
2. Ioc
Inversion of controller —— 控制反转
创建对象
之前创建对象: new 类名()
现在:使用spring完成创建对象 并放在spring的容器管理。
Ioc是一种设计思想,将设计好的对象交给spring框架进行创建、管理,而不是简单的使用代码创建了。
入门案例:
添加依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
</dependencies>
创建spring的核心配置文件—xml:
使用:
创建了一个bean 放在spring的容器中
上下文对象 applicationContex.getBean(xxxx.class);
Spring创建bean对象存储到:
存储到了集合中了 map集合存储的
Ioc的优点:
- 集中管理核心对象
- 功能的复用,减少对象的创建和内存的消耗
- 提高程序的灵活性
- 解耦
bean默认实例化:
<bean id="car" class="com.langsin.model.Car"></bean>
以上程序 *默认实例化的时候,使用的是无参数的构造方法*
Di:
依赖注入 为属性赋值
*默认使用的setter方法 ,属性必须有set方法*
以下程序是为属性赋值:
1.简单类型
<!--测试di 默认使用的是无参数的构造方法-->
<bean id="car" class="com.langsin.model.Car">
<property name="color" value="blue"></property>
<property name="name" value="bm"></property>
</bean>
2.为复杂数据类型进行注入
<!--创建bean
id:在容器中必须是唯一的
class:类的全名称 包名+类名 反射的形式 创建bean对象
property: 为属性进行依赖注入
ref:注入bean
value:注入的是简单类型的值-->
<bean id="helloService" class="com.langsin.service.HelloService">
<property name="car" ref="car"></property>
<!--这里的ref="car"引用的是下面的简单类型的值-->
</bean>
<!--测试di 默认使用的是无参构造方法-->
<bean id="car" class="com.langsin.model.Car">
<property name="color" value="bule"></property>
<property name="name" value="bm"></property>
</bean>
Spring对IOC的实现形式:
1.配置文件形式
使用的是xml文件的形式进行bean的配置。
特点: 简单、适合入门 、直观的。
1.1 Bean实例化形式
命名bean:
<!--进行bean的配置
id:唯一的-->
<bean id="user" class="com.langsin.model.User"></bean>
实例化bean:
①使用构造方法实例化bean
默认无参数的构造方法
有参数的构造方法也可以使用
<bean id="user" class="com.langsin.model.User">
<!--通过构造方法进行依赖注入-->
<constructor-arg name="address" value="济南市"></constructor-arg>
<constructor-arg name="userName" value="langsin"></constructor-arg>
<constructor-arg name="passWord" value="langsin"></constructor-arg>
</bean>
②静态工厂方式实例化
<!--通过静态工厂方法进行实例化-->
<bean id="user" class="com.langsin.model.User" factory-method="getUser"></bean>
/**
* 静态工厂方法
* @return
*/
public static User getUser(){
System.out.println("使用静态工厂方法实例化");
return new User();
}
③使用实例工厂方法进行bean的实例化
<!--工厂-->
<bean id="userFactory" class="com.langsin.factory.UserFactory"></bean>
<!--实例化工厂方法-->
<bean id="user" class="com.langsin.model.User"
factory-bean="userFactory"
factory-method="getUser"></bean>
public class UserFactory {
/**
* 实例化方法
*/
public User getUser(){
System.out.println("实例化工厂方法进行实例化操作");
return new User();
}
}
1.2 依赖注入
① setter方法的形式进行
属性必须有set方法 属性名必须满足java的规范 驼峰命名法
属性名:name 反射:setName
属性名:userName 反射:setUserName
<bean id="user" class="com.langsin.model.User">
<property name="address" value="济南市长清区"></property>
<property name="userName" value="langsin"></property>
<property name="passWord" value="admin"></property>
</bean>
②通过构造方法进行注入
<bean id="user" class="com.langsin.model.User">
<!--简单类型进行注入 使用的value-->
<property name="address" value="济南市长清区"></property>
<property name="userName" value="langsin"></property>
<property name="passWord" value="admin"></property>
<!--复杂类型进行注入 使用ref 注入bean-->
<property name="car" ref="car"></property>
</bean>
<bean id="car" class="com.langsin.model.Car"></bean>
细节:
<bean id="user" class="com.langsin.model.User">
<!--简单类型进行注入 使用的value-->
<property name="address" value="济南市长清区"></property>
<property name="userName" value="langsin"></property>
<property name="passWord" value="admin"></property>
<!--复杂类型进行注入 使用ref 注入bean-->
<property name="car" ref="car"></property>
<!--注入list-->
<property name="addressList">
<list>
<value>济南市长清区</value>
<value>济南市槐荫区</value>
<value>济南市历下区</value>
</list>
</property>
<!--注入map结构-->
<property name="phoneMap">
<map>
<entry key="张三" value="97979797979"></entry>
<entry key="李四" value="97979797979"></entry>
</map>
</property>
</bean>
denpends-on:控制先加载的bean 可以控制bean的加载顺序
<bean id="user" class="com.langsin.model.User" depends-on="car">
ApplicationContext 加载核心配置文件的时候,已经完成了bean的实例化操作,bean的实例化不是懒加载的。
可以自己控制懒加载,使用bean的时候才进行实例化 lazy-init=true
<bean id="user" class="com.langsin.model.User" lazy-init="true"></bean>
bean默认是单例的
scope:singleton 单例
prototype 多例
<bean id="user" class="com.langsin.model.User" scope="prototype"></bean>
bean生命周期对应方法
实例化
初始化的方法 init-method=’xxxxx’
销毁的方法 destory-method=’xxxx’ 上下文对象调用close方法,才执行销毁方法
<bean id="user" class="com.langsin.model.User" init-method="initMethod" destroy-method="destroyMethod">