自动装配是Spring满足bean依赖的一种方式!
Spring会在上下文中自动寻找,并自动给bean装配属性!
在Spring中有三种装配的方式:
1.在xml中显式的配置
pojo类
public interface makevoice { public void makevoice(); }
/** * @author 王广元 */ @Data public class Cat implements makevoice{ @Override public void makevoice() { System.out.println("miao miao"); } }
/** * @author 王广元 */ @Data public class Dog implements makevoice{ @Override public void makevoice() { System.out.println("wang wang"); } }
@Data @NoArgsConstructor public class People { private Cat cat; private Dog dog; private String name; }
ApplicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="cat" class="com.wang.pojo.Cat"/> <bean id="dog" class="com.wang.pojo.Dog"/> <bean id="people" class="com.wang.pojo.People" p:cat-ref="cat" p:dog-ref="dog" p:name="王广元"/> </beans>
单元测试
@Test public void test01(){ ClasspathXmlApplicationContext context = new ClasspathXmlApplicationContext("ApplicationContext.xml"); Object people = context.getBean("people"); System.out.println(people.toString()); }
//测试结果:People(cat=Cat(), dog=Dog(), name=王广元)
2.在java中显示配置
3.隐式地自动装配bean【重要】
1.byName
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="cat" class="com.wang.pojo.Cat"/> <bean id="dog" class="com.wang.pojo.Dog"/> <bean id="people1" class="com.wang.pojo.People" autowire="byName"> <property name="name" value="poeple1_autowire_byName"/> </bean> </beans>
我们通过设置autowire参数,此时为byName,通过注册bean的id实现自动装配,spring容器会自动在容器上下文中查找和自己对象set方法后面的值对应的bean id,
找到id=cat and id=dog的bean,并将其装配到id=people1的bean中
单元测试
@Test public void test03(){ ClasspathXmlApplicationContext context = new ClasspathXmlApplicationContext("ApplicationContext.xml"); People people1 = (People) context.getBean("people1"); System.out.println(people1.toString()); }
//测试结果:People(cat=Cat(), dog=Dog(), name=poeple1_autowire_byName)
2.byType
<!-- bytype:会自动查找容器上下文中,和自己对象属性相同的bean--> <bean id="people2" class="com.wang.pojo.People" autowire="byType"> <property name="name" value="people+autowire_bytype"/> </bean>
缺点:bean上下文中只允许注册class类的一个bean,当注册多个时,会报错
单元测试
@Test public void test02(){ ClasspathXmlApplicationContext context = new ClasspathXmlApplicationContext("ApplicationContext.xml"); People people2 = (People) context.getBean("people2"); System.out.println(people2.toString()); }
小结:
- byname的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set的值保持一致!
- byname的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型保持一致!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。