文章目录
1、Spring
1.1、简介
- Spring:春天------> 意为给软件行业带来了春天!
Rod Johnson ,Spring Framework创始人,著名作者。他是悉尼大学的一个音乐学的博士,没错,他的专业不是计算机,而是音乐学。
所以大家不要把Spring想的太难,毕竟不是一个领域的人搞出来的,大家还怕学不会吗~
Spring理念:使现有的技术更加容易使用,就为了简化程序员的开发,本身是一个大杂烩,整合了现有的技术框架!
官网:https://spring.io/
1.2、优点
- Spring是一个开源的免费的框架(容器)!
- Spring是一个轻量级的、非入侵式的框架!
- 控制反转(IOC) , 面向切面编程(AOP)!
- 支持事务的处理,对框架整合的支持!
Spring可以使Java程序更加快速,简练,安全,是世界上最受欢迎的Java框架
总结一句话:Spring就是一个轻量级的控制反转(IOC) 和面向切面编程(AOP)的框架!
1.3、组成
打开官网,我们可以看到它里面的project还是很多的
2、什么是IOC?
说起IOC,就会想到DI,其实他俩是一个意思。
控制反转IOC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IOC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入(Dependency Injection,DI)。
IOC容器 : 控制反转思想 由主动的编程变成被动的接收
IOC思想的具体实现: 本质是DI(依赖注入) 就是set方法
我们以前想要获取对象是不是要去new一个对象,在学了IOC容器之后,我们再想获取对象,就直接从IOC这个容器中拿就行了,就是它已经帮我们创建好了,我们直接拿过来用就OK!
举个栗子:
以前人们干啥都是自己动手丰衣足食的一种思想,想要什么就自己做一个
而现在呢,大部分人动根手指都觉得累,但是懒人也有懒人的办法,这不马云爸爸开了个“小商店”嘛,他们就直接在上面买就行了
是不是别人帮他做好了,他直接拿来用就行了,就是这么一种懒人思想,大家能理解吧!
3、HelloSpring程序的编写(属性注入的两种方法)
大概了解了Spring和IOC的概念之后,可能有小伙伴还不太清楚,接下来我们用程序体现一下这个思想大家就会想明白啦!
3.1、set注入
3.1.1、创建一个maven项目,导入依赖
如果还有人不会创建maven项目,可以参考我的上一篇博客导入Spring相关的jar包(依赖)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
3.1.2、编写Spring配置文件applicationContext.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">
<!--这里写bean
大家不要觉得bean很陌生,其实一个bean就是一个Java对象,由Spring创建和管理
id是唯一标识,class连接的实体类,就创建了一个名为hello的Hello对象
-->
<!--
Hello hello = new Hello(); 第一行相当于
hello.setName(Spring) 第二行相当于
-->
<bean id="hello" class="com.gang.pojo.Hello">
<property name="name" value="Spring"/>
</bean>
</beans>
这个在官网上也可以找到,不用记直接去官网复制即可,把里面没用的东西删掉。
3.1.3、编写Hello实体类
package com.gang.pojo;
/*
Description:实体类
Author:32259
Time:2020二月2020/2/2313:43
*/
public class Hello {
public Hello(){
System.out.println("无参构造被执行了!");
}
private String name;
public void setName(String name){
this.name = name;
}
public void show(){
System.out.println("Hello,"+name);
}
}
3.1.4、编写测试类和测试方法
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
@Test
public void testHello(){
//加载配置文件进来,就是连接到IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("===================");
//容器中通过唯一标识拿到hello这个对象
Hello hello = (Hello) context.getBean("hello");
hello.show();
}
}
3.1.5、查看结果,解决疑惑!
好,运行程序看结果!
那么问题来了
- 1.hello对象是由谁创建的 ?
- 分析运行结果,可以发现是Spring创建的,调用了无参构造,但是我们并没有去new一个对象!这就是IOC~
- 2.hello对象的属性是怎么设置的?
- 由Spring容器设置的,使用了set方法,所以set方法一定要有
Spring的set注入,其实就是使用无参构造创建一个对象,然后用set方法去给属性设值!Spring默认采用set注入~
3.2、构造器注入
那么除了set注入以外
Spring还有一种构造器注入,本质就是直接用有参构造创建对象,值通过参数传进去!
那么在以上的基础上,我就直接改一下代码,不重新写了,大家注意观察对比!
3.2.1、改变applicationContext.xml文件中bean的写法
<?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">
<bean id="hello" class="com.gang.pojo.Hello">
<!--无参 set注入-->
<!-- <property name="name" value="Spring"/> -->
<!--有参 构造器注入-->
<constructor-arg name="name" value="Spring"/>
</bean>
</beans>
3.2.2、在实体类中加入有参构造
package com.gang.pojo;
/*
Description:实体类
Author:32259
Time:2020二月2020/2/2313:43
*/
public class Hello {
private String name;
public Hello(String name) {
System.out.println("有参构造被执行了!");
this.name = name;
}
public Hello(){
System.out.println("无参构造被执行了!");
}
public void setName(String name){
this.name = name;
}
public void show(){
System.out.println("Hello,"+name);
}
}
3.2.3、查看结果
测试类不需要改变,执行测试方法,看结果
这两种注入方式选一样即可!!!
4、总结
好了,通过程序,我们是否对控制反转和依赖注入有了一些了解了呢?
- 控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring来创建的 .
- 反转 : 程序本身不创建对象 , 而变成被动的接收对象 .
- 依赖注入 : 就是利用set方法或构造器来进行注入的.
到现在,我们发现要实现不同的操作 , 只需要在xml配置文件中进行修改即可,不需要再去改程序了!