Spring学习笔记(二):IOC-2

本作品采用 知识共享署名 4.0 国际许可协议
进行许可。

感谢: Java大联盟

本文作者:低调小熊猫

文章链接: https://aodeng.cc/archives/springer

转载声明:自由转载-非商用-非衍生-保持署名,非商业转载请注明作者及出处,商业转载请联系作者本人qq:2696284032


Spring IOC-2

Spring中的bean是根据scope来生成的,表示bean的作用域。

1.singleton:单例,表示通过Spring容器获取的该对象是唯一的。

2.prototype:原型,表示通过Spring容器获取的对象都是不同的。

3.reqeust:请求,表示在一次http请求内有效。

4.session:会话,表示在一个用户会话内有效。

3和4只适用于web项目,大多数情况下,我们只会使用singleton和prototype两种scope,并且scope的默认值是singleton。

我们通过一个例子来学习这两种配置的区别


单例模式

spring.xml

<bean id="user" class="com.southwind.entity.User">
        <property name="id" value="1"></property>
        <property name="name" value="张三"></property>
        <property name="age" value="23"></property>
     </bean>

main

通过Spring容器获取两个User实例化对象user1和user2,并且通过==方法判断是否为同一个对象。

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        User user = (User) applicationContext.getBean("user");
        User user2 = (User) applicationContext.getBean("user");
        System.out.println(user == user2);

结果

结果打印true,并且User的构造函数只执行了一次,表示user1和user2是同一个对象,所以scope默认值为singleton,即默认通过Spring容器创建的对象都是单例模式。


原型模式

修改spring.xml中的配置,将scope改为prototype。

<bean id="user" class="com.southwind.entity.User" scope="prototype">
        <property name="id" value="1"></property>
        <property name="name" value="张三"></property>
        <property name="age" value="23"></property>
     </bean>

结果

调用了两次构造函数,并且==的结果为false,表示现在的user1和user2是两个对象,说明bean的作用域是原型模式


Spring的继承

user2继承了user1的所有属性

<bean id="user" class="com.southwind.entity.User">
        <property name="id" value="1"></property>
        <property name="name" value="张三"></property>
        <property name="age" value="23"></property>
     </bean>
     <bean id="user2" class="com.southwind.entity.User" parent="user"></bean>

继承的时候还可以覆盖属性

<bean id="user" class="com.southwind.entity.User">
        <property name="id" value="1"></property>
        <property name="name" value="张三"></property>
        <property name="age" value="23"></property>
     </bean>

     <bean id="user2" class="com.southwind.entity.User" parent="user">
        <!-- 覆盖name属性 -->
        <property name="name" value="李四"></property>
     </bean>

这样name的值张三就被李四覆盖了

Spring中的bean能不能在不同类之间继承?

答案是可以,但是需要这两个类的属性列表完全一致,否则会报错,实际开发中并不会使用到这种方式。


spring中bean的依赖

<bean id="user" class="com.southwind.entity.User" depends-on="car">
        <property name="id" value="1"></property>
        <property name="name" value="张三"></property>
        <property name="age" value="23"></property>
     </bean>

     <bean id="car" class="com.southwind.entity.Car">
        <property name="id" value="1"></property>
        <property name="brand" value="宝马"></property>
     </bean>

User依赖于Car,所以必须先创建Car对象,User对象才能完成依赖。


p命名空间

记得在beans中添加 xmlns:p=” http://www.springframework.org/schema/p"

public class User {
    private int id;
    private String name;
    private int age;
    private Car car;
}
<bean id="user" class="com.southwind.entity.User" p:id="1" p:name="张三" p:age="23" p:car-ref="car"></bean>
     <bean id="car" class="com.southwind.entity.Car" p:id="1" p:brand="宝马"></bean>

原文 

https://aodeng.cc/archives/springer

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Spring学习笔记(二):IOC-2

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址