Spring能干什么
其中Microservices(微服务)、Cloud(分布式)、Web apps(Web应用)开发占主流
Spring Framework:全家桶中最底层的框架,要学的内容
Spring Boot:加速Spring开发的技术,快速得到推广
Spring Cloud:分布式开发
Spring Framework系统架构
学习路线
- Core Container:是装对象的核心容器,而JAVA程序是面向对象的。所以最先学
- Data Access/Integration:开始学习整合Spring与MyBatis
- 学习APO 与 Aspects技术
- 学习Transactions(事务)
Part 01:核心容器
目标:充分解耦
Ioc(Inversion of Control)控制反转
-
将对象的创建控制权由程序转移到外部。在使用对象时,程序不主动使用new产生对象,而由外部提供对象。从而降低耦合度。
-
Spring对IoC思想进行了实现
-
Spring提供了一个容器,称为IoC容器来充当外部
由程序创建对象转换为IoC容器创建对象
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oKjPqEe1-1666346096218)(https://cdn.jsdelivr.net/gh/StarryVerse/CSDN-/img/image-20221013184729718.png)]
转变为
- DAO(data access object)是为某种类型的数据库或其他持久性机制提供一个抽象接口的[对象]。通过映射应用程序对持久层的调用,DAO提供一些特定的数据操作,而无需暴露数据库细节。
Bean
Ioc容器负责对象的创建、初始化等系一列工作,被创建或者管理的对象在IoC容器中统称为Bean
DI(Dependency Injection)依赖注入
在IoC容器中建立bean与bean之间的依赖关系的整个过程。将容器内有关系的bean进行关系绑定。
IoC入门案例
思路分析
步骤
导入Spring坐标
在pom.xml中添加依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
添加完成后刷新Maven
定义Spring管理的类(接口)
public interface BookService {
public void save();
}
public class BookServiceImpl implements BookService {
private BookDao bookDao = new BookDaoImpl();
public void save() {
bookDao.save();
}
}
创建Spring配置文件,配置对应类作为Spring管理的bean
在resource中添加Spring Config 命名为applicationContext.xml
配置applicationContext.xml
配置bean
//id属性表示给bean起名字
//class属性表示给bean定义类型 用实现类去定义 不要用接口去定义
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
初始化IoC容器,通过容器获取bean
在itheima包下新建一个类App2.java
//ApplicationContext为一个接口,用它的实现类ClassPathXmlApplicationContext去生成新的对象
//ApplicationContext ctx = new ClassPathXmlApplicationContext("resources里的Spring Config配置文件名称");
//获取资源
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
bookService.save();
DI入门案例
思路分析
步骤
- 删除使用new的形式创建对象的代码
- 提供依赖对象对应的setter方法
public class BookServiceImpl implements BookService {
private BookDao bookDao = new BookDaoImpl();
public void save() {
bookDao.save();
}
}
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void save() {
bookDao.save();
}
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
- 在applicationContext.xml配置service与dao之间的关系
property标签表示配置当前bean的属性
name属性表示配置哪一个具体的属性
ref属性表示参照哪一个bean
<property name="bookDao" ref="bookDao"/>
IoC和Bean
bean配置
bean基础配置
bean别名配置
bean作用范围配置
bean实例化
三种方式
构造方法(常用)
- bean本质上就是对象,创建bean使用构造方法完成
- spring创建bean时调用的是无参的构造方法
- 若无参构造方法不存在,将抛出异常BeanCreationException
- spring报错如何看:从下往上找原因,越下面越核心,一般最下面的就能解决问题
静态工厂(了解)
实例工厂中的FactoryBean
-
导入Spring坐标
-
定义Spring管理的类
-
创建Spring配置文件,配置对应类作为Spring管理的bean
<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>
- 在工厂类中使用FactoryBean
FactoryBean也是一个Bean对象。
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
@Override
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
@Override
public Class<?> getObjectType() {
return UserDao.class;
}
}
- 在main方法中获取IoC容器和Bean对象
public class AppForInstanceUser {
public static void main(String[] args) {
//获取IoC容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取Bean
UserDao userDao = (UserDao) ctx.getBean("userDao");
userDao.save();
}
}
bean生命周期
- 生命周期:从创建到消亡的完整过程
- bean生命周期:bean从创建到销毁的整体过程
- bean生命周期控制:在bean创建后销毁前做一些事情
1.在配置文件中配置 bean 的生命周期
//创建
init-method="init"
//销毁
destroy-method="destory"
要想执行destroy-method="destory"
就要关闭容器
关闭容器方法
- 暴力close法
ctx.close();
//ApplicationContext类中没有close方法,而在ClassPathXmlApplicationContext类中有close关闭容器的方法,所以用ClassPathXmlApplicationContext类获取IoC
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookService bookService = (BookService) ctx.getBean("bookService");
bookService.save();
ctx.close(); //加在末尾
- 关闭钩子法
ctx.registerShutdownHook(); //加在获取IoC容器后的任何地方都可以
2.用接口配置生命周期(了解)
//调用InitializingBean, DisposableBean接口并覆写方法
销毁destroy()对应DisposableBean
创建afterPropertiesSet()对应InitializingBean
afterPropertiesSet()在属性设置之后执行
生命周期的过程
DI
setter注入
–引用类型
- 在bean中定义引用类型属性并提供可访问的setter方法
public calss BookServiceImpl implements BookService{
private BookDao bookDao;
public void setBookDao(BookDao bookDao){
this.bookDao = bookDao;
}
}
- 配置中使用property标签ref属性注入引用类型对象
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
–简单类型
- 在bean中定义引用类型属性并提供可访问的setter方法
public class BookDaoImpl implements BookDao{
private int connectionNumber;
public void setConnectionNumber(int connectionNumber) {
this.connectionNumber = connectionNumber;
}
}
- 配置中使用property标签value属性注入简单类型数据
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<property name="connectionNumber" value="10"/>
</bean>
构造器注入
标准书写的配置和代码的耦合度较高
–引用注入
- 在bean中定义引用类型属性并提供可访问的构造方法
public calss BookServiceImpl implements BookService{
private BookDao bookDao;
public BookServiceImpl(BookDao bookDao){
this.bookDao = bookDao;
}
}
- 配置中使用constructor-arg标签ref属性注入引用类型对象
-- constructor-arg中的name和传入构造器的形参一致 ref属性与id一致
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>
</bean>
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
其他书写方法
type指定形参对象的类型
index指定形参对象的位置
依赖自动装配
-
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
-
自动装配方式
-
配置中使用bean标签autowire属性设置自动装配的类型
byType byName constructor no
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
- 依赖自动装配特征
集合注入
- 注入数组对象
<property name="arr">
<array>
<value>20</value>
<value>30</value>
<value>40</value>
<value>50</value>
</array>
</property>
- 注入List
<property name="stringList">
<list>
<value>China</value>
<value> </value>
<value>666</value>
<value>50</value>
</list>
</property>
- 注入Set
<property name="stringSet">
<set>
<value>5</value>
<value>38</value>
<value>42</value>
<value>57</value>
</set>
</property>
- 注入Map
<property name="integerStringMap">
<map>
<entry key="01" value="mar"/>
<entry key="02" value="co"/>
<entry key="03" value=" "/>
<entry key="04" value="fu"/>
</map>
</property>
- 注入Properties
<property name="properties">
<props>
<prop key="country">china</prop>
<prop key="province">ZheJiang</prop>
<prop key="city">HangZhou</prop>
</props>
</property>
注解开发
使用注解,极大的简化了spring的开发。
定义bean
@Component
- @Repository
- @Service
- @Controller
@ComponentScan
<entry key="04" value="fu"/>
</map>
</property>
- 注入Properties
<property name="properties">
<props>
<prop key="country">china</prop>
<prop key="province">ZheJiang</prop>
<prop key="city">HangZhou</prop>
</props>
</property>
### 注解开发
使用注解,极大的简化了spring的开发。
#### 定义bean
@Component
- @Repository
- @Service
- @Controller
@ComponentScan