spring中的自动注入
spring官方介绍
IOC和DI的介绍
This chapter covers the Spring Framework implementation of the Inversion of Control (IoC) principle. IoC is also known as dependency injection (DI)
IOC的又一个别名叫做DI,依赖注入也叫DI
spring可以将我们的业务对象通过一些配置元数据信息让其成为spring中的bean。
自动注入
官方文档解释:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-autowire
Autowiring modes
Mode | Explanation |
---|---|
no |
(默认)不自动装配。 Bean 引用必须由 ref 元素定义。 对于较大的部署,不建议更改默认设置,因为明确指定协作者可以提供更大的控制力和清晰度。 在某种程度上,它记录了系统的结构。 |
byName |
按属性名称自动装配。 Spring 寻找与需要自动装配的属性同名的 bean。 例如,如果一个 bean 定义被设置为按名称自动装配,并且它包含一个 master 属性(即,它有一个 setMaster(..) 方法),Spring 会查找一个名为 master 的 bean 定义并使用 它来设置属性。 |
byType |
如果容器中恰好存在一个属性类型的 bean,则让属性自动装配。 如果存在多个,则会抛出一个致命异常,这表明您不能对该 bean 使用 byType 自动装配。 如果没有匹配的 bean,则不会发生任何事情(未设置属性)。 |
constructor |
类似于 byType 但适用于构造函数参数。 如果容器中没有一个构造函数参数类型的 bean,则会引发致命错误。 |
自动注入是开发成员指定当前类要成为一个Bean之后,bean中的属性是否让spring来进行自动注入。
自动注入和@Autowired是没有关系的。也可以理解成是set的一种方式。
来看一下对应的设置
@Configuration
@ComponentScan("com.guang.beandefinitaiontest.demo11")
public class AppConfig {
}
@Component
public class User {
private String name = "lg";
private String address = "sz";
}
public class UserService {
private User user;
public void setUser(User user) {
this.user = user;
}
public void test(){
System.out.println("UserService 执行了----->"+user);
}
}
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(AppConfig.class);
GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
genericBeanDefinition.setBeanClass(UserService.class);
genericBeanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
context.registerBeanDefinition("userService",genericBeanDefinition);
context.refresh();
UserService userService = context.getBean(UserService.class);
userService.test();
}
}
看一下控制台打印:
UserService 执行了----->com.guang.beandefinitaiontest.demo11.service.User@4034c28c
我们没有对UserService中的属性做任何处理,只是添加了一个
genericBeanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
Spring将会默认的按照类型,给UserService中的属性按照类型从容器中找到并来进行赋值。
从理论中来,到实践中去,最终回归理论