将JavaBean交给IoC容器管理
一个JavaBean的详细配置
<bean name="student" class="com.test.bean.Student"/>
其中`name`属性(也可以是`id`属性),全局唯一,不可出现重复的名称,可以通过Bean的名称来向IoC容器索要对应的对象
在主方法中连续获取两个对象,发现两次获取到的实际上是同一个对象。因为默认情况下,通过IoC容器进行管理的JavaBean是单例模式的,此时需要修改其作用域
<bean name="student" class="com.test.bean.Student" scope="prototype"/>
通过将其设定为`prototype`(原型模式)来使得其每次都会创建一个新的对象
当Bean的作用域为单例模式,那么它会在一开始就被创建,而处于原型模式下,只有在获取时才会被创建,也就是说,单例模式下,Bean会被IoC容器存储,只要容器没有被销毁,那么此对象将一直存在,而原型模式才是相当于直接new了一个对象,并不会被保存。
通过配置文件,告诉创建一个对象需要执行此初始化方法,以及销毁一个对象的销毁方法
public class Student {
String name;
int age;
private void init(){
System.out.println("我是初始化方法!");
}
private void destroy(){
System.out.println("我是销毁方法!");
}
public Student(){
System.out.println("我被构造了!");
}
}
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("test.xml");
Student student = (Student) context.getBean("student");
System.out.println(student);
context.close(); //手动销毁容器
}
<bean name="student" class="com.test.bean.Student" init-method="init" destroy-method="destroy"/>
手动指定Bean的加载顺序,若某个Bean需要保证一定在另一个Bean加载之前加载,那么就可以使用`depend-on`属性
依赖注入DI
IoC在创建对象时,需要将我们预先给定的属性注入到对象中,可以使用`property`标签来实现,但是一定注意,此属性必须存在一个set方法,否则无法赋值
<bean name="student" class="com.test.bean.Student">
<property name="name" value="小明"/>
</bean>
如果成员属性是一个非基本类型非String的对象类型时,只需要将对应的类型也注册为bean即可,然后直接使用`ref`属性来进行引用
<bean name="card" class="com.test.bean.Card"/>
<bean name="student" class="com.test.bean.Student">
<property name="name" value="小明"/>
<property name="card" ref="card"/>
</bean>
集合实现注入
<bean name="student" class="com.test.bean.Student">
<property name="list">
<list>
<value type="double">100.0</value>
<value type="double">95.0</value>
<value type="double">92.5</value>
</list>
</property>
</bean>
一个Map类型可以使用`entry`来注入
<bean name="student" class="com.test.bean.Student">
<property name="map">
<map>
<entry key="语文" value="100.0"/>
<entry key="数学" value="80.0"/>
<entry key="英语" value="92.5"/>
</map>
</property>
</bean>
使用自动装配来实现属性值的注入
<bean name="card" class="com.test.bean.Card"/>
<bean name="student" class="com.test.bean.Student" autowire="byType"/>
自动装配会根据set方法中需要的类型,自动在容器中查找是否存在对应类型或是对应名称以及对应构造方法的Bean,比如我们上面指定的为`byType`,那么其中的card属性就会被自动注入类型为Card的Bean
指定一个有参构造进行对象的创建
<bean name="student" class="com.test.bean.Student">
<constructor-arg name="name" value="小明"/>
<constructor-arg index="1" value="18"/>
</bean>
通过手动指定构造方法参数,我们就可以直接告诉容器使用哪一个构造方法来创建对象