持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
用类型属性自动注入
对于引用类型属性的注入,也可不在配置文件中显示的注入。可以通过为标签设置 autowire 属性值,为引用类型属性进行隐式自动注入(默认是不自动注入引用类型属性)。根据自动注入判断标准的不同,可以分为两种:
byName:根据名称自动注入
byType: 根据类型自动注入
(1) byName方式自动注入
当配置文件中被调用者 bean 的 id 值与代码中调用者 bean 类的属性名相同时,可使用byName 方式,让容器自动将被调用者 bean 注入给调用者 bean。容器是通过调用者的 bean类的属性名与配置文件的被调用者 bean 的 id 进行比较而实现自动注入的。
(2) byType方式自动注入
使用 byType 方式自动注入,要求:配置文件中被调用者 bean 的 class 属性指定的类, 要与代码中调用者 bean 类的某引用类型属性类型同源。即要么相同,要么有 is-a 关系(子类,或是实现类)。但这样的同源的被调用 bean 只能有一个。多于一个,容器就不知该匹配哪一个了。
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);\
}
运行结果: