时间:2021-05-19
Bean常用的装配方式有3种:
基于xml的装配
在xml文件中配置Bean。
如果依赖很多,xml配置文件会很臃肿,后期维护、升级不方便。自动装配可解决这一问题。
基于xml的自动装配
在<bean>中使用autowired属性完成依赖的自动装配,不再使用<property>手动注入setter方法中的依赖,简化了配置,减少了xml中的代码量。
autowire属性的属性值:
1、byName
示例:
class Student{ private String name; public Student(String name){ this.name=name; } public String getName(){ return name; }}class Teacher{ private Student student; public void setStudent(Student student) { this.student = student; } public void say(){ System.out.println(student.getName()+",叫家长来一下。"); }}Teacher依赖于Student,依赖的对象要写成成员变量的形式。如果要使用自动装配,依赖对象的注入只能使用setter方式。
byName,name指的是setXxx()注入依赖的那个xxx,比如setStudent(Student student),name指的是student,将set后面的部分提出来,变成Camel写法。name不是指形参名的student。
xml中的配置:
<bean id="student" class="my_package.Student"><constructor-arg value="张三" /></bean><bean id="teacher" class="my_package.Teacher" autowire="byName" />第一个Bean是基于xml的普通装配,第二个Bean的配置是byName形式的自动装配。
byName自动装配的执行过程:在这个Bean的定义中,找到setter方法,这里是setStudent(),其name是student(set后面部分提出来,变成Camel写法),根据这个name(student)找打到id/name是student的Bean实例,将这个实例自动注入。
所以对<bean>的id/name、setter方法的命名有严格要求。
原本是要用<property name ref="" />子元素注入依赖的,如果依赖较多,会写一大堆<property>子元素。自动装配,不管这个一Bean有多少个依赖,一句代码搞定,减少了代码量,由Spring容器自动注入依赖。但Spring容器要做更多的工作,装配速度会变慢。
说明:自动装配只能完成setter形式的依赖注入,不能完成构造器方式的依赖注入,且只能注入其它Bean,不能注入String、数组、集合等Java自带的类型。
测试代码:
public class Test { public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); Teacher teacher=applicationContext.getBean("teacher",Teacher.class); teacher.say(); }}运行,控制台打印出"张三,叫家长来一下。"。
2、byType
根据要注入的Bean的类型来自动装配。
在上面的例子中,setStudent(Student student),要注入的依赖是Student类型的实例。
byType自动装配的执行过程:在这个Bean的定义中,找到setter方法,找到setter方法要注入的Bean的类型(Student),在Spring容器中找到Student类型的实例,注入。
如果Spring容器中该依赖有多个配置,比如:
<bean id="student" class="my_package.Student"> <constructor-arg value="张三" /> </bean> <bean id="student1" class="my_package.Student"> <constructor-arg value="李四" /> </bean>它们都是Student这个Bean的配置,Spring容器不知道要注入的依赖是哪一个,会报错,所以依赖的bean只能有一个配置。
这种是可以的:
<bean id="student" class="my_package.Student" scope="prototype"><constructor-arg value="张三" /></bean>虽然Spring容器中可能有这个Bean的多个实例,但这些实例是一样的。
示例:
将byName示例中的xml中的配置修改如下即可
<bean id="student" class="my_package.Student"><constructor-arg value="张三" /></bean><bean id="teacher" class="my_package.Teacher" autowire="byType" />3、constructor
class Student{ public String getName(){ return "张三"; }}class Teacher{ private Student student; public Teacher(Student student){ this.student=student; } public void say(){ System.out.println(student.getName()+",叫家长来一下。"); }}需要用构造器注入依赖,Spring容器会自动根据构造器中参数类型,用byType方式注入对应类型的依赖。
只能有一个构造器,否则Spring容器不知道使用哪个构造器。
xml中的配置:
<bean id="student" class="my_package.Student" /><bean id="teacher" class="my_package.Teacher" autowire="constructor" />4、default
自动装配简化了配置,减少了代码量,但需要Spring容器做更多的工作,所以创建Bean的速度要慢一些。
基于Java配置类的装配
不使用xml文件配置Bean,而是单独写一个类来配置Bean。
class Student{ private String name; public Student(String name){ this.name=name; } public String getName(){ return name; }}class Teacher{ private Student student; public Teacher(Student student){ this.student=student; } public void say(){ System.out.println(student.getName()+",叫家长来一下。"); }}@Configuration //表示这个类是用来配置Bean的class Config{ @Value("张三") String name; //创建一个成员变量,相当于String name="张三"; @Bean(name = "student") //配置一个Bean,相当于xml中的一个<bean> public Student student(){ Student student=new Student(name); //创建并返回Bean的实例。 return student; } @Bean(name = "teacher") public Teacher teacher(){ return new Teacher(student()); //创建并返回Bean的实例,因为写了构造器,所以可以直接构造器注入依赖。可直接调用本类中的其它方法创建依赖的实例,注入。 } }public class Test { public static void main(String[] args) { ApplicationContext applicationContext=new AnnotationConfigApplicationContext(Config.class); //注意,和xml配置不同。参数是配置类。 Teacher teacher=applicationContext.getBean("teacher",Teacher.class); teacher.say(); }}上面的例子是通过构造器初始化Bean,也可以写setter方法,通过setter方法初始化Bean:
class Student{ private String name; public void setName(String name){ this.name=name; } public String getName(){ return name; }}class Teacher{ private Student student; public void setStudent(Student student){ this.student=student; } public void say(){ System.out.println(student.getName()+",叫家长来一下。"); }}@Configurationclass Config{ @Value("张三") String name; @Bean(name = "student") public Student student(){ Student student=new Student(); student.setName(name); return student; } @Bean(name = "teacher") public Teacher teacher(){ Teacher teacher=new Teacher(); teacher.setStudent(student()); return teacher; }}基于Java配置类的装配,会将Bean的配置耦合到应用代码中,不推荐使用。基于Java配置类的注解还有其它的,此处不再介绍。
使用xml文件配置Bean,是为了解耦,但随着Bean的增多,xml文件越来越臃肿,所以一般是折中使用注解+xml文件的方式。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
自动装配是Spring满足Bean依赖的一种方式;Spring会在context中自动寻找,并自动给bean装配属性;在Spring中有三种装配的方式:在xml
前言这段时间在学习Spring,依赖注入DI和面向切面编程AOP是Spring框架最核心的部分。这次主要是总结依赖注入的bean的装配方式。什么是依赖注入呢?也
何为自动装配自动装配是Spring满足bean依赖的一种方式。在使用Spring配置bean时,我们都要给配置的bean的属性设置一个值,如果不手动设置则都是空
我最近在研究Spring框架的路上,那么今天也算个学习笔记吧!学习一下如何实现Bean的装配方法Bean的简介Java开发者一般会听过JavaBean这个概念,
早以前,Spring推荐使用XML的方式来定义Bean及Bean之间的装配规则,但是在Spring3之后,Spring提出的强大的JavaConfig这种类型安