Spring框架创建对象的作用域

135 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

用类型属性自动注入

对于引用类型属性的注入,也可不在配置文件中显示的注入。可以通过为标签设置 autowire 属性值,为引用类型属性进行隐式自动注入(默认是不自动注入引用类型属性)。根据自动注入判断标准的不同,可以分为两种:

byName:根据名称自动注入

byType: 根据类型自动注入

(1) byName方式自动注入

当配置文件中被调用者 bean 的 id 值与代码中调用者 bean 类的属性名相同时,可使用byName 方式,让容器自动将被调用者 bean 注入给调用者 bean。容器是通过调用者的 bean类的属性名与配置文件的被调用者 bean 的 id 进行比较而实现自动注入的。

image.png

(2) byType方式自动注入

使用 byType 方式自动注入,要求:配置文件中被调用者 bean 的 class 属性指定的类, 要与代码中调用者 bean 类的某引用类型属性类型同源。即要么相同,要么有 is-a 关系(子类,或是实现类)。但这样的同源的被调用 bean 只能有一个。多于一个,容器就不知该匹配哪一个了。

image.png

image.png

Spring创建对象的作用域

Spring容器创建的对象默认的作用域是单例模式的.单例模式的目的就是无论访问多少次,得到的都是同一个对象.例如各种开发工具基本上都是单例的存在.但画图的工具是非单例的模式.

我们可以通过创建系统时间来验证Spring创建对象的默认单例模式.

<bean id="mydate" class="java.util.Date" scope="singleton"> ===>单例模式\
    <!--<property name="time" value="1234567891011"></property>-->\
</bean>

可以设置为非单例的方式:

<bean id="mydate" class="java.util.Date" scope="prototype">   ===>非单例模式\
    <!--<property name="time" value="1234567891011"></property>-->\
</bean>

测试代码:

@Test\
public void testSpringStudent()throws Exception{\
    //创建容器对象并启动.自动完成容器中所有对象的创建,默认调用无参的构造方法.\
    //如果没有提供无参的构造方法,则容器炸掉\
   ApplicationContext ac = new ClassPathXmlApplicationContext("s04/applicationContext.xml");\
    Date date1 = (Date) ac.getBean("mydate");\
    System.*out*.println("第一次取出的对象:"+date1);\
    System.*out*.println("********************");\
    Thread.*sleep*(3000);\
    Date date2 = (Date) ac.getBean("mydate");\
    System.*out*.println("第二次取出的对象:"+date2);\
    System.*out*.println(date1==date2);\
}

运行结果:

image.png