ioC特性
通过有参构造创建bean
-
-
配置文件中有参构造的bean标签
<bean id="student3" class="com.soutchwind.entitiy.Student">
<constructor-arg name = "id" value="3"></constructor-arg>
<constructor-arg name ="name" value="李四"></constructor-arg>
<constructor-arg name="age" value="25"></constructor-arg>
<constructor-arg name="address" ref="adress"></constructor-arg>
</bean>通过·一个·bean标签引用两个bean标签(给bean注入集合)
<bean id ="student" class="com.soutchwind.entitiy.Student">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="24"></property>
<property name="addresses" >
<list>
<ref bean="adress"></ref>
<ref bean="address2"></ref>
</list>
</property>
</bean>
scope作用域
Spring管理的bean是根据scope来生成的,scope表示bean的作用域,一共有四种,默认是单例模式。
-
singleton:单例,表示通过ioC容器获取的bean是单一的。
-
prototype:原型:表示通过ioC容器获取的bean是不同的。
-
request:请求:表示在一次http请求内有效。
-
session:回话,表示在一个用户会话内有效
request和session只适用于Web项目,大多数情况使用单例和原型较多。
单例模式:ioc容器中的bean标签存在一个对象,那你如果多次取拿这个对象,拿到的对象的内存地址都是相同的
说到底拿多次还是只拿到一个相同的对象。拿出来的对象都是相同的。scope默认都是单例模式。
原型模式:ioc容器标签中存在一个对象,第一次拿会直接复制一个与这个对象地址相同的拿过去,第二次就会创建一个新的地址的对象传过去,以此类推。
原型:当业务代码获取ioC中的bean时,Spring才会调用无参构造方法去创建对象。不获取就不创建。
单例:无论业务代码是否获取ioC容器中的bean,Spring.xml在被加载时就会创建bean.
即只要执行ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");加载配置文件这一操作,单例模式的bean中的对象就已经被创建了。
单例省空间,但是只要加载配置文件就会创建对象,可能用不上这个对象
原型:浪费空间,但是只会随着调用而创建,比较灵活.
原型和单例都只针对同一个bean标签,不同的bean标签也可以创建不同的对象。
Spring继承
与java的继承不同,java是类层面的继承,子类可以继承父类的方法,而Spring继承是对象层面的继承,子类可以继承父对象的属性值。也可以重写属性值。
一个bean可以继承另一个bean的属性值,并且可以重写属性值。
不同类创建的对象也可以继承,不过属性值要存在包含关系,属性值多的对象可以继承与自身相等或更少的属性值。父类有的属性,子类也一定要有,子类属性可以多于父类属性。
不同类的实例化对象可以相互继承,这前提是子对象必须包含父对象的所有属性,同时可以在此基础上添加其他属性。
<!-- 继承 ,子类对象继承父类对象的属性值,也可以重写属性值-->
<bean id="stu" class="com.soutchwind.entitiy.Student" parent="student">
<property name="name" value="李四"></property>
</bean>
Spring依赖
依赖描述bean与bean之间的关系,被依赖的bean一定先被创建。bean标签执行顺序,从上至下,检验方式可通过构造方法输出顺序,看那个构造方法先打印语句
<!--正常情况下bean标签执行顺序从上至下,但是有了依赖之后,可以让被依赖的对象先执行-->
<!--address依赖于student,所以student的构造方法先执行-->
<bean id="address" class="com.soutchwind.entitiy.Address1" depends-on="student"></bean>
<bean id="student" class="com.soutchwind.entitiy.Student1"></bean>
Spring p标签
p标签起到简化bean标签的作用
<!--p标签可以简化bean标签,只需加上xmlns:p="http://www.springframework.org/schema/p"即可使用p标签-->
<bean id="student" class="com.soutchwind.entitiy.Student" p:id="1" p:name="张三" p:age="32" p:addresses-ref="adress"></bean>
<bean id="adress" class="com.soutchwind.entitiy.Address" p:id="2" p:name="科技路"></bean>
<!--原来bean标签语句-->
<!-- <bean id="student" class="com.soutchwind.entitiy.Student">-->
<!-- <property name="id" value="1"></property>-->
<!-- <property name="name" value="张三"></property>-->
<!-- <property name="age" value="32"></property>-->
<!-- <property name="addresses" ref="address"></property>-->
<!-- </bean>-->
<!-- <bean id="address" class="com.soutchwind.entitiy.Address">-->
<!-- <property name="id" value="2"></property>-->
<!-- <property name="name" value="科技路"></property>-->
<!-- </bean>-->