恍恍惚惚大二一年又过去了,马上要进入大三了,第一篇博客是刚上大二时候写的,到现在怎么感觉博客质量倒不如从前了,一直忙碌,却感觉没有忙出什么成效来,更博也少了,也只是贴上些代码,文字的描述更少了,感觉自己变得敷衍了,看来是应该反思反思这一年都干了什么。好吧,废话也不多说了,先贴上这篇最近学习spring的一点总结吧
1.什么是Spring,Spring是用来干嘛的?
Spring是一个非常活跃的开源框架;它是一个基于Core来构架多层JavaEE系统的框架,它的主要目地是简化企业开发.
Spring以一种非侵入式的方式来管理你的代码,Spring提倡”最少侵入”,这也就意味着你可以适当的时候安装或卸载Spring
Spring就是一个容器
2.Spring的配置文件
默认情况下是applicationContext.xml文件。可以建立很多xml文件,工程中一般都是这样配置的。
3.Spring创建对象的时间
a.(在默认的情况下,启动Spring容器的时候创建对象)
好处:因为是在Spring容器启动的时候就创建对象,所以只要配置文件书写错误,在一开始的时候(web容器启动)就能发现错误
b.懒加载lazy-init=”true” (在context.getBean时才要创建该对象)
<bean id=”” class=”” lazy-init=”true”></bean>
4.怎么证明Spring容器是单例的还是多例的
a.我们可以写一个小例子,看地址,在Spring容器中的对象默认是单例的,因为对象是单例的,所以只要在类上声明一个属性,该属性中含有数据,那么该属性是全局的(这么做是很危险的),如下图
<bean id="helloWorld" class="com.zkx.spring.scope.HelloWorld"></bean>
测试:
@Test public void testScope_Default(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld"); HelloWorld helloWorld2 = (HelloWorld)context.getBean("helloWorld"); System.out.println(helloWorld); System.out.println(helloWorld2); }
结果 com.zkx.spring.scope.HelloWorld@43763e0b
com.zkx.spring.scope.HelloWorld@43763e0b
证明了Spring容器中的对象默认是单例的
b.如果说scope为”prototype”的时候,spring容器产生的对象就是多实例,无论lazy-init为什么值,都是在context.getBean时才要创建对象
<bean id="helloWorld2" class="com.zkx.spring.scope.HelloWorld"
scope="prototype"></bean>
测试结果是2个不同的地址,这里就不上测试代码了
注:在web开发中,通常把Srvice层和Dao层放进Spring容器中,整成单例的,这样你在浏览器输入一个url,一千次访问,一万次访问,Action调用Service,Service调用Dao,那么也只会产生一个Srvice层的对象和一个Dao层的对象,那么JVM销毁这些对象的压力大大减轻
5.什么是IOC?
IOC:Inversion of Control 控制反转
IOC即Spring的控制反转:把对象的创建、初始化、销毁等工作交给spring容器来做。由spring容器控制对象的生命周期。
6.Spring的初始化和销毁
在applicationContext.xml文件中,加上下面的代码
<bean id="helloWorld" class="com.zkx.spring.initdestroy.HelloWorld"
init-method="init"
destroy-method="destroy"></bean>
初始化方:init-method
销毁方法 :destroy-method
public class HelloWorld { public HelloWorld(){ System.out.println("aaaa"); } public void hello(){ System.out.println("hello world"); } public void init(){ System.out.println("init"); } public void destroy(){ System.out.println("destroy"); } }
@Test public void testInitDestroy(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld"); helloWorld.hello(); ClassPathXmlApplicationContext applicationContext = (ClassPathXmlApplicationContext) context; applicationContext.close();//spring容器关闭 }
测试结果:
aaa
Init
Helloworld
destory
Spring容器关闭时,调用销毁方法,如果spring容器没有执行close方法,则不执行销毁方法,如果spring容器执行了close方法,在执行该方法之前要执行销毁方法;在构造方法之后,立刻执行init方法(destroy用途不是很大,init方法用途很多)
7.Spring的执行流程
8.DI?
DI:Dependency Injection 依赖注入
依赖注入简单的说就是给属性赋值,有2种注入的方法:
a.使用构造器注入
使用xml的注入方式
通过参数的顺序
<constructor-arg index="0"> <value>张三</value> </constructor-arg> <constructor-arg index="1"> <value>56</value> </constructor-arg>
通过参数的类型
<constructor-arg type="java.lang.Integer"> <value>56</value> </constructor-arg> <constructor-arg type="java.lang.String"> <value>张三</value> </constructor-arg>
b.使用属性set方法进行注入
使用xml的注入方式:
简单Bean的注入
简单Bean包括两种类型:包装类型和String
<bean id="personService" class="com.zkx.bean.impl.PersonServiceImpl"> <!-- 基本类型,string类型 --> <property name="age" value="20"></property> <property name="name" value="张无忌"></property> </bean> <!-- 引用其他Bean --> <bean id="person" class="com.zkx.bean.Person" /> <bean id="personService" class="com.zkx.bean.impl.PersonServiceImpl"> <property name="person" ref="person" /> </bean>
9.IOC和DI结合的真正意义
a.不完全的面向接口编程(客户端还得关心这个接口是由哪个类实现的)
如下图就是不完全的面向接口编程(WordDoment等类实现了Document接口,具体类的实现我就不列出来了),包括我以前那篇关于面向接口编程的博客,也是不完全的面向接口编程
@Test public void testDocument_NOSpring(){ //为不完全的面向接口编程 Document document = new WordDocument(); DocumentManager documentManager = new DocumentManager(); documentManager.setDocument(document); documentManager.readDocument(); documentManager.writeDocument(); }
b把documentManager,wordDocument,excelDocument,pdfDocument放入到spring容器中
<bean id="documentManager" class="com.zkx.spring.iocdi.document.DocumentManager"> <property name="document"> <ref bean="wordDocument"/> </property> </bean> <bean id="wordDocument" class="com.zkx.spring.iocdi.document.WordDocument"></bean> <bean id="excelDocument" class="com.zkx.spring.iocdi.document.ExcelDocument"></bean> <bean id="pdfDocument" class="com.zkx.spring.iocdi.document.PDFDocument"></bean>
Java代码端的测试
@Test public void testDocument_Spring(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); DocumentManager documentManager = (DocumentManager)context.getBean("documentManager"); documentManager.writeDocument(); documentManager.readDocument(); }
没有出现一个WordDocment等,也就是说java代码这头,只需要完全面向接口编程就行了,只需要关心Docment的API实现什么样的功能,至于说这个Docment具体是谁,我不关心
这就是IOC和DI结合的真正意义:
Java代码端完全的面向接口编程(现在很多容器都有这功能,都是模仿Spring的)
相关推荐
Spring的IoC容器初始化源码解析,包括资源定位、加载、注册3个过程
Spring Bean创建初始化流程
干净的spring初始化工程,包含ioc,di,datasource,但是不包含aop
Spring Framework API文档。Spring是什么呢?首先它是一个开源的项目,而且非常活跃;它是一个基于IOC和AOP的构架多层j2ee系统的框架,但它不强迫你必须在每一层中必须使用Spring,因为它模块化的很好,允许你根据...
什么是spring,spring核心,spring优点,spring体系结构, 入门案例,DI基础,核心API,文档内附代码
Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程.doc
什么是Ioc和DI
spring ioc容器初始化流程图 spring ioc容器依赖注入流程图 spring aop实现原理流程图
spring ioc指的是控制反转,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。交由Spring容器统一进行管理,从而实现松耦合
Spring Framework 3.0.0.4中IOC容器的实现代码
主要为大家详细解析了Spring中IoC优点与缺点,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找...
手写的IOC,DI,只用到了javax.servlet.*下的包,没有其他工具包。本人手写,绝对可用,jdk1.8环境
Spring5-完全注解开发【之】Spring5介绍、实初始化项目、实现IOC【源码】 文章地址:https://blog.csdn.net/m0_37969197/article/details/124331225
利用Spring Context上下文创建自定义对象,学习Spring的IoC容器如何使用控制反转创建一个对象,了解Spring控制反转原理
IOC与DI的理解及使用 控制反转IOC(Inversion of Control)是一种设计思想,DI(依赖注入)是实现IOC的一种方法 。在没有IOC的程序中,我们使用面向对象编程,对象的创建于对象间的依赖完全硬编码在程序中,对象的...
DI注⼊就是当我们初始化IoC容器创建对象实例时,对象如果存在相互依赖的关系,我们就需要 使⽤到DI注⼊的概念。也就是通过构造函数和set⽅法的⽅式,去为每个容器实例化注⼊所需要 依赖的对象。为我们⾃动地绑定每个...
spring-core:核心模块 依赖注入IOC和DI的最基本实现 spring-beans:Bean工厂与装配 spring-context:上下文,即IOC容器 spring-context-support:对IOC的扩展,以及IOC子容器 spring-context-indexer:类管理组件和...
spring_iocspring_iocspring_iocspring_iocspring_iocspring_iocspring_iocspring_iocspring_ioc
springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...