Spring是什么?
Spring名称指:
- Spring家族,包括Spring整个生态,Spring Framework、Spring MVC等;
- 特指Spring Framework;
Spring官网:https://spring.io/
Spring(Spring Framework)是什么?
Spring是一个轻量级的IOC容器框架,简化Java企业级应用开发,使得开发者更聚焦于业务逻辑。同时Spring集成了许多优秀的第三方框架。
Spring提供的核心功能:
- IOC(Inversion of Control,控制反转)容器;
- AOP(Aspect-Oriented Programming,面向切面编程);
主要特性
Core
IOC容器、DI(Dependency Injection)、AOP、事件处理、资源管理、国际化、校验、数据绑定、类型转换、SpEL表达式;
重点掌握:
- IOC/DI
- AOP
数据访问
事务,DAO(Data Access Object,数据访问对象),JDBC(Java DataBase Connectivity,Java数据库连接),ORM(Object Relational Mapping,对象关系映射),XML
重点掌握:
- 事务
- JDBC
Spring MVC
Spring MVC & Spring WebFlux(响应式Web框架)
重点掌握Spring MVC。Spring MVC在整个Spring Framework学习完之后,再单独学习。
其他
Testing:测试集成;
多语言支持:除了Java,还支持Kotlin、Groovy;
集成:远程调用、邮件、消息队列、调度、缓存等;
Spring环境配置&入门
- 使用Idea新建Maven工程;
- 导入Spring-Context jar包;
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
</dependencies>
spring-context: Spring上下文包,包含Spring核心的spring-core、spring-beans等jar包;
5.2.1.RELEASE: 当前Spring最新发布版本;
创建示例类
- UserDao,及其实现类
public interface UserDao { void addUser(User user); } public class UserDaoImpl implements UserDao { @Override public void addUser(User user) { System.out.println("添加成功:" + user); } }
- UserService,及其实现类
public interface UserService { void add(User user); } public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void add(User user) { userDao.addUser(user); } }
- Client类
public class Client { private UserService userService; public void setUserService(UserService userService) { this.userService = userService; } public static void main(String[] args) { } }
配置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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.bailiban.day1.dao.impl.UserDaoImpl" />
<bean id="userService" class="com.bailiban.day1.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao" />
</bean>
<bean id="client" class="com.bailiban.day1.Client">
<property name="userService" ref="userService" />
</bean>
</beans>
说明
beans标签: Spring IOC容器,包含Spring创建和管理的对象;
bean标签: 描述对象的类型和属性(用于创建);
当我们使用Spring时,不再需要自己创建对象,而是将我们需要的对象类型,及对象属性告诉Spring,由Spring帮我们创建和管理。
当我们使用对象时,直接从Spring容器获取即可。
- 使用Spring容器访问对象
public class Client {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Client client = (Client) context.getBean("client");
client.userService.add(new User(1001, "Jim"));
}
}
说明:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
通过xml文件,获取Spring容器上下文
Client client = (Client) context.getBean("client");
使用Spring提供的getBean方法,从Spring容器中获取对象;
client.userService.add(new User(1001, "Jim"));
我们并没有给Client对象设置userService属性,userService的创建是由Spring帮我们完成的;
运行结果:
用户添加成功:User{id=1001, name='Jim'}
IOC
什么是IOC
IOC:Inversion of Control,即控制反转。
控制:主要指对“对象”的控制,包括对象创建、对象间的依赖关系、对象的生命周期等;
反转:将控制权从开发者转变为Spring,即开发者不需要管理对象的创建、依赖、生命周期等,而是有Spring帮我们创建和管理。
示例:
- 不使用IOC,程序中硬编码
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void add(User user) {
userDao.addUser(user);
}
}
- 使用IOC,在xml配置文件里告诉spring:我需要什么对象,让spring帮我们创建。
<bean id="userDao" class="com.bailiban.day1.dao.impl.UserDaoImpl" />
<bean id="userService" class="com.bailiban.day1.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao" />
</bean>
使用IOC的好处
降低类与类之间的耦合度,提高应用程序的灵活性和可维护性。
理解:
从设计模式的角度看
上面示例中,UserServiceImpl只需要一个能够操作user数据库表,并包含addUser方法的类,而并不关注这个类具体是如何实现的。从代码变更的角度看
如果UserDao的实现类变化了,或者需要使用其他的实现类,此时必须修改所有“new UserDaoImpl();”的代码:
例如:public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoAnotherImpl();
如果使用IOC,则代码不需要任何变化,只需要变更XML配置文件即可。
<bean id="userDao" class="com.bailiban.day1.dao.impl.UserDaoAnotherImpl" />
从代码编写的角度看
使用Spring注解,可以极大的简化开发public class UserServiceImpl implements UserService { @Autowired private UserDao userDao;
DI
什么是DI
DI: Dependency Injection, 依赖注入
DI和IOC的关系
IOC是一种设计思想,用于降低程序见的耦合度。DI是IOC的一种实现,IOC的另一常见的实现方式是DL(Dependency Lookup,依赖查找)。
Spring使用的是DI。依赖
主要类之间的依赖, 例如下面代码,我们可以认为UserDao是UserServiceImpl的一个依赖:public class UserServiceImpl implements UserService { private UserDao userDao;
注入
不需要从容器获取,Spring已经帮我们处理好所有依赖对象了。
例如,订购报纸或者牛奶,我们只需要告诉订购商需要什么,然后每天早上家门口就会放好报纸或者牛奶。
与“注入”相对应的是“查找”,每天早上需要自己去附近的订购点取报纸或者牛奶。