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

spring基础系列之JavaConfig配置详解

程序员文章站 2023-10-22 16:37:46
早以前,spring推荐使用xml的方式来定义bean及bean之间的装配规则,但是在spring3之后,spring提出的强大的javaconfig这种类型安全的bean...

早以前,spring推荐使用xml的方式来定义bean及bean之间的装配规则,但是在spring3之后,spring提出的强大的javaconfig这种类型安全的bean装配方式,它基于java代码的灵活性,使得装配的过程也变得及其灵活。

使用javaconfig来装配bean拥有其自己的一套规则,我们在这里来看一看:

1、规则

规则一:@configuration注解

我们在定义javaconfig类时,都会在其上加注@configuration注解,来表明这是一个配置类,@configuration注解底层是@component注解,而且这个注解会被annotationconfigapplicationcontext来进行加载,annotationconfigapplicationcontext是applicationcontext的一个具体实现,代表依据配置注解启动应用上下文。

规则二:@componentscan注解

我们使用javaconfig的目的是为了实现以前xml配置实现的功能,首先就是组件扫描功能,将我们使用特定注解标注的类统一扫描加载到spring容器,这一功能就是依靠@componentscan注解来实现的,我们可以为其指定位置参数来指定要扫描的包。

规则三:@bean注解

使用@bean注解我们可以实现xml配置中手动配置第三方bean的功能,这里我们使用方法来定义bean,并在方法前面加注@bean注解,表示要将该方法返回的对象加载到spring容器中,这样就对我们的方法定义带来了一些限制,这些限制包括方法的大概格式:

1-方法带返回值,且返回类型为你要加载的第三方类类型

2-方法的名称为默认的bean的name,如果要自定义bean的name,可以使用@bean注解的name属性。

3-要实现注入只需要将要注入的bean的类型作为参数,调用该类的带参数的构造器构建这个bean,或者采用第二种方式:先创建这个类的对象,然后调用该对象的set方法进行注入,以被注入的bean的方法为参数

规则验证:

首先我们创建几个测试类

针对第一种注入方式:

1-studentservice

import org.springframework.stereotype.service;

@service
public class studentservice {
  public void study(){
    system.out.println("学生学习java");
  }
}

2-teacherservice

import org.springframework.stereotype.service;

@service
public class teacherservice {
  
  private studentservice studentservice;
  
  public teacherservice(studentservice studentservice){
    this.studentservice=studentservice;
  }
  
  public void teach(){
    studentservice.study();
  }
}

3-config:这是针对第一种注入方式而设,需要在teacherservice 中定义带参数的构造器

import org.springframework.context.annotation.bean;
//import org.springframework.context.annotation.componentscan;
import org.springframework.context.annotation.configuration;

@configuration
//@componentscan
public class config {
  
  @bean(name="student")
  public studentservice studentservice(){
    return new studentservice();
  }
  
  @bean(name="teacher")
  public teacherservice teacherservice(studentservice studentservice){
    return new teacherservice(studentservice);
  }
  
}

针对第二种注入方式:

1-studentservice

public class studentservice {
  
  public void study(){
    system.out.println("学生在学习java");
  }
  
}

2-teacherservice

public class teacherservice {
    
  private studentservice studentservice;

  public studentservice getstudentservice() {
    return studentservice;
  }

  public void setstudentservice(studentservice studentservice) {
    this.studentservice = studentservice;
  }
  
  public void teach(){
    studentservice.study();
  }
  
}

3-config:这是采用第二种注入方式:需要在teacherservice中提供set方法

import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;

@configuration
public class config {
  
  @bean
  public studentservice student(){
    return new studentservice();
  }
  
  @bean
  public teacherservice teacher(){
    teacherservice teacherservice = new teacherservice();
    teacherservice.setstudentservice(student());
    return teacherservice;
  }
  
}

4-测试类:testmain

import java.util.iterator;

import org.springframework.context.annotation.annotationconfigapplicationcontext;

public class testmain {

  public static void main(string[] args) {
    annotationconfigapplicationcontext acac = new annotationconfigapplicationcontext(config.class);
    teacherservice teacher = acac.getbean(teacherservice.class);
    teacher.teach();
    iterator<string> i = acac.getbeanfactory().getbeannamesiterator();
    while(i.hasnext()){
      system.out.println(i.next());
    }
    acac.close();
  }

}

执行结果:

七月 14, 2017 4:10:56 下午 org.springframework.context.annotation.annotationconfigapplicationcontext preparerefresh
信息: refreshing org.springframework.context.annotation.annotationconfigapplicationcontext@7e6cbb7a: startup date [fri jul 14 16:10:56 cst 2017]; root of context hierarchy
学生学习java
org.springframework.context.annotation.internalconfigurationannotationprocessor
org.springframework.context.annotation.internalautowiredannotationprocessor
org.springframework.context.annotation.internalrequiredannotationprocessor
org.springframework.context.annotation.internalcommonannotationprocessor
org.springframework.context.event.internaleventlistenerprocessor
org.springframework.context.event.internaleventlistenerfactory
config
student
teacher
environment
systemproperties
systemenvironment
org.springframework.context.annotation.configurationclasspostprocessor.importregistry
messagesource
applicationeventmulticaster
lifecycleprocessor
七月 14, 2017 4:10:59 下午 org.springframework.context.annotation.annotationconfigapplicationcontext doclose
信息: closing org.springframework.context.annotation.annotationconfigapplicationcontext@7e6cbb7a: startup date [fri jul 14 16:10:56 cst 2017]; root of context hierarchy

该测试结果中打印出的是spring上下文中所有加载的bean的名称(name)。

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