文章目录
Spring
优点
- Spring开源免费的框架(容器)
- Spring是一个轻量级的、非入侵式的框架!(导入jar包不影响原来的项目)
- 控制反转(IOC),面向切面编程(AOP)
- 支持事务的处理,对框架整合的支持
文档
官网:https://spring.io/projects/spring-framework#learn
官方下载地址:https://repo1.maven.org/maven2/org/springframework/spring/
github: https://github.com/spring-projects/spring-framework
中文文档:https://www.docs4dev.com/docs/zh/spring-framework/5.1.3.RELEASE/reference/
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
- Spring Boot
- 一个快速开发的脚手架
- 基于SpringBoot可以快速的开发单个微服务
- 约定大于配置!
- Spring Cloud
- SpringCloud是基于SpringBoot进行快速开发,学习SpringBoot前提,需要完全掌握Spring和SpringMVC!
2、IOC理论推导
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!如果程序代码量十分大,修改一次的成本代价十分昂贵!
使用一个Set接口实现
private UserDao userDao;
// 利用set进行动态实现值的注入!
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
可以通过set设置接口,而不是直接在Servlet层写死是哪一个接口
这种思想,从本质上解决了问题,我们程序猿不用再去管理对象的创建了。系统的耦合性大大降低~,可以更加专注的在业务的实现上!这是IOC的原型!
IOC本质
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。
3、HelloSpring
Hello.java
package com.meng.dao;
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 + '\'' +
'}';
}
}
注册
<?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="hello" class="com.meng.dao.Hello">
<property name="str" value="Spring"/>
</bean>
</beans>
测试
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Hello hello = (Hello) context.getBean("hello");
System.out.println(hello.toString());
思考问题?
- Hello对象是谁创建的?
Hello对象是由Spring创建的。 - Hello对象的属性是怎么设置的?
Hello对象的属性是由Spring容器设置的。
这个过程就叫控制反转:
控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的。
反转:程序本身不创建对象,而变成被动的接收对象。
依赖注入:就是利用set方法来进行注入的。
IOC是一种编程思想,由主动的编程变成被动的接收。
可以通过new ClassPathXmlApplicationContext去浏览一下底层源码。
OK,到了现在,我们彻底不用在程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的IOC,一句话搞定:对象由Spring来创建,管理,装配!
4、IOC创建对象的方式
- 使用无参构造创建对象,默认!
- 假设我们要使用有参构造创建对象。
- 下标赋值
<bean id="user" class="com.meng.pojo.User">
<constructor-arg index="0" value="author真牛逼"/>
</bean>
- 类型赋值
<bean id="user" class="com.meng.pojo.User">
<constructor-arg type="java.lang.String" value="author"/>
</bean>
- 参数名赋值
<bean id="user" class="com.meng.pojo.User">
<constructor-arg name="s" value="author"/>
</bean>
总结:在配置文件加载的时候,ApplicationContext
容器中管理的对象就已经初始化了!
5、Spring配置
5.1、别名
<!-- 如果添加了别名,通过别名也可以获取这个对象 -->
<alias name="user" alias="caonima"/>
5.2、Bean的配置
<!--
id:bean的唯一标识符,也就是相当于我们学的对象名
class:bean对象所对应的全限定名:包名+类型
name:也是别名,而且name可以同时获取多个别名
-->
<bean id="user" class="com.meng.pojo.User" name="tname1 tname2,tname3;tname4">
<constructor-arg name="s" value="author"/>
</bean>
5.3、import
一般团队开发使用,用于导入其他配置文件,合并成一个
假设,现在项目由对个人
<?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">
<import resource="beans.xml"/>
<import resource="beans2.xml"/>
<import resource="beans3.xml"/>
</beans>
6、依赖注入
6.1、构造器注入
6.2、Set方式注入【重点】
- 依赖注入:Set注入!
- 依赖:bean对象的创建依赖于容器!
- 注入:bean对象中的所有属性,由容器来注入!
【环境搭建】
- 复杂类型
package com.meng.pojo;
public class Address {
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
- 真实测试对象
public class Student {
private String name;
private Address address;
private String[] books;
private List<String> hobbys;
private Map<String,String> card;
private Set<String> games;
private Properties info;
private String wife;
}
- 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="student" class="com.meng.pojo.Student">
<!-- 第一种,普通值注入,value -->
<property name="name" value="author"/>
</bean>
</beans>
- 测试类
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Student student = (Student) context.getBean("student");
System.out.println(student.getName());
}
完善注入信息
<bean id="address" class="com.meng.pojo.Address">
<property name="address" value="沈阳"/>
</bean>
<bean id="student" class="com.meng.pojo.Student">
<!-- 第一种,普通值注入,value -->
<property name="name" value="author"/>
<!-- 第二种,Bean注入,ref -->
<property name="address" ref="address"/>
<!-- 数组 -->
<property name="books">
<array>
<value>西瓜书</value>
<value>深度学习</value>
<value>机器学习</value>
<value>啥也不会</value>
</array>
</property>
<!-- List -->
<property name="hobbys">
<list>
<value>听歌</value>
<value>敲代码</value>
<value>看电影</value>
<value>睡觉</value>
</list>
</property>
<!-- Map -->
<property name="card">
<map>
<entry key="身份证" value="1234782378598395789"/>
<entry key="银行卡" value