Spring 自动装配Bean
Spring 自动装配Bean
1.搭建环境:
新建三个类
Cat:
public class Cat { public void shout(){ System.out.println("喵"); } }
Dog:
public class Dog { public void shout(){ System.out.println("汪"); } }
Person:
public class Person { private Cat cat; private Dog dog; private String 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; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person{" + "cat=" + cat + ", dog=" + dog + ", name='" + name + '\'' + '}'; } }
在容器中普通配置下类:
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="cat" class="com.xiaofu.pojo.Cat"/> <bean id="dog" class="com.xiaofu.pojo.Dog"/> <bean id="person" class="com.xiaofu.pojo.Person"> <property name="name" value="xiaofu"/> <property name="cat" ref="cat"/> <property name="dog" ref="dog"/> </bean> </beans>
测试一下:
import com.xiaofu.pojo.Person; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Text { public static void main(String[] args) { //获取spring的上下文对象 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Person person = (Person) context.getBean("person"); person.getCat().shout(); person.getDog().shout(); } }
运行程序:
person类正常使用了cat和dag的方法 但这样还是有点麻烦 自动装配就会简单很多。
2.ByName自动装配:
把下面的cat和dog的配置删掉 加上一句 autowire="byName" 运行测试类:
还是拿到了 Cat和Dog类的方法 为什么呢?
autowire="byName"会自动在容器上下文中查找 和自己对象set方法后面值对应的 bean id
由于我们这里配置了 cat和dog 所以就自动将这两个属性 配置到了 person中
如果id名字不对应 那么就会报错
3.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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="cat2" class="com.xiaofu.pojo.Cat"/> <bean id="dog2" class="com.xiaofu.pojo.Dog"/> <bean id="person" class="com.xiaofu.pojo.Person" autowire="byType"> <property name="name" value="xiaofu"/> </bean> </beans>
autowire="byType" 会在容器上下文中找和自己对象属性 相同的bean
所以这里的id可以不同 但后面的类属性相同同样可以使用
运行测试类:
同样运行了方法。
4.注解实现自动装配:
要使用注解要先导入 约束:
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 开启注解支持--> <context:annotation-config/> </beans>
先简单绑定一下刚刚的类
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 开启注解支持--> <context:annotation-config/> <bean id="cat" class="com.xiaofu.pojo.Cat"/> <bean id="dog" class="com.xiaofu.pojo.Dog"/> <bean id="person" class="com.xiaofu.pojo.Person"/> </beans>
4.1 @Autowired 完成自动装配:
只要容器中绑定了类 只需要在类的属性 或者set方法上 加上这个注释 就可以完成 自动装配(要注意的是 容器中bean id 的名字要一致)
4.12 @Qualifier完成自动装配:
@Qualifier 是和@Autowired配合使用的 目的就是解决属性名和bean id 不一致的处理