自动装配是Spring满足Bean依赖的一种方式!
Spring会在上下文中自动寻找,并自动给Bean装配属性!
在Spring中有三种装配的方式
在xml中显式的配置
在java中显式的装配
隐式的自动装配Bean [重要]
2. 测试1. 环境搭建一个人有两个宠物
package com.wang.pojo;public class Cat { public voID shout() { System.out.println("miao ~"); }}
package com.wang.pojo;public class Dog { public voID shout() { System.out.println("wang ~"); }}
package com.wang.pojo;public class People { private String name; private Cat cat; private Dog dog; public String getname() { return name; } public voID setname(String name) { this.name = name; } public Cat getCat() { return cat; } public voID setCat(Cat cat) { this.cat = cat; } public Dog getDog() { return dog; } public voID setDog(Dog dog) { this.dog = dog; } @OverrIDe public String toString() { return "People{" + "name='" + name + '\'' + ",cat=" + cat + ",dog=" + dog + '}'; }}
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean ID="cat" /> <bean ID="dog" /> <bean ID="people" > <property name="name" value="wang sky"/> <property name="dog" ref="dog"/> <property name="cat" ref="cat"/> </bean></beans>
2. Byname与ByType自动装配<?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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean ID="cat" /> <bean ID="dog" /> <!-- byname: 会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanID byType: 会自动在容器上下文中查找,和自己对象属性类型相同的bean --> <bean ID="people" autowire="byType"> <property name="name" value="wang sky"/> </bean></beans>
3. 小结byname的时候,需要保证所有的bean的ID唯一,并且这个bean需要和自动注入的属性的名称一致byType的时候,需要保证所有的bean的class唯一,并且这个bean需要和自动注入的属性的类型一致4. 使用注解实现自动装配要使用注解须知:
1. 导入约束xmlns:context="http://www.springframework.org/schema/context"http://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"
2. 配置注解的支持<context:annotation-config/>
3. @autowired直接在属性上使用即可!
也可以在setter方式上使用!
使用autowired我们可以不用编写Setter方法了,前提是你这个自动装配的属性在IOC(Spring)容器中存在,且符合类型byType!
@Nullable标记的属性,说明这个属性可以为null(可以不给传参数)
@autowired(required = false) : 如果显式的定义了autowired的required属性为false,说明这个对象可以为null,否则不允许为空
如果@autowired自动装配的环境比较复杂,无法通过一个@autowired注解实现自动装配的时候,我们可以使用@QualifIEr(value = "xxx")去配置(value为ID的值)@autowired的使用,指定唯一的bean对象注入!
package com.wang.pojo;import org.springframework.beans.factory.annotation.autowired;import org.springframework.beans.factory.annotation.QualifIEr;public class People { private String name; @autowired private Cat cat; @autowired @QualifIEr(value = "dog222") private Dog dog; public String getname() { return name; } public voID setname(String name) { this.name = name; } public Cat getCat() { return cat; } public voID setCat(Cat cat) { this.cat = cat; } public Dog getDog() { return dog; } public voID setDog(Dog dog) { this.dog = dog; } @OverrIDe public String toString() { return "People{" + "name='" + name + '\'' + ",dog=" + dog + '}'; }}
3. @Resource注解属于javax.annotation包,与自动装配类似
jdk1.8以上是不支持@Resource注解的
解决方法:
在使用Spring注解开发中,使用@Resource报空指针异常时有两个解决方案:
使用jdk8
在Maven中导入如下依赖
<dependency> <groupID>javax.annotation</groupID> <artifactID>javax.annotation-API</artifactID> <version>1.2</version></dependency>
4. 小结@Resource与@autowired的区别
@autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。@autowired 通过byType的方式实现
@autowired默认按类型装配(这个注解是属于Spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required
属性为false,如:@autowired(required=false) ,如果我们想使用名称装配可以结合@QualifIEr注解进行使用
@Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上
时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但
是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。(先byname 再byType)
总结以上是内存溢出为你收集整理的Bean的自动装配全部内容,希望文章能够帮你解决Bean的自动装配所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)