1.Spring简介
Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(反转控制)和AOP(面向切面编程)为内核。提供了展现层、持久层以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架。
在1997年,IBM提出了EJB思想,Spring之父为Rod Johnson
2. Spring优势
- 方便快捷,简化开发
通过 Spring 提供的 IoC容器,可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度耦合。 用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
- AOP编程支持
- 声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务管理,提高开发效率和质量。
- 方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作
- 方便各种集成优秀框架
Spring对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的支持。
- 降低JavaEE API的使用难度
Spring对 JavaEE API(如 JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些 API 的使用难度大为降低。
- Java源码是经典学习范例
3. Spring体系结构
4. Spring程序开发步骤
现代大家了解一下Spring程序开发步骤,然后进行快速入门~
之前大家需要用到一个包下的类时,需要new出来,然后进行使用,这样会很麻烦,而使用Spring框架开发不再需要new对象了,它可以让直接请求客户端读取xml配置文件,根据id标识获得Bean名,通过反射创建并返回,有这么以下几步:
- 导入 Spring 开发的基本包坐标
- 编写 Dao 接口和实现类
- 创建 Spring 核心配置文件
- 在 Spring 配置文件中配置 UserDaoImpl
- 使用 Spring 的 API 获得 Bean 实例
这样就实现了解耦合,后面再有一些类似需求只需要修改配置文件即可✌
5. 代码实现
5.1 首先创建一个模块
5.2 导入坐标
<!-- 导入 spring-context 坐标 --><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.33</version></dependency></dependencies>
5.3 创建Bean(userDao)
package com.it.dao;public interface UserDao {public void save();
}
5.4 创建实现类,实现方法
package com.it.dao.impl;import com.it.dao.UserDao;public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("save running...");}
}
5.5 创建xml文件并进行配置
<?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"><!-- 在Spring配置文件中配置UserDaoImplid Bean实例在Spring容器中的唯一标识class 实现类的类路径 --><bean id="userDao" class="com.it.dao.impl.UserDaoImpl"></bean></beans>
5.6 创建测试类进行测试(创建ApplicationContext对象getBean)
package com.it.test;import com.it.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserDaoTest {public static void main(String[] args) {
// 创建ApplicationContext对象ApplicationContext user = new ClassPathXmlApplicationContext("applicationContext.xml");
// getBeanUserDao userDao = (UserDao) user.getBean("userDao");
// 调用方法userDao.save();}
}
6. 配置文件
带大家分析一下配置文件中的一些点
6.1 Bean标签范围配置
在applicationContext.xml中进行Bean配置时,scope:指对象的作用范围,取值会有以下几个属性值
- singleton时
<?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"><!-- 在Spring配置文件中配置UserDaoImplid Bean实例在Spring容器中的唯一标识class 实现类的类路径 --><bean id="userDao" class="com.it.dao.impl.UserDaoImpl" scope="singleton"></bean></beans>
- prototype时
<?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"><!-- 在Spring配置文件中配置UserDaoImplid Bean实例在Spring容器中的唯一标识class 实现类的类路径 --><bean id="userDao" class="com.it.dao.impl.UserDaoImpl" scope="prototype"></bean></beans>
6.2 依赖注入
我们设置一个实现层业务,调用Dao层UserDao方法,也想在xml配置文件中进行配置,需要以下几步
6.2.1 service层
6.2.2 创建实现层实现service层
package com.it.service.impl;import com.it.dao.UserDao;
import com.it.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserServiceImpl implements UserService {@Overridepublic void save() {System.out.println("实现Dao层");// 创建ApplicationContext对象ApplicationContext user = new ClassPathXmlApplicationContext("applicationContext.xml");
// getBeanUserDao userDao1 = (UserDao) user.getBean("userDao");userDao1.save();}
}
6.2.3 xml进行配置
<?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"><!-- 在Spring配置文件中配置UserDaoImplid Bean实例在Spring容器中的唯一标识class 实现类的类路径 --><bean id="userDao" class="com.it.dao.impl.UserDaoImpl" scope="prototype"></bean><bean id="userService" class="com.it.service.impl.UserServiceImpl" scope="singleton"></bean></beans>
6.2.4 测试
package com.it.test;import com.it.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserServiceTest {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = (UserService) context.getBean("userService");userService.save();}
}
6.3 Bean 依赖注入
将UserDao注入到UserService内部有两种方式:
- 构造方法
- set方法
首先要在xml配置文件中进行配置
<?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"><!-- 在Spring配置文件中配置UserDaoImplid Bean实例在Spring容器中的唯一标识class 实现类的类路径 --><bean id="userDao" class="com.it.dao.impl.UserDaoImpl" scope="prototype"></bean><!-- name属性名ref 注入的方法Bean名 --><bean id="userService" class="com.it.service.impl.UserServiceImpl" scope="singleton"><property name="userDao" ref="userDao"></property></bean></beans>
实现层进行依赖注入并实现set方法
6.4 Bean的依赖注入的数据类型
- 普通数据类型
- 引用数据类型
- 集合数据类型
6.4.1 普通数据类型
定义数据类型以及生成set方法