目录
1.什么是Spring
IoC
2.Spring创建和使用
创建Spring
存取Bean
BeanFactory 和 ApplicationContext的区别
3. 总结
spring官网:spring.io
它的生态是非常完善的
通常所说的Spring指的是Spring Framework(Spring 框架),是一个开源的框架,支持广泛的应用场景可以使Java企业级应用程序开发更简单
Spring Framework 是Spring生态圈中最基础的项目,是其他项目的根基
核心:Spring是包含了众多工具方法的IoC容器
那么什么是IoC容器?
容器:之前学过的List/Map=>数据存储容器,tomcat=>web容器..等都是容器
Spring=>IoC容器
IoC:Inversion of Control 控制反转,Spring是一个控制反转容器
那IoC具体是什么呢?
这得从我们Java代码的书写现状说起,在传统编程时, 对象之间的耦合度是偏高的
我们写个示例,Test类要依靠A类才能完成任务,A依赖于B才能完成任务
创建A类
A对象是依赖于B对象的,所以会报错
加上B类
此时A类不再报错
也就是A对象要使用B对象时,得new一个B对象.此时,A对象掌握了B对象的控制权,党部在使用时,可以给B设置为null,就被回收了
A依赖于B,那么当B对象的构造方法改动时,A对象也得跟着改动
当B中的构造方法改动后,newB的A也得改动,否则就会报错
改动后
newA的Test也需要改动
可以发现,当最底层发生变化时,整个调用链都需要发生变化
这就体现了代码之间耦合程度比较高的问题,如何解决呢?
我们写一种解耦的写法
此时我们改动B的构造器
前面几个类都不会报错,只是提供它的测试类报错了
这种方法就实现了解耦
传统方式:Test依赖A,A依赖B
解耦方式:B传入A,A传入Test
是一个反转的过程
这些类的生命周期,不是由依赖的类来控制了
总结:
解决办法:解耦,使用对象时,不主动new对象,转为由外部获取
即使下级类参数发生改动,当前类本身也不需要改动,这就是程序的解耦
IoC负责对象的创建,初始化一系列工作,被创建或被管理的对象在IoC容器中统称为Bean
IoC核心思想:对象的创建控制权由程序转移到外部,这种思想称为控制反转
A只管使用B对象,不进行new对象操作,只是使用.B对象由谁创建A并不关心
此时,A对象就没有B对象的控制权了.控制权交出去了,这就是控制反转!
回到Spring这个主题,它是包含了众多方法工具的IoC容器,也就是Spring提供了一个IoC容器,用来充当IoC思想中的"外部",它具有对象创建和销毁的权利,本身又具备存储对象和获取对象的能力
核心功能:将对象存入到容器,将对象从容器中取出
用Spring存取对象的好处?
将对象放到容器中,相当于将以后可能用的工具都制作好放到仓库了.需要时直接取出使用,用完再放回仓库,new对象方式使用完置空就会被回收,要使用还得重新new.
还需要提到一个概念,Dependency Injection,简称DI,是依赖注入的意思
依赖注入:IoC容器运行期间,动态的将某种依赖关系注入到对象中.
可以看出,IoC是一个指导思想,DI是其具体的实现
创建Spring项目分为三步
1.创建一个普通Maven项目
2.添加Spring框架支持
3.添加启动类
1.创建一个普通Maven项目
这样就代表项目已经初始化完成了
2.添加Spring依赖
需要配置好国内源,否则下载非常慢
需要使用大版本号是5的支持和jdk要相匹配
org.springframework
spring-context
5.3.26
然后点击刷新
3.创建启动类
下来我们将Bean对象存储到Spring中
1.创建Bean
Bean:在Java中如果被使用很多次,就称为Bean
2.将Bean存储到Spring容器中
通过Spring的配置文件配置Bean的信息
3.从Spring中获取到Bean
先获取Spring(上下文)对象,用到的是ClassPathXmlApplicationContext
ClassPathXmlApplicationContext类是实现了ApplicationContext接口的
ClassPathXmlApplicationContext属于 ApplicationContext 的⼦类,拥有 ApplicationContext 的所有功能,是通过 xml 的配置来获取所有的 Bean 容器的
注意""中的路径一定要写对,和resourses下的.xml文件对应,不然无法找到我们设置的bean
然后就能获取bean了
这个参数内容必须是和.xml中配置的id是一样的才能获取到bean
结果:
没有通过new对象的方式,获取到了bean对象并且使用
还有另外两种获取方式:
这个过程就是通过代码实现的DI, 动态的将依赖关系注入到对象中!
BeanFactory也能获取到Spring的上下文
可以看出,Application Context也是它的子类型,是对其功能的扩展
public class Application2 {
public static void main(String[] args) {
//1.得到spring上下文对象
BeanFactory beanFactory =
//不推荐使用,是因为早期时内存珍贵,现在内存价格低廉.
//特征:省内存,调用时加载初始化bean到spring容器,效率不高!
new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
//2.从容器中获取对象
//第一种获取方式:这个写法是有问题的,如果本身是"null",强转会出错
Student s2 = (Student) beanFactory.getBean("student");
//3.使用对象
s2.sayHi();
}
}
那么这两种方式又什么区别呢?
我们再创建一个类
配置Bean信息
我们只调用获取上下文的这行代码
ApplicationContext是一次性加载,比较费内存,但是后续读取非常快,会将spring中所有的bean进行初始化,全部实例化到spring中!!饿汉模式
Beanfactory不会,使用的是惰性加载,只有执行到了get bean才会加载对应的bean!!!
从继承关系方面来说:
Spring有两个顶级接口,BeanFactory 和 ApplicationContext,其中BeanFactory提供了基础的访问容器的能力,而ApplicationContext属于BeanFactory的子类,除了继承了BeanFactory之外,还拥有其他特性,添加了对国际化支持,资源访问支持,以及事件传播等方面的支持
1.创建Spring项目
创建一个Maven项目
添加Spring-context依赖
创建启动类
2.存储Bean
创建Bean对象
通过Spring配置文件(spring-config.xml)
3.读取Bean
得到Spring上下文(BeanFactory 和 ApplicationContext)
通过Spring对象.getBean()方法获取到Bean对象(这个过程是DI)
使用Bean