Spring的对象与创建方式

100 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解Spring的对象与创建方式,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan

对象Bean详解

 <?xml version="1.0" encoding="UTF-8"?>
 <!--Spring配置文件
     1、beans:根标签
     2、spring-beans.xsd是一个约束文件。约束XML中能编写那些标签
 -->
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 ​
     <!--
         创建对象,声明bean,通知spring要创建那个类的对象
             一个bean标签声明一个对象:
                 id="自定义对象名",要求唯一
                 class 完全限定名字,不能是接口(因为Spring底层是通过反射来创建对象的)
              当容器被创建的时候,对象就自动生成(相当于 new Class【类名】()  )然后放入到Spring的一个集合(Map类)中
              相当于SpringMap.put(id,创建的对象); 例如 SpringMap.put("team1",new Team());
     -->
     <!--自定义对象的创建-->
     <bean id="team1" class="com.jinhuan.pojo.Team"></bean>
     <bean id="team2" class="com.jinhuan.pojo.Team"></bean>
 ​
     <!--非自定义对象的创建-->
     <bean id="date" class="java.util.Date"></bean>
 ​
     <!--Scope讲解
         Scope:
             prototype 表示是单例的(默认值)在容器启动的时候就被创建了,而且容器中的对象唯一
             singleton 表示多例 在容器启动的时候没有被创建,什么时候使用了,什么时候被创建,每次获取的时候都是【新对象】!!!
     -->
     <bean id="team3" name="team3" class="com.jinhuan.pojo.Team" scope="prototype" ></bean>
     <bean id="team4" name="team4" class="com.jinhuan.pojo.Team" scope="singleton"></bean>
 ​
     <!--关于lazy-init 针对单例对象使用,因为多例的对象本身就是被获取的时候才创建
         true:真的懒 只在对象被获取的时候创建
         false: 假的懒 不管对象是否被获取都在容器启动的时候加载
         default:false
     -->
     <bean id="team5" name="team5" class="com.jinhuan.pojo.Team" scope="singleton" lazy-init="true"></bean>
 ​
     <!--【对象的声明周期有关的方法】init-method与destroy-method
         init-method:表示对象一旦被创建就立马执行该方法
         destroy-method:表示spring容器调用关闭方法区销毁对象的时候,立即执行该方法
     -->
     <bean id="team6" name="team6" class="com.jinhuan.pojo.Team" scope="singleton" init-method="init" destroy-method="destory"></bean>
 ​
 ​
 </beans>

Spring创建对象的三种方式

1、通过默认的构造方法

2、通过带参数的构造方法

3、通过工厂方法

createType.xm

 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 ​
     <!--Spring创建对象的三种方式
         1、通过默认的构造方法
         2、通过带参数的构造方法
         3、通过工厂方法
     -->
     <!--通过默认的构造方法-->
     <bean id="team1" class="com.jinhuan.pojo.Team"></bean>
 ​
     <!--通过带参数的构造方法
         1、对象必须有含参构造
         2、调用那个含参的构造方法,其参数要写完整
             可以用index代替name,index从0开始,表示参数的下标
             name表示参数的名字
     -->
     <bean id="team2" class="com.jinhuan.pojo.Team">
         <constructor-arg name="id" value="1"/>
         <constructor-arg name="name" value="勇士"/>
         <constructor-arg name="location" value="金州"/>
     </bean>
     <bean id="team3" class="com.jinhuan.pojo.Team">
         <constructor-arg index="0" value="2"/>
         <constructor-arg index="1" value="热火"/>
         <constructor-arg index="2" value="迈阿密"/>
     </bean>
 ​
     <!--通过工厂方法
         1、静态方法  相当于Team staticTeam = MyFactory.staticInit();
         2、实例方法  相当于MyFactory myFactory = new MyFactory();
                         Team instanceTeam = myFactory.instanceInit();
     -->
     <!--静态方法
         注意此处的Class变成了工厂 Factory
     -->
     <bean id="staticTeam" class="com.jinhuan.pojo.MyFactory" factory-method="staticInit"/>
 ​
     <!--实例方法
        先创建工厂,在创建实例-调用方法
     -->
     <bean id="factory" class="com.jinhuan.pojo.MyFactory"/>
     <bean id="instanceTeam" factory-bean="factory" factory-method="instanceInit"/>
 </beans>

MyFactory

 package com.jinhuan.pojo;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/5/9 18:15
  * Description:实体类工厂
  */
 public class MyFactory {
     /**
      * 静态方法
      * */
     public static Team staticInit(){
         System.out.println("Static---------Init()");
         return new Team(1001,"灰熊","孟菲斯");
     }
     /**
      * 实例方法
      * */
     public Team instanceInit(){
         System.out.println("Instance---------Init()");
         return new Team(1002,"雄鹿","密尔沃基");
     }
 ​
 ​
     public static void main(String[] args) {
         //测试MyFactory
         //获取静态对象
         Team staticTeam = MyFactory.staticInit();
 ​
         //获取实例对象
         MyFactory myFactory = new MyFactory();
         Team instanceTeam = myFactory.instanceInit();
     }
 ​
 }
 ​

Team

 package com.jinhuan.pojo;
 ​
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/5/9 15:39
  * Description:球队的实体类
  */
 @Component
 public class Team {
     @Value("8080")
     private Integer id;
     @Value("公牛")
     private String name;
     @Value("芝加哥")
     private String location;
 ​
     public void init(){
         System.out.println("Team....init().....");
     }
 ​
     public void destory(){
         System.out.println("Team....destory().....");
     }
 ​
     public Team() {
         System.out.println("无参数的构造方法: id->"+id+";name->"+name+";location->"+location);
     }
 ​
     public Team(Integer id, String name, String location) {
         this.id = id;
         this.name = name;
         this.location = location;
         System.out.println("带参数的构造方法: id->"+id+";name->"+name+";location->"+location);
     }
 ​
     @Override
     public String toString() {
         return "Team{" +
                 "id=" + id +
                 ", name='" + name + ''' +
                 ", location='" + location + ''' +
                 '}';
     }
 }
 ​

CreateTypeTest

 package com.jinhuan.test;
 ​
 import com.jinhuan.pojo.Team;
 import org.junit.Test;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/2 22:34
  * Description:测试对象的三种创建方式
  */
 public class CreateTypeTest {
     @Test
     public void test01(){
         //获取容器
         ApplicationContext ac = new ClassPathXmlApplicationContext("createType.xml");
         Team team1 = (Team) ac.getBean("team1");
         Team team2 = (Team) ac.getBean("team2");
 ​
     }
 }
 ​

image-20220702230528590