欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-18 09:37:37
spring注入方式可以分为三类,xml注入、注解注入、beandefinition注入;用法上可以分为三种,但是底层实现代码都是统一beanfactory,这三种也有联系xml注入和...

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圈}
 

源代码:

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