spring基础系列之JavaConfig配置详解
早以前,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)。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
详解Spring Data JPA系列之投影(Projection)的用法
-
Spring之WEB模块配置详解
-
Spring实战之XML与JavaConfig的混合配置详解
-
spring基础系列之JavaConfig配置详解
-
详解Spring Data JPA系列之投影(Projection)的用法
-
Spring实战之XML与JavaConfig的混合配置详解
-
spring基础系列之JavaConfig配置详解
-
荐 Android面试基础之ContentProvider详解(斗帝养成系列三)
-
SpringCloud学习系列之四-----配置中心(Config)使用详解
-
spring boot 系列之六:@Conditional和spring boot的自动配置