最近开始学习Spring,虽然项目中一直在使用,但是对它的原理、特点、使用等处于一知半解的状态。这个工程作为Spring学习的案例,希望在学习的过程能充分理解Spring。
##关于Spring
###对于Spring的理解
Spring是一种轻量级的Java开源框架,充分实现了OOP面向接口编程的**,实现了企业应用开发中低耦合高内聚的目的。
###什么是IOC
控制反转:获得依赖对象的过程反转了,获得依赖对象的过程由自身管理变为由IOC容器主动注入。所以对于IOC的实现方式也叫DI:依赖注入。
面向接口编程。……
……
Spring作为一个bean容器充分解放了开发过程中对象管理的过程,使模块之间低耦合可插拔,提高开发效率降低维护成本。
添加maven依赖
org.springframework.spring-context.3.2.2.RELEASE
spring-context
依赖会自动添加spring-core
、spring-beans
等核心依赖,也会添加commons-logging
依赖。
关于lazy-init
配置,默认是default,初始化的时候就会载入并实例化,如果改为lazy-init="true"
会变为在调用的时候才装载并初始化,但是这种方式明显在第一次调用时有性能损耗,所以一般不建议配置。
关于scope
配置,默认bean都是单例模式,如果需要设置成每次调用都实例化则需改成scope="prototype"
。
<constructor-arg index="0" value="刘晓刚" /> <constructor-arg index="1" value="3500" /> <constructor-arg index="2" ref="dept"/> <constructor-arg index="3" value="男" />第二种方法是根据所属类型传值: 这种方法基本上不怎么适用,因为一个类里可以有好几个相同基本类型的变量,很容易就混淆值传给哪一个参数了所以做好不要使用这种方法:
<constructor-arg type="java.lang.String" value="刘晓刚" <constructor-arg type="java.lang.Double" value="3500" /> <constructor-arg type="www.csdn.spring01.constructor.Dept" ref="dept"/> <constructor-arg type="java.lang.String" value="男" />第三种方法:根据参数的名字传值:(推荐用法) 在这几种方法里我感觉这种方法是最实用的,他是根据名字来传值的,所以基本上只要名字对了,这个值就可以获取到
<constructor-arg name="name" value="刘晓刚" /> <constructor-arg name="salary" value="3500" /> <constructor-arg name="dept" ref="dept"/> <constructor-arg name="sex" value="男" />第四种方法:直接传值: 直接给参数赋值,这种方法也是根据顺序排的,所以一旦调换位置的话,就会出现bug,这种方法已经很原始了
<constructor-arg value="刘晓刚" /> <constructor-arg value="3500" /> <constructor-arg ref="dept"/> <constructor-arg value="男" />在bean方法中定义property name对应的setter进行注入。 setter方法:
private InjectionDao injectionDao;bean配置:public void setInjectionDao(InjectionDao injectionDao) { this.injectionDao = injectionDao; }
<bean id="injectionService" class="com.iceblock.springstudy.injection.InjectionServiceImpl"> <property name="injectionDao" ref="injectionDao"></property> </bean>