Spring基础一(IoC、Spring配置)
概述
- 2002年,首次推出了Spring框架的雏形,interface21框架!2004年3月24日发布了1.0正式版。
- Rod Johnson,Spring Framework创始人。
- spring:使现有的技术更加容易使用,本身就是一个大杂烩,整合了现有的技术框架。
SSM系统:Spring MVC+Spring+Mybatis(半自动持久化框架)
导包:注意之前配置的maven仓库位置
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.20</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>6.2.1</version>
</dependency>
优点:
- Spring是一个开源的免费的框架。
- Spring是一个轻量级的,非入侵式的框架。
- 控制反转(IOC),面向切面编程(AOP)!
- 支持事务的处理,对框架的整合的支持。
总结:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架。
组成:Spring由七大模块组成:
现代化的Java开发,就是基于Spring的开发。
Spring Boot:构建
- 一个快速开发的脚手架。
- 基于Spring boot可以快速开发单个微服务。
- 约定大于配置
Spring Cloud:协调 基于SpringBoot实现。
Spring Cloud Date Flow:连接
大多数公司在使用SpringBoot进行快速开发,学习SpringBoot的前提,需要掌握Spring和SpringMVC。
IOC理论推导
原来写业务:
1、UserDao接口
public interface UserDao {
void getUser();
}
2、UserDaoImpl实现类
public class UserDaoImpl implements UserDao{
public void getUser() {
System.out.println("默认获取用户的数据");
}
}
3、UserService业务接口
public interface UserService {
void getUser();
}
4、UserServiceImpl业务实现类
public class UserServiceImpl implements UserService{
//将DAO引到Service中
private UserDao userDao=new UserDaoImpl();
public void getUser() {
//业务层调Dao层
userDao.getUser();
}
}
5、编写测试类模拟用户调用业务:
public class MyTest {
public static void main(String[] args) {
//模拟用户调用业务层,Dao层不接触
UserServiceImpl userService = new UserServiceImpl();
userService.getUser();
}
}
后台增加一个接口实现类,让用户使用增加的这个数据。
在后台增加一个Mysql接口实现,用户想要使用,必须改变UserServiceImpl中代码
1、后台增加的接口实现类:
public class UserDaoMysqlImpl implements UserDao{
public void getUser() {
System.out.println("Mysql获取用户数据");
}
}
2、调用Dao层
public class UserServiceImpl implements UserService{
//将MysqlDao引到Service
private UserDao userDao=new UserDaoMysqlImpl();
public void getUser() {
//业务层调Dao层
userDao.getUser();
}
}
模拟用户使用:需要改变ServiceImpl中调用的Dao
每一次用户的需求需要改动原有的代码比较困难。
在业务实现类中利用set进行动态实现值的注入:
用户在需求改变的时候,业务不在复杂。只需要修改service选择性调用,
从上述改变中理解,未用set之前,程序是自动创建对象,控制权在程序猿手上。
使用set之后,程序不在有主动性,而是变成了被动的接收对象。
IOC本质
控制反转IOC是一种设计思想,DI(依赖注入)是实现IOC的一种方法,也有人认为DI只是IOC的另一种说法,没有IOC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编程在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方。
IOC是Spring框架的核心内容,使用多种方式完美的实现了IOC,可以使用XML配置,也可以使用注解,目前Spring也可以零配置实现IOC。
Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建于组织对象存入容器中,程序使用时再从IOC容器中取出需要的对象。
设置控制反转案例
1、编写实体类Hello
编写配置文件beans.xml:
使用:
控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的。
反转:程序本身不创建对象,而变成被动的接收对象。
依赖注入:就是利用set方法来进行注入的。
IOC是一种编程思想,由主动的编程变成被动的接收。
截止目前,我们彻底不用再程序中改动了,需要实现不同的操作,只需要在xml配置文件中进行修改,所谓IOC,就是对象由Spring来创建,管理,装配。
改造理论推导中的案例
编写配置文件bean.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">
<!--使用Spring来创建对象,在Spring中这些都称为Bean-->
<!--
id=变量名
class = new的对象
property相当于给对象中的属性设置一个值;
-->
<bean id="userdaoimpl" class="com.serenity.dao.UserDaoImpl"/>
<bean id="userdaomysql" class="com.serenity.dao.UserDaoMysqlImpl"/>
<bean id="userServiceImpl" class="com.serenity.service.UserServiceImpl">
<!--
ref:引用Spring容器中创建好的对象
value:具体的值,基本数据类型-->
<property name="userDao" ref="userdaoimpl"/>
</bean>
</beans>
编写测试类:
在配置文件中修改接口配置:
测试:
IOC创建对象的方式
1、使用无参构造创建对象(默认)
创建实体类:
编写配置:
测试:
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = (User) context.getBean("user");
user.show();
}
2、假设使用有参构造创建对象,
方式一:下标赋值
方式二:类型的方式
方式三:直接通过参数名来设置
注意:在配置文件加载的时候,容器中管理的对象就已经初始化了。
Spring配置
别名
Bean配置
- id:bean的唯一标识符,也就是相当于对象名
- class:bean对象所对应的类型,包名+类名
- name:别名(可以同时取多个别名,可通过逗号,空格,分号等进行分割
<bean id="user" class="com.serenity.pojo.User" name="user2,user3">
<constructor-arg name="name" value="小二"/>
</bean>
import
import一般用于团队开发使用,他可以将多个配置文件,导入合并为一个。
假设,现项目中由多人开发,现有不同的人开发不同的类,不同的类需要注册在不同的bean中,我们可以利用import将所有人的beans.xml合并为一个总的配置(applicationContext.xml)
使用的时候,直接将所有beans合并在applicationContext.xml中,如下: