spring容器构造对象的六种方式
演示方式通过ApplicationContext的ClassPathXmlApplicationContext获取读取xml文件
ApplicationContext config = new ClassPathXmlApplicationContext("applicationContext.xml");
1.通过无参构造方式
<!-- step1):无参构造方式 -->
<bean id="stu1" class="com.etoak.student.entity.Student"></bean>
测试类中:
Student stu1 = (Student)config.getBean("stu1");
System.out.println(stu1);
sout:
Student{username='null', password='null'}
2.通过带参的构造方式
<!-- step2):带参的构造方式 -->
<bean id="stu2" class="com.etoak.student.entity.Student">
<constructor-arg name="username" value="张三"></constructor-arg>
<constructor-arg name="password" value="jinitaimei"></constructor-arg>
</bean>
测试类中:Student stu2 = (Student)config.getBean("stu2");
sout:
Student{username='张三', password='jinitaimei'}
3.通过静态工厂的方式构建对象
<!-- step3):工厂的静态方法提供***并不会创建工厂*** -->
<bean id="stu3" class="com.etoak.student.entity.StudentFactory" factory-method="createStaticStudent"></bean>
StudentFactory中:
public class StudentFactory {
public static Student createStaticStudent(){
return new Student("李四","lisilisi");
}
public StudentFactory(){
System.out.println("工厂被创建了");
}
}
测试类中:Student stu3 = (Student)config.getBean("stu3");
sout:
Student{username='张三', password='jinitaimei'}//可见在使用工厂的静态方法构造对象中并不会构建工厂对象
4.通过静态工厂的非静态方法构建对象
<!-- step4):工厂非静态方法提供*** 会创建工厂类 *** -->
<bean id="stu4" factory-bean="f" factory-method="createStudent"></bean>//factory-bean就是指向哪个工厂 factory-method用哪个方法的返回值
<bean id="f" class="com.etoak.student.entity.StudentFactory"></bean>
StudentFactory中:
public class StudentFactory {
public StudentFactory(){
System.out.println("工厂被创建了");
}
public Student createStudent(){
return new Student("王五","王五王五");
}
}
测试类中:Student stu4 = (Student)config.getBean("stu4");
sout:
工厂被创建了
Student{username='王五', password='王五王五'}//由于非静态方法的调用必须具体到对象所以工厂也会被创建
5.实现FactoryBean接口,一旦实现了FactoryBean接口,则返回getObject方法返回值的对象
<!-- step5):通过实现FactoryBean接口 获得getObject的对象 -->
<bean id="stu5" class="com.etoak.student.entity.StudentFactoryBean"></bean>
StudentFactoryBean中:
public class StudentFactoryBean implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new Student("赵六","赵六赵六赵六");
}
@Override
public Class<?> getObjectType() {
return null;
}
}
测试类中:
Student stu5 = (Student)config.getBean("stu5");
sout:
Student{username='赵六', password='赵六赵六赵六'}
6.通过注解的方式构造对象
四大注解:
@Conmponent
@Controller web层
@Service 业务层
@Repository 持久层
***可以在bean标签中添加scope属性来控制是否实例化
- @Scope(value=“singleton”):单实例
- @Scope(value=“prototype”):多实例