0
点赞
收藏
分享

微信扫一扫

spring容器构造对象的方式

钟罗敏 2022-03-12 阅读 44

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”):多实例
举报

相关推荐

0 条评论