Spring注册bean的方式根据实体类内部的有参、无参,有如下方式:
1.无参构造
Spring注册bean的方式默认是基于无参构造方法的,而我们知道,对于一个实体类,Java是默认存在无参构造方法的,因此在注册bean时,我们可以直接将bean注册进容器。
例如实体类如下:
public class User implements Serializable { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "name='" + name + '\'' + '}'; } }
<bean id="userBean" class="com.aircl.domain.User">
<property name="name" value="aircl"></property>
</bean>
@Test public void testUser(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); User userBean = (User) context.getBean("userBean"); System.out.println(userBean.getName()); }
2.有参构造
Spring对于内部含有有参构造方法的实体类来说,有三种注册方式,当然,实体类中不能够再有无参构造方法,只能够存在有参构造方法,如下:
public class User implements Serializable { private String name; public User(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "name='" + name + '\'' + '}'; } }
<!--第一种方式:根据下标,下标对应属性在实体类中的顺序--> <bean id="userBean" class="com.aircl.domain.User"> <constructor-arg index="0" value="aircl"></constructor-arg> </bean> <!--第二种方式:根据类型,但是这种方式存在问题,容易混淆--> <bean id="userBean" class="com.aircl.domain.User"> <constructor-arg type="java.lang.String" value="aircl"></constructor-arg> </bean> <!--第三种方式:根据类型,推荐使用这种方式--> <bean id="userBean" class="com.aircl.domain.User"> <constructor-arg name="name" value="aircl"></constructor-arg> </bean>
总结
在配置文件加载的时候,容器中管理的对象就已经初始化了。