Autowired:自动装配
要使用注解,首先必须开启注解支持,再beans.xml中添加以下字段
<!-- 开启注解的支持-->
<context:annotation-config/>
编写三个实体类
Cat
public class Cat {
public void shout(){
System.out.println("miao~");
}
}
Dog
public class Dog {
public void shout(){
System.out.println("wang~");
}
}
People
package com.kk.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuppressWarnings("all")
public class People {
//@Resource也可以
/**
* @Autowired 通过byName方式实现,必须要求这个对象存在
* @Resource 默认通过byName方式实现,如果找不到名字,则通过byType方式实现
* @Qualifier 给这个注入的类指定特定的名称
* 执行顺序不同
*/
@Autowired
@Qualifier(value = "cat111")
private Cat cat;
@Autowired
@Qualifier(value = "dog")
private Dog dog;
private String name;
}
beans.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解的支持-->
<context:annotation-config/>
<bean id="cat111" class="com.kk.pojo.Cat"/>
<bean id="dog" class="com.kk.pojo.Dog"/>
<!-- autowire 自动装配
byName :会自动在容器上下文中查找和自己对象set方法后面的值 对应的beanid
byType:会自动在容器上下文中查找和自己对象属性类型(class)(com.kk.pojo.Cat)相同的bean 必须保证类型全局唯一
-->
<!-- <bean id="people" class="com.kk.pojo.People" autowire="byType">-->
<!-- <property name="name" value="赵六"/>-->
<!-- <property name="dog" ref="dog"/>-->
<!-- <property name="cat" ref="cat111"/>-->
<!-- </bean>-->
<bean id="people" class="com.kk.pojo.People">
<!-- 给People类中的属性name赋值 qx-->
<property name="name" value="qx"/>
</bean>
</beans>
测试:
public class Test {
@org.junit.Test
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
People people = context.getBean("people", People.class);
System.out.println(people.getName());
people.getDog().shout();
people.getCat().shout();
}
}
当我们没有使用@Autowired注解的时候,我们使用传统的方法
<bean id="cat111" class="com.kk.pojo.Cat"/>
<bean id="dog" class="com.kk.pojo.Dog"/>
<bean id="people" class="com.kk.pojo.People" autowire="byType">
<property name="name" value="赵六"/>
<property name="dog" ref="dog"/>
<property name="cat" ref="cat111"/>
</bean>
autowire里边的参数有两个选项:
byName :会自动在容器上下文中查找和自己对象set方法后面的值,即对应的bean中的id
byType :会自动在容器上下文中查找和自己对象属性类型(class)(com.kk.pojo.Cat)相同的bean 必须保证类型全局唯一
当我们使用@Autowired注解
我们需要在people类中加上以下注解,其中@Qualifier是标注这个类在spring容器中的名字,需要一一对应
@Autowired
@Qualifier(value = "cat111")
private Cat cat;
@Autowired
@Qualifier(value = "dog")
private Dog dog;
<!-- 开启注解的支持-->
<context:annotation-config/>
<bean id="cat111" class="com.kk.pojo.Cat"/>
<bean id="dog" class="com.kk.pojo.Dog"/>
<bean id="people" class="com.kk.pojo.People"/>
总结:Autowired的作用是什么?
Autowired自动装配:在People实体类中,如果我们想要调用Cat以及Dog的方法,只需将他们的类编写进来,然后在方法上加上@Autowired注解,并且在beans.xml中将它们注入到spring容器中,交给spring托管,这时我们就可以使用实体类People去调用Cat和Dog里边的方法。
相当于我们在实体类中编写实体类的方法并且使用set
@Qualifier:给bean声明一个特有的名字