历史:
Spring框架的雏形:interface21框架!
Spring框架以interface21为基础,重新设计,不断丰富其内涵
SSM:SpringMVC + Spring + Mybatis
Spring官网:https://spring.io/projects/spring-framework#overview
官方下载地址:https://repo.spring.io/release/org/springframework/spring/
GitHub:https://github.com/spring-projects/spring-framework
使用时导入依赖,spring-webmvc导入的依赖比较全
org.springframework spring-webmvc 5.2.0.RELEASE
org.springframework spring-jdbc 5.2.0.RELEASE
优点
- Spring是一个开源的免费的框架
- Spring是一个轻量级的(导入jar包后即可使用)、非入侵式(理解导入jar包后不影响以前的项目)的框架!
- 控制反转(IOC),面向切面编程(AOP)!!!
- 支持事务的处理,对框架整合的支持
- 总结:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架
2、IOC理论推导(了解IOC原型) 2.1初始代码组成(待了解补充)
Spring Core为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 {
UserDao userDao =new UserDaoImpl();
public void getUser() {
userDao.getUser();
}
}
5.MyTest(测试)
public class UserServiceImpl implements UserService {
UserDao userDao =new UserDaoImpl();
public void getUser() {
userDao.getUser();
}
}
6.代码耦合性极强,如果dao层增加UserDao实现类,修改麻烦,适应不了用户变更。
2.2 IOC原型初步理解初步了解IOC
1.解决上述问题:修改Service层实现类UserServiceImpl
public class UserServiceImpl implements UserService {
private UserDao userDao;
//set注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void getUser() {
userDao.getUser();
}
}
2.MyTest(测试)
public class MyTest {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
//通过set注入
((UserServiceImpl)userService).setUserDao(new UserDaoImpl());
userService.getUser();
}
}
- 之前,程序是主动创建对象!控制权在程序猿手上!
- 使用了set注入后,程序不再具有主动性,而是变成了被动的接收对象!
- 这就是控制反转!!!!!!!!!!!!!!!!!(例如你在dao层增加实现类,只需用改动new UserDaoImpl(),解耦)系统的耦合性大大降低,这是IOC的原型!
3.IoC本质
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,没有IoC的程序中,使用面向对象编程,对象的创建与对象间的依赖关系都在在程序中,有IoC后对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方。(***我的理解***是IoC中利用配置文件创建对象,配置文件中依赖注入(即IOC容器中依赖注入),个人目前理解)
1.新建一个maven项目,编写实体类pojo
public class Hello {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
@Override
public String toString() {
return "Hello{" +
"str='" + str + ''' +
'}';
}
}
2.编写xml配置文件ApplicationContext.xml
3.MyTest(测试)
public class MyTest {
public static void main(String[] args) {
//获取Spring的上下文对象!
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
//我们的对象现在都在Spring中的管理了,我们需要使用,直接去里面取出来就可以!
Hello hello = (Hello) context.getBean("hello");
System.out.println(hello);
}
}
Hello对象是由Spring创建
Hello对象的属性是在Spring容器中注入。
控制反转:
- 控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的(例如我们在编写代码过程中是通过关键字new创建对象),使用Spring后,对象是由Spring来创建。
- 反转:程序本身不创建对象,而变成被动的接收对象。
依赖注入:就是利用set方法来进行注入的。
IOC是一种编程思想,由主动的编程变成被动的接收。
上述程序中,我们彻底不用在程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,
***IOC:***对象由Spring来创建,管理,装配!
4、IOC创建对象的方式- 使用无参构造创建对象,默认!
- 假设我们要使用有参构造创建对象。
- 下标赋值
- 类型(待补充)
- 参数名(name,ref)(待补充)
总结:在配置文件加载的时候,容器中管理的对象就已经初始化了!
5、Spring配置 5.1、别名
5.2、Bean的配置
5.3、import
这个import。一般用于团队开发使用,它可以将多个配置文件,导入合并为一个。
假设,现在项目中有多个人开发,这三个人负责不同的类开发,不同的类需要注册在不同的bean中,我们可以利用import将所有人的beans.xml合并为一个总的!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eD5biZy1-1634285389348)(E:markdownspringimage-20211009145811020.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2wHqebaG-1634285389350)(E:markdownspringimage-20211009145826335.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-epmeqmiC-1634285389352)(E:markdownspringimage-20211009145846240.png)]
6、依赖注入 6.1 构造器注入(上述)
6.2 Set方式注入【重点】-
依赖注入:Set注入(文档1.4.1)
-
依赖:bean对象的创建依赖于容器!
-
注入:bean对象中的所有属性,由容器来注入!
-
【环境搭建】
1.复杂类型
package com.zhao.pojo;
public class Address {
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
2.真实测试对象
package com.zhao.pojo;
import java.util.*;
public class Student {
private String name;
private Address address;
private String[] books;
private List hobbies;
private Map card;
private Set games;
private String wife;
private Properties info;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String[] getBooks() {
return books;
}
public void setBooks(String[] books) {
this.books = books;
}
public List getHobbies() {
return hobbies;
}
public void setHobbies(List hobbies) {
this.hobbies = hobbies;
}
public Map getCard() {
return card;
}
public void setCard(Map card) {
this.card = card;
}
public Set getGames() {
return games;
}
public void setGames(Set games) {
this.games = games;
}
public String getWife() {
return wife;
}
public void setWife(String wife) {
this.wife = wife;
}
public Properties getInfo() {
return info;
}
public void setInfo(Properties info) {
this.info = info;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", address=" + address +
", books=" + Arrays.toString(books) +
", hobbies=" + hobbies +
", card=" + card +
", games=" + games +
", wife='" + wife + ''' +
", info=" + info +
'}';
}
}
3.beans.xml
Java编程思想 Java核心技术 JVM虚拟机 Spring内幕
听歌 看电影 唱歌 LOL COC BOB 20223564 zhao
4.测试类
import com.zhao.pojo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
//获取上下文
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Student student = (Student) context.getBean("student");
System.out.println(student);
}
}
6.3 拓展方式注入
使用p命名空间(set注入)和c命名空间(构造器注入)进行注入
官方文档1.4.2XML Shortcut with the p-namespace ,XML Shortcut with the c-namespace
- 需用导入规范
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sPhw8WmT-1634285389356)(E:markdownspringBeansscope.png)]单例模式singleton(Spring默认机制)
原型模式prototype:每次从容器中get的时候,都会产生一个新对象
(未完待续)
//获取上下文
ApplicationContext context = new ClassPathXmlApplicationContext(“beans.xml”);
Student student = (Student) context.getBean(“student”);
System.out.println(student);
}
}
### 6.3 拓展方式注入 使用p命名空间(set注入)和c命名空间(构造器注入)进行注入 官方文档1.4.2XML Shortcut with the p-namespace ,XML Shortcut with the c-namespace * 需用导入规范 ### 6.4 bean的作用域 [外链图片转存中...(img-sPhw8WmT-1634285389356)]单例模式singleton(Spring默认机制) 原型模式prototype:每次从容器中get的时候,都会产生一个新对象 (未完待续)



