Spring知识点总结(手把手)
0 IDEA创建maven工程
- 打开IDEA,选择New Project,选择Java点击Next
- 输入项目名即路径
- 右键Spring项目,选择New->Moudle
- 在左侧选择框点击Maven,点击Next
- 填写信息,点击Next
- 点击Finish
至此,一个Maven项目创建完成,但是还需要进行最后的Maven配置(可参考上一篇文章),选择Maven路径,点击OK
1 什么是Spring
1.1 概述
Spring是分为层的Java SE/EE应用full-stack轻量级开源框架,以IoC(控制反转)和AOP(面向切面编程)为内核。
提供了展现层SpringMVC和持久层Spring JDBCTemplate以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的JavaEE企业应用开源框架。
1.2 优势
- 方便解耦,简化开发
- AOP编程的支持
- 声明式事务的支持
- 方便程序的测试
2 Spring快速入门
2.1 Spring程序开发步骤
-
- 导入Spring开发的基本包坐标
-
- 编写Dao接口和实现类
-
- 创建Spring核心配置文件
-
- 在Spring配置文件中配置UserDaoImpl
-
- 使用Spring的API获得Bean实例
2.2 实操演示
2.2.1 导入Spring开发的基本包坐标
在pom.xml里面添加代码:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.3.RELEASE</version>
</dependency>
</dependencies>
2.2.2 编写Dao接口和实现类
在src->main->java文件夹下面创建com.itcast.dao包,编写Dao接口,
UserDao代码:
package com.itcast.dao;
public interface UserDao {
void save();
}
UserDaoImpl代码:
package com.itcast.dao.impl;
import com.itcast.dao.UserDao;
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("UserDao save method running....");
}
}
2.2.3 创建Spring核心配置文件
在类路径下{resource}创建applicationContext.xml配置文件(约定俗成的写法),右键创建spring选择New->Xml Configration file->Srping config:
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
这里可能会出现一个警告提示:application context not configured for this file,解决方案:
- 打开file->Project Structure选择Moudles,依次点击spring和右边的加号
选中该配置文件点击ok
后面直接ok就行。
2.2.4 在配置文件中配置UserDaoImpl
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.itcast.dao.impl.UserDaoImpl"></bean>
</beans>
- 注:bean中的id=“userDao”是唯一标识,方便在其他地方调用时直接找该唯一id即可。
2.2.5 使用Spring的API获得Bean实例
package com.itcast.demo;
import com.itcast.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Demo {
@Test
public void test1(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.save();
}
}
- 注:getBean里面的参数就是配置文件中的id,注意要一致!
运行该测试将会在控制台打印:UserDao save method running…
3 配置文件
3.1 Bean标签基本配置
功能:用于配置对象交由Spring来创建。默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。
基本属性:
- id:Bena实例在Spring容器中的唯一标识
- class:Bean的全限定名称
3.2 Bean标签范围配置
scope:指对象的作用范围,常用的两个取值
取值范围 | 说明 |
---|---|
singleton | 默认值,表示单例的 |
prototype | 多例的 |
-
当scope的取值为singleton时
Bean的实例化个数:1个
Bean的实例化时机:当spring核心文件被加载时,实例化配置Bean实例
Bean的生命周期:
对象创建:当应用加载,创建容器时,对象就被创建了
对象运行:只要容器在,对象一直活着
对象销毁:当应用卸载,销毁容器时,对象就被销毁了
- 当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean()方法时实例化Bean
Bean的生命周期
对象创建:当使用对象时,创建新的对象实例
对象运行:只要对象在使用中,就一直活着
对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了 - 当scope的取值为prototype时
3.3 Bean生命周期配置
init-method:指定类中的初始化方法名称
destroy-method:指定类中销毁方法名称
3.4 Bean实例化三种方式
- 使用无参构造方法实例化
- 工厂静态方法实例化(了解)
- 工厂实例方法实例化(了解)
3.5 Bean的依赖注入
首先,创建UserService,内部调用UserDao的save方法
public class UserServiceImpl implements UserService {
public void save() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicaionContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.save();
}
}
创建一个假的web层进行测试:
package com.itcast.demo;
import com.itcast.service.UserService;
import com.itcast.service.impl.UserServiceImpl;
public class UserController {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
userService.save();
}
}
这里是new了一个UserServiceImpl,并没有从spring容器中获得,spring的开发过程应该是下图这样:
因此,我们要将UserServiceImpl的创建权交给Spring
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.itcast.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itcast.service.impl.UserServiceImpl"/>
</beans>
配置好之后,UserController的代码就可以改成如下写法了:
public class UserController {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.save();
}
}
3.5.1 依赖注入概念及分析
依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现。
在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。
IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。
那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。
简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。
在上面的例子中,结构图如下所示:
其中,业务层和持久层都需要我们去获取,为了降低耦合性,我们可以在spring容器中让业务层去调用持久层。结构图如下:
3.5.2 Bean的依赖注入方式
- 构造方法
- set方法
第一种方法:构造方法,UserServiceImpl类改下如下:
public class UserServiceImpl implements UserService {
private UserDao userDao; // 容器当中的dao
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
public UserServiceImpl() {
}
public void save() {
userDao.save();
}
}
配置Spring容器调用有参构造时进行注入:
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>
注意:name是有参构造方法的参数名,ref是容器里bean的id的引用!
第二种方法:使userDao对象在UserService里通过set方法获取。此时,UserServiceImpl类可以改写为如下:
public class UserServiceImpl implements UserService {
private UserDao userDao; // 容器当中的dao
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save() {
userDao.save();
}
}
这样之后,service层就不用getBean(“userDao”)了,所以还要在spring容器内把dao通过set方法注入给service,配置如下:
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
如上,只需要在userService的配置中增加一个property属性,注意:property属性的name指的是属性名(即set方法setUserDao把set去掉,U变小写后的名userDao),ref的值指的是对象的引用(这里是容器当中的id为userDao的对象)。
set方法简化操作:p命名空间注入。需要引入p命名空间:
xmlns:p="http://www.springframework.org/schema/p"
然后,修改注入方式:
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl" p:userDao-ref="
userDao"/>
4 Spring相关API
4.1 ApplicationContext的继承体系
applicationContext:接口类型,代表应用上下文,可以通过其实例获得 Spring 容器中的 Bean 对象
4.2 ApplicationContext的实现类
1)ClassPathXmlApplicationContext
它是从类的根路径下加载配置文件 推荐使用这种
2)FileSystemXmlApplicationContext
它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
3)AnnotationConfigApplicationContext
a.service.impl.UserServiceImpl" p:userDao-ref="
userDao"/>
# 4 Spring相关API
## 4.1 ApplicationContext的继承体系
applicationContext:接口类型,代表应用上下文,可以通过其实例获得 Spring 容器中的 Bean 对象
## 4.2 ApplicationContext的实现类
1)ClassPathXmlApplicationContext
它是从类的根路径下加载配置文件 推荐使用这种
2)FileSystemXmlApplicationContext
它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
3)AnnotationConfigApplicationContext
当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。