Springbean的几种注入方式都了解吗

2022-10-09,,,

spring注入方式可以分为三类,xml注入、注解注入、beandefinition注入;用法上可以分为三种,但是底层实现代码都是统一beanfactory,这三种也有联系xml注入和annotation注入都是依赖beandefinition扩展的接口,注解也是从xml过渡过来的,我们简单的看下这三种的写法。

xml注入

在springboot框架没有出来之前,xml配置被大量的使用,配置过程比较繁琐,但是对代码的侵入性较小,配置和代码分离操作。

实体定义

定义两个属性id,name,并实现get/set方法,重写tostring方法,方便看打印结果。

public class userxml {
  private string id;
  private string name;

  public string getid() {
    return id;
  }

  public void setid(string id) {
    this.id = id;
  }

  public string getname() {
    return name;
  }

  public void setname(string name) {
    this.name = name;
  }

  @override
  public string tostring() {
    return "user{" 
        "id='"  id  '\'' 
        ", name='"  name  '\'' 
        '}';
  }
}

xml定义

在resources下新建目录meta-inf下建spring-bean.xml文件,并填充对应的bean配置,bean需要配置id或者name值,ioc容器唯一即可,class配置定义的实体路径,对应的property设置初始化属性。

<?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
    https://www.springframework.org/schema/beans/spring-beans.xsd">
  <bean id="user" class="cn.cnzcb.spring.bean.userxml">
    <property name="id" value="11"/>
    <property name="name" value="java圈"/>
  </bean>
</beans>

输出

创建一个beanfactory对象,用classpathxmlapplicationcontext实例化,简单说一下beanfactory作为ioc容器的底层基础,可以说ioc容器就是beanfactory,classpathxmlapplicationcontext是ioc容器的功能扩展;classpathxmlapplicationcontext需要传入资源文件的路径,在通过getbean方法获取具体的实体类,就是结果输出。

 //xml注入
    beanfactory classpathxmlapplicationcontext = new classpathxmlapplicationcontext("classpath:/meta-inf/spring-bean.xml");
    userxml userxml = classpathxmlapplicationcontext.getbean(userxml.class);
    system.out.println("userxml xml注入对象:"  userxml);

注解注入

注解是在spring2.0.3之后才出现的,大量应用也是在springboot的普及下,大家才慢慢接受。其主要好处就是操作简单,通过简单的注解就可以标识成bean组件,而且扩展了各种层次的注解,比如@service、@service、@repository,都是基于@component注解实现派生。

实体定义

实体通xml实体作用类似,这里新建一个类,用去区分不同的bean实现方式。

public class userannotation {
  private string id;
  private string name;

  public string getid() {
    return id;
  }

  public void setid(string id) {
    this.id = id;
  }

  public string getname() {
    return name;
  }

  public void setname(string name) {
    this.name = name;
  }

  @override
  public string tostring() {
    return "user{" 
        "id='"  id  '\'' 
        ", name='"  name  '\'' 
        '}';
  }

注解配置

正常情况下我们是通过标准注解@configuration进行扫描注入,我们这里直接配置类即可,在这个类里面实例化bean组件,并进行初始化操作。

@configuration
public class userconfiguration {
  @bean
  public userannotation userannotation(){
    userannotation userannotation = new userannotation();
    userannotation.setid("11");
    userannotation.setname("java圈");
    return userannotation;
  }
}
 

输出

annotationconfigapplicationcontext也是beanfactory的一种实现,和classpathxmlapplicationcontext功能类似,只是加载渠道不一样,把定义的配置类注册到ioc容器,调用register方法,这里需要注意,下一步需要调refresh方法就行bean的装载工作,然后通过getbean获取具体的实体,就行输出。

 //注解注入
    annotationconfigapplicationcontext annotationconfigapplicationcontext = new annotationconfigapplicationcontext();
    annotationconfigapplicationcontext.register(userconfiguration.class);
    annotationconfigapplicationcontext.refresh();
    userannotation userannotation = annotationconfigapplicationcontext.getbean(userannotation.class);
    system.out.println("userannotation注解注入" userannotation);
 

beandefinition注入

beandefinition是beanfactory的底层实现,包括上面提到的方式,底层也是基于beandefinition实现的,一个bean组件对应一个beandefinition,但是实际操作过程中不会这个用,只是仅供参考。

实体定义

实体通xml实体作用类似,这里新建一个类,用去区分不同的bean实现方式。

public class userbeandefinition {
  private string id;
  private string name;

  public string getid() {
    return id;
  }

  public void setid(string id) {
    this.id = id;
  }

  public string getname() {
    return name;
  }

  public void setname(string name) {
    this.name = name;
  }

  @override
  public string tostring() {
    return "user{" 
        "id='"  id  '\'' 
        ", name='"  name  '\'' 
        '}';
  }
}

输出

通过beandefinitionbuilder的genericbeandefinition实例化一个构造器,传入的参数就是实体类,构建之后做初始化操作,之后beandefinition声明调用getbeandefinition方法,通过getpropertyvalues回去bean的具体参数进行结束输出。

//beandefinition注入
    beandefinitionbuilder definitionbuilder = beandefinitionbuilder.genericbeandefinition(userbeandefinition.class);
    definitionbuilder.addpropertyvalue("id", "11");
    definitionbuilder.addpropertyvalue("name", "java圈");
    beandefinition beandefinition = definitionbuilder.getbeandefinition();
    string beanclassname = beandefinition.getbeanclassname();
    mutablepropertyvalues mutablepropertyvalues = beandefinition.getpropertyvalues();
    string id = mutablepropertyvalues.getpropertyvalue("id").getvalue().tostring();
    string name = mutablepropertyvalues.getpropertyvalue("name").getvalue().tostring();
    system.out.println("beandefinition注入对象userbeandefition{id="  id ",name=" name "}");
 

结果输出

输出结果分别是xml注入、annotation注入,beandefinition注入。

userxml xml注入对象:user{id='11', name='java圈'}
userannotation注解注入user{id='11', name='java圈'}
beandefinition注入对象userbeandefition{id=11,name=java圈}
 

源代码:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

《Springbean的几种注入方式都了解吗.doc》

下载本文的Word格式文档,以方便收藏与打印。