首页 > 其他分享 >Bean对象的获取

Bean对象的获取

时间:2022-12-28 20:55:34浏览次数:34  
标签:xml Star 对象 bean 获取 Bean 实例 public

Bea的获取方式

1.构造方法实例化

  • 1,创建bean对象

    public class SpringBean {
        public SpringBean() {
            System.out.println("springBean无参构造方法执行!");
        }
    }
    
  • 2,xml里面配置bean对象

    <!-- spring提供的实例化方法第一种,在Spring配置文件中配置类全限定名,spring会自动调用该类的无参构造方法实例化-->
    <bean id="sb" class="com.bean.SpringBean"/>
    
  • 3.测试

    /**
             * spring默认情况下bean对象是单例的(singleton),只有在启用容器解析xml文件时实例化对象,bean对象只创建一次
             * 多例:prototype(原型)
             * 当将bean的scopetype设置为prototype时 解析xml文件时不会实例化对象,每次调用getBean时会创建一个对象
             */   
    	@Test
        public void testInstantiation1(){
            ApplicationContext applicationContext = new 										ClassPathXmlApplicationContext("spring.xml");
    		}
    //输出结果 :springBean无参构造方法执行!
    

2.简单工厂模式实例化

  • 1,创建简单bean类

    public class Star {
        public Star() {
            System.out.println("Star无参构造方法执行!");
        }
    }
    
  • 2.创建简单工厂,(简单工厂模式要有静态方法)

    public class StarFactory {
        public StarFactory() {
            System.out.println("factory 静态方法执行");
        }
        public static Star getStar(){
            //这个star对象创建还是我们负责new的对象,
            return new Star();
        }
    }
    
  • 3,通过xml配置文件告诉Spring哪个类的哪个方法实例化bean对象,factory-method属性指定的是静态方法

    <!--    通过简单工厂模式实例化对象,通过xml文件告诉spring告诉哪个类的哪个方法实例化对象,通过factory-method属性获取对象-->
    <bean id="starBean" class="com.bean.StarFactory" factory-method="getStar"/>
    
  • 4,这里不会将StarFactory实例化,只会调用StarFactory的静态方法获得Star对象

        @Test
        public void testInstantiation2(){
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
            Star star = applicationContext.getBean("starBean", Star.class);
            System.out.println(star);
        }
    /*
    	输出结果:Star无参构造方法执行!
    			com.bean.Star@6c64cb25
    */
    

3.factory-bean实例化,工厂方法模式实例化bean对象

  • 1.配置bean和Factory-bean对象

    //1 bean对象
    public class Gun {
        public Gun() {
            System.out.println("Gun 的无参构造方法执行!");
        }
    }
    //生产工厂对象
    public class GunFactory {
        //这里的方法不是静态的,需要实例化GunFactory来调用get方法
        public Gun get(){
            return new Gun();
        }
    }
    
  • 2,写配置文件

    <!--    第三种通过工厂方法模式实例化对象,通过factory-bean和factory-method属性共同完成bean对象的实例化-->
        <bean id="gunFactory" class="com.bean.GunFactory"/>
        <bean id="gunBean" factory-bean="gunFactory" factory-method="get"/>
    

4. FatoryBean接口实例化

  • 在以上第三种方法种,需要指定factory-bean对象和factory-method对象才能完成需要的bean对象的实例化,spring提供了一个接口,只要factory实现了FactoryBean接口,那么我们就不需要指定factory-bean和factory-method即可完成bean对象的实例化

  • 创建bean类

    public class Person {
        public Person() {
            System.out.println("person无参构造方法执行!");
        }
    }
    
    

    创建Factory类实现FactoryBean接口

    public class PersonFactory implements FactoryBean<Person> {
        @Override
        public Person getObject() throws Exception {
            return new Person();
        }
    
        @Override
        public Class getObjectType() {
            return null;
        }
    }
    

    编写xml文件

    <!--第四种通过FactorryBean接口实例化bean-->
        <bean id="person" class="com.bean.PersonFactory"/>
    

    思考:

    • 只要将对象配置在xml文件中,对象就会被spring容器创建

    • 以上的几种获取bean对象的方法

    • <!-- 第一种,构造方法获取-->
      <bean id="sb" class="com.bean.SpringBean"/>
      <!--通过简单工厂模式实例化对象,通过xml文件告诉spring告诉哪个类的哪个方法实例化对象-->
      <bean id="starBean" class="com.bean.StarFactory" factory-method="getStar"/>
      <!--第三种通过工厂方法模式实例化对象,通过factory-bean和factory-method属性共同完成bean对象的实例化-->
      <bean id="gunFactory" class="com.bean.GunFactory"/>
      <bean id="gunBean" class="com.bean.GunFactory" factory-bean="gunFactory" factory-method="get"/>
      <!--第四种通过FactorryBean接口实例化bean-->
      <bean id="person" class="com.bean.PersonFactory"/>
      
      <!--	
      	第三种和第四种都实例化了工厂对象
      	第三种和第四种本质区别就是:当Factory实现了FactoryBean接口后spring创建Factory对象后会自动调用其get方法获取bean对象(这里 retrun new Bean(这里需要我们自己制定)
      
      	第一种方法,只实例化bean对象本身
      	第二种方法只是调用了Factory对象中的静态方法实例化了bean对象,并没有实例化Factory对象
      -->
      

标签:xml,Star,对象,bean,获取,Bean,实例,public
From: https://www.cnblogs.com/RepublicLine/p/17011260.html

相关文章