IOC和DI:
IOC,中文翻译为控制反转,是一种设计思想。而DI,中文翻译为依赖注入,则是IOC的一种实现方法。注意!很多人喜欢把IOC和DI混为一谈,其实不是这样的,IOC是一种设计思想,而DI,则只是实现这种思想的一种方式,一个是思想,一个是行为。同一个思想可以由不同行为实现,不用DI,IOC同样也可以由其他方式实现。
IOC思想:
所谓控制反转,控制的是什么?反转的又是什么?这是这个概念最需要搞明白的地方。
控制的是什么?其实,控制的是对象的创建。在传统的JavaSE面向对象的编程中,对象的创建由程序员完成,写死在程序中,这样做的弊端,就是程序的耦合太高,创建对象的过程被写死在程序中,一旦需求改变,对象需要改动,就需要频繁修改代码。
那反转的是什么?其实是对象的创建者,控制反转后,对象的创建移交给第三方,也就是交给客户需求,不再需要程序员写死在程序中,由客户需求动态改变来创建对象,因此,要实现不同的操作,只要在xml配置文件中进行修改,对象由Spring创建、管理、装配。
IOC创建对象的方式:
Spring在配置文件加载时,会为每个对象创建一个实例,且默认使用无参构造器创建实例。这个本人经过验证,在每个对象的无参构造器中打印一句话,就可以验证,结果表明,就算没有调用某个实例,实例的无参构造器仍然被执行了。并且,Spring默认使用单例模式,为每个对象只创建一个实例,用getBean()方法返回两个参数,比较两个参数,结果为true,他们是同一个池中的同一个对象。当然,也可以在xml中修改不使用默认的单例模式。
如果想使用有参数的构造器创建对象:
1.直接通过参数名称配置
<bean id="..." class="类的路径">
<constructor-arg name="构造器中参数名" value="定义的值"/>
<bean>`
2.下标赋值
<bean id="..." class="类的路径">
<constructor-arg index="0" value="定义的值"/>
<bean>`
3.通过类型创建(多个相同类型时不能用)
<bean id="..." class="类的路径">
<constructor-arg type="java.lang.string" value="定义的值"/>
<bean>`
Spring的常见配置:
1.bean
id为Spring帮你创建出来的对象的名称。class为类的路径。name为别名,可以有多个,相当于可以根据别名获取对象,不依靠id了。property中,name为属性名,就是你在类中定义的属性,value为你给这个属性赋的值。
注意:property中,赋值默认调用set方法。 也就是说,想让spring帮你创建对象并赋值,必须类中有该属性的set方法。
ref也是赋值语句,只不过,ref是赋值对象,value是赋值具体值,一般用在基本数据类型上,ref用在引用类型,ref的作用,是把spring中其他已经定义的对象赋值过来。
<bean id="redis" class="com.dao.RedisImpl" name="别名">
<property name="name" value="redis"></property>
</bean>
<bean id="userServiceImpl" class="com.service.UserServiceImpl">
<property name="userDao" ref="别名"></property>
</bean>
单例模式创建bean(Spring默认机制,scope可以不写,默认单例)
<bean id="accountService" class="com.something.DefaultAccountService" scope="singleton"/>
原型模式创建bean,每次从容器get,都会产生一个新对象
<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>
2.别名(没啥用,只能取一个别名,还没bean中的name属性好用)
<alias name="旧名" alias="别名">
3.import:一般用于团队开发使用,可以将多个配置文件,导入合并为一个。
<import resource="bean1.xml">
<import resource="bean2.xml">
<import resource="bean3.xml">
...