基于:【狂神说Java】Spring5最新完整教程IDEA版通俗易懂
目录
1 简介
Spring是一个轻量级**控制反转(IoC)和面向切面(AOP)**的容器框架。历史:2002年,interface21;2004年,spring1.0;Rod Johnson,音乐学博士;“不要重复发明轮子”;Spring使现有技术更加容易使用,大杂烩;
Spring七大模块:
2 IoC理论
控制反转(Inversion of Control),1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IOC 这个概念。IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦。
场景:服务端有dao
包,下面有UserDao
接口和UserDaoImpl
的实现,然后为客户端提供了service
包;业务逻辑层,下面有UserService
接口和UserServiceImpl
的实现,UserServiceImpl
实现的时候,组合了一个UserDaoImpl
对象,当客户端只调用UserDaoImpl
的方法就可以使用UserDao
(代理模式)的方法。
问题:实现UserDao
接口的类越来越多时,用户想用这些类时,需要程序员手动去改动UserDaoImpl
中组合的对象。这太繁琐。
解决:在UserDaoImpl
实现中,改组合为聚合,新增setUserDaoImpl(UserDao usrDao)
方法,让用户决定传入什么实现的UserDao
。控制实现了反转,控制权在用户层面上了。
控制反转IoC是一种设计思想,DI(依赖注入)是实现IoC的一种方法。
3 第一个Spring程序
3.1 创建maven项目添加依赖
<!-- spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!-- 日志文件 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--juint-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
由于spring-webmvc
的包较多,包括aop
、beans
、context
、core
、expression
、web
;所以导它。
3.2 创建pojo下的实体类
public class User {
private String name;
}
在pojo包下面创建一个测试的实体类,注意必须要有无参构造,以上显示省略了getter、setter方法;
3.3 配置beans.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">
<bean id="User" class="xyz.cqulwj.pojo.User">
<property name="name" value="小明"/>
</bean>
</beans>
id
为这个bean的id,class
为这个bean属于哪个类,property
为属性赋值;
3.4 测试获取对象
@Test
public void userClassTest(){
// 获取Spring的上下文对象
ApplicationContext applicationContext =new ClassPathXmlApplicationContext("beans.xml");
// 根据id获得对象
User user = (User)applicationContext.getBean("User");
// 调用方法
logger.debug(user.toString());
}
3.5 原理
- 当
new ClassPathXmlApplicationContext("beans.xml")
的时候,把在xml注册的所有对象进行了构造(初始化); property
属性,当applicationContext.getBean("User")
的时候,调用了对象的set()
方法把value
设置了进去;id
就是对象名;- 对象的创建变成了Spring来控制,程序是被动接收对象,使用set方法进行注入对象。理解IoC,就是对象全部交给Spring创建、管理、装配。
4 有参构造
4.1 按参数序号
<bean id="user" class="xyz.cqulwj.pojo.User">
<constructor-arg index="0" value="小红"/>
<constructor-arg index="1" ref="address"/>
</bean>
4.2 按参数类型匹配
<bean id="user" class="xyz.cqulwj.pojo.User">
<constructor-arg type="String" value="小红"/>
<constructor-arg type="xyz.cqulwj.pojo.Address" ref="address"/>
</bean>
如果有两个参数一样就不行了。
4.3 按参数名(常用)
<bean id="user" class="xyz.cqulwj.pojo.User">
<constructor-arg name="name" value="小红"/>
<constructor-arg name="address" ref="address"/>
</bean>
5 Spring配置
5.1 别名alias
<bean id="address" class="xyz.cqulwj.pojo.Address">
<property name="address" value="北京市"/>
</bean>
<alias name="address" alias="beijing"/>
可以给bean
的id
取别名;
5.2 import
多用于团队开发,可以把多个配置文件合并为一个;
<import resource="beans1.xml"/>
<import resource="beans2.xml"/>
<import resource="beans3.xml"/>