Spring框架课堂笔记
1.1 简介
spring 春天----给软件行业带来了春天
-
2002年,spring前身interface 21框架
-
2004年3月24号,spring框架诞生
-
Rod johnson,spring创始人
-
spring理念:使现有的技术更加的容易使用,本身是一个大杂烩,整合了现有的技术框架!
-
SSH:Struct2+Spring+Hibernate
-
SSM:SpringMvc + Spring + Mybatis
官网:https://spring.io/projects/spring-framework
官方下载地址:http://repo.spring.io/release/org/springframework/spring
GitHub:https://github.com/spring-projects/spring-framework
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
1.2 优点
-
Spring是一个开源的免费的框架(容器)
-
Spring是一个轻量级的、非入侵式的框架
-
控制反转{IOC},面向切面编程(AOP)
-
支持事务的处理,对框架整合的支持
总结一句话:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架
1.3 Spring的组成
1.4 扩展
在Spring的官网有这个介绍:现代化的Java开发,说白了就是spring的开发
-
Spring Boot
-
一个快速开发的脚手架
-
基于SpringBoot可以快速的开发单个微服务
-
约定大于配置
-
-
Spring Cloud
-
-
SpringCloud是基于SpringBoot实现的
-
因为现在大多数公司都在使用SpringBoot进行快速开发,学习SpringBoot的前提,需要完全掌握Spring及SpringMVC,承上启下的作用
弊端:发展了太久之后,违背了原来的理念 ,配置十分繁琐
2. IOC理论推导
-
UserDao 接口
-
UserDaoImpl 实现类
-
UserService 业务接口
-
UserServiceImpl 业务实现类
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改源代码,如果程序代码量很大,修改代价十分昂贵!
我们使用一个set接口实现,已经发现革命性变化
private UserDao userDao;
//利用set进行动态实现值得植入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
-
之前程序是主动创建对象,控制权在程序员手上
-
使用了set注入后,程序不在具有主动性,而是变成了被动的接受对象
这种思想,从本质上解决了问题,我们程序员不用再去管理对 象的创建了,系统的耦合性大大降低,可以更加专注在业务实现上。这是IOC原型
IOC本质 控制反转 loC(Inversion of Control),是一种设计思想,Dl(依赖注入)是实现loC的一种方法,也有人认为DI只是loC的另一种说法。没有loC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是︰获得依赖对象的方式反转了。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是loC容器,其实现方法是依赖注入(Dependency Injection,Dl) 。
3. HelloSpring
Hello.java
package com.kuang.pojo;
public class Hello {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
beans.xml
MyTest.java
import com.kuang.pojo.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
//获取spring的上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//我们的对象现在都在spring中管理了,我们要使用,直接取出来就可以
Hello hello = (Hello) context.getBean("hello");
System.out.println(hello.toString());
}
}
思考问题?
-
Hello对象是谁创建的?
hello对象是由Spring创建的.
-
Hello对象的属性是怎么设置的? hello对象的属性是由Spring容器设置的
这个过程就叫控制反转:
控制∶谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的.
反转:程序本身不创建对象,而变成被动的接收对象.
依赖注入:就是利用set方法来进行注入的.
IOC是一种编程思想,由主动的缤程变成被动的接收.
可以通过newClassPathXmlApplicationcontext去浏览一下底层源码. OK,到了现在,我们彻底不用再程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的loc.一句话搞定;对象由Spring来创建,管理,装配!
4. IOC创建对象的方式
-
使用无参构造创建对象,默认
-
假设我们要使用有参构造创建对象
-
下标赋值
<!--1. 下标赋值 -->
<bean id="user" class="com.kuang.pojo.User">
<constructor-arg index="0" value="kuangshenshuo"></constructor-arg>
</bean> -
类型赋值
<!--2. 通过类型创建不建议使用 -->
<bean id="user" class="com.kuang.pojo.User">
<constructor-arg type="java.lang.String" value="qinjiangshuo"></constructor-arg>
</bean> -
参数名
<!--3. 直接通过参数名 -->
<bean id="user" class="com.kuang.pojo.User">
<constructor-arg name="name" value="qinjiangshuo"></constructor-arg>
</bean>
总结:在配置文件加载的时候,容器中管理的对象就已经初始化了
-
5. Spring配置
5.1 别名
<!-- 别名,如果添加了别名,我们可用别名-->
<alias name="user" alias="asdvcda"></alias>
5.2 Bean的配置
<!--
id:bean的唯一标识符,也就是我们学的对象名
class:bean对象所对应的权限命名:包名+类型
name:也是别名,而且name可以取多个别名
-->
<bean id="userT" class="com.kuang.pojo.UserT" name="u2,user2;u4">
<property name="name" value="西部开源"></property>
</bean>
5.3 import
import一般用于团队开发使用,可以将多个配置文件导入合并为一个
假设现在项目中有多个人开发,这三个人负责不同的类开发,不同的类需要注册在不同的bean当中
用import将所有人的beans.xml合并为总的
-
张三
-
李四
-
王五
-
applicationContext.xml
<import resource="beans.xml"></import>
<import resource="beans2.xml"></import>
<import resource="beans3.xml"></import>
6. DI依赖注入
6.1 构造器注入
前面已经说过
6.2 Set方式注入[重点]
-
依赖注入:Set注入
-
依赖:bean对象的创建依赖于容器
-
注入:bean对象中的所有属性,由容器来注入
-
【环境搭建】
-
复杂类型
package com.kuang.pojo;
public class Address {
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
} -
真实测试对象
private String name;
private Address address;
private String[] books;
private List<String> hobbies;
private Map<String,String> card;
private Set<String > games;
private Properties info;
private String wife;
-
beans.xml
-
测试类
import com.kuang.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.getName());
//System.out.println(student.getAddress());
}
} -
完善注入信息
<bean id="student" class="com.kuang.pojo.Student">
<!-- 1. 普通值注入,value-->
<property name="name" value="宋晨旭"></property>
<!--2. bean注入,ref:引用spring容器中创建好的对象-->
<property name="address" ref="address"></property>
<!--3. 数组注入,array-->
<property name="books">
<array>
<value>红楼梦</value>
<value>西游记</value>
<value>水浒传</value>
<value>三国演义</value>
</array>
</property>
<!--4. list注入,list-->
<property name="hobbies">
<list>
<value>听歌</value>
<value>玩游戏</value>
<value>看电影</value>
</list>
</property>
<!--5. map注入,map-->
<property name="card">
<map>
<entry key="身份证" value="1234567823"></entry>
<entry key="银行卡" value="12345562315677"></entry>
</map>
</property>
<!--6. set注入,set-->
<property name="games">
<set>
<value>LOL</value>
<value>COC</value>
<value>BOB</value>
</set>
</property>
<!--7. null注入-->
<property name="wife">
<null></null>
</property>
<!--8. Properties注入-->
<property name="info">