自动装配Bean
自动装配Bean是Spring满足bean依赖的一种方式
Spring会在上下文中自动寻找,并自动给bean装配属性
三种装配Bean
- 1、在xml中显式装配 在之前的配置都是用xml显式装配
- 2、在java中显式装配
- 3、隐式的自动装配bean
环境搭建
实体类
package com.my.pojo;
public class Cat {
public void shout(){
System.out.println("miaomiao");
}
}
public class Dog {
public void shout(){
System.out.println("wangwang");
}
}
package com.my.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" class="com.my.pojo.Cat"/>
<bean id="dog" class="com.my.pojo.Dog"/>
<bean id="people" class="com.my.pojo.People">
<property name="name" value="奥特曼"/>
<property name="dog" ref="dog"/>
<property name="cat" ref="cat"/>
</bean>
</beans>
测试运行
import com.my.pojo.People;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
People people = context.getBean("people", People.class);
people.getDog().shout();
people.getCat().shout();
}
}
wangwang
miaomiao
java中显式装配
完全不使用Spring配置,全权交给java实现
JavaConfig是Spring的一个子项目:在Spring4之后成为一个核心功能
package com.my.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
// 等价于在配置文件中的<bean id="user" class="com.my.pojo.User"/>
@Component
public class User {
@Value("lalalala")
public String name ;
}
package com.my.config;
import com.my.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
@Bean
public User getUser(){
return new User();
}
}
import com.my.config.MyConfig;
import com.my.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MyTest {
@Test
public void Test(){
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
User user = (User) context.getBean("getUser");
System.out.println(user.getName());
}
}
@Configuration
这个也会被Spring容器托管,注册到容器中,因为他本来就是一个@Component,@Configuration代表这是一个配置类和之前的beans.xml是一样的
隐式的自动装配bean
byName自动装配
会自动在容器上下文中查找和自己对象set方法后面的值对应的beanId且beanId唯一
byType自动装配
会自动在容器上下文中查找和自己对象属性类型相同的bean但是要保证类型全局唯一
@Resource和@ Autowired的区别
- ·都是用来自动装配的。都可以放在属性字段上
- · Autowired通过byType的方式实现,而且必须要求这个对象存在!【常用】
- .Resource默认通过byname的方式实现,如果找不到名字,则通过byType实现!如果两个都找不到的情况下,就报错!【常用】
- ·执行顺序不同:@Autowired 通过byType的方式实现。@Resource默认通过byname的方式实现。