本文共 10228 字,大约阅读时间需要 34 分钟。
1. 手动模式 - 配置或者编程的方式,提前安排注入规则
2. 自动模式 - 实现方提供依赖自动关联的方式,按照內建的注入规则
3. 依赖注入类型
官方说明
The Spring container can autowire relationships between collaborating beans. You can let Spring resolve collaborators (other beans) automatically for your bean by inspecting the contents of the ApplicationContext.优点
官方说明
Limitations and Disadvantages of Autowiring 小节 链接:https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/spring-framework-reference/core.html#beans-autowired-exceptionspublic static void main(String[] args) { DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); String xmlResourcePath = "classpath:/META-INF/dependency-setter-injection.xml"; // 加载 XML 资源,解析并且生成 BeanDefinition beanDefinitionReader.loadBeanDefinitions(xmlResourcePath); // 依赖查找并且创建 Bean UserHolder userHolder = beanFactory.getBean(UserHolder.class); System.out.println(userHolder); }
public static void main(String[] args) { // 创建 BeanFactory 容器 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); // 注册 Configuration Class(配置类) applicationContext.register(AnnotationDependencySetterInjectionDemo.class); XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(applicationContext); String xmlResourcePath = "classpath:/META-INF/dependency-lookup-context.xml"; // 加载 XML 资源,解析并且生成 BeanDefinition beanDefinitionReader.loadBeanDefinitions(xmlResourcePath); // 启动 Spring 应用上下文 applicationContext.refresh(); // 依赖查找并且创建 Bean UserHolder userHolder = applicationContext.getBean(UserHolder.class); System.out.println(userHolder); // 显示地关闭 Spring 应用上下文 applicationContext.close(); } @Bean public UserHolder userHolder(User user) { UserHolder userHolder = new UserHolder(); userHolder.setUser(user); return userHolder; }
public static void main(String[] args) { // 创建 BeanFactory 容器 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); // 生成 UserHolder 的 BeanDefinition BeanDefinition userHolderBeanDefinition = createUserHolderBeanDefinition(); // 注册 UserHolder 的 BeanDefinition applicationContext.registerBeanDefinition("userHolder", userHolderBeanDefinition); XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(applicationContext); String xmlResourcePath = "classpath:/META-INF/dependency-lookup-context.xml"; // 加载 XML 资源,解析并且生成 BeanDefinition beanDefinitionReader.loadBeanDefinitions(xmlResourcePath); // 启动 Spring 应用上下文 applicationContext.refresh(); // 依赖查找并且创建 Bean UserHolder userHolder = applicationContext.getBean(UserHolder.class); System.out.println(userHolder); // 显示地关闭 Spring 应用上下文 applicationContext.close(); } /** * 为 {@link UserHolder} 生成 {@link BeanDefinition} * * @return */ private static BeanDefinition createUserHolderBeanDefinition() { BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserHolder.class); definitionBuilder.addPropertyReference("user", "superUser"); return definitionBuilder.getBeanDefinition(); }
手动模式
@Autowired private UserHolder userHolder; // static @Autowired 会忽略掉静态字段,即不注入 @Resource private UserHolder userHolder2;
手动模式
private UserHolder userHolder; private UserHolder userHolder2; @Autowired public void init1(UserHolder userHolder) { this.userHolder = userHolder; } @Resource public void init2(UserHolder userHolder2) { this.userHolder2 = userHolder2; } @Bean public UserHolder userHolder(User user) { return new UserHolder(user); }
BEIJING SHANGHAI
@Configurationpublic class QualifierAnnotationDependencyInjectionDemo { @Autowired private User user; // superUser -> primary =true @Autowired @Qualifier("user") // 指定 Bean 名称或 ID private User namedUser; // 整体应用上下文存在 4 个 User 类型的 Bean: // superUser // user // user1 -> @Qualifier // user2 -> @Qualifier @Autowired private CollectionallUsers; // 2 Beans = user + superUser @Autowired @Qualifier private Collection qualifiedUsers; // 2 Beans = user1 + user2 -> 4 Beans = user1 + user2 + user3 + user4 @Autowired @UserGroup private Collection groupedUsers; // 2 Beans = user3 + user4 @Bean @Qualifier // 进行逻辑分组 public User user1() { return createUser(7L); } @Bean @Qualifier // 进行逻辑分组 public User user2() { return createUser(8L); } @Bean @UserGroup public User user3() { return createUser(9L); } @Bean @UserGroup public User user4() { return createUser(10L); } private static User createUser(Long id) { User user = new User(); user.setId(id); return user; } public static void main(String[] args) { // 创建 BeanFactory 容器 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); // 注册 Configuration Class(配置类) -> Spring Bean applicationContext.register(QualifierAnnotationDependencyInjectionDemo.class); XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(applicationContext); String xmlResourcePath = "classpath:/META-INF/dependency-lookup-context.xml"; // 加载 XML 资源,解析并且生成 BeanDefinition beanDefinitionReader.loadBeanDefinitions(xmlResourcePath); // 启动 Spring 应用上下文 applicationContext.refresh(); // 依赖查找 QualifierAnnotationDependencyInjectionDemo Bean QualifierAnnotationDependencyInjectionDemo demo = applicationContext.getBean(QualifierAnnotationDependencyInjectionDemo.class); // 期待输出 superUser Bean System.out.println("demo.user = " + demo.user); // 期待输出 user Bean System.out.println("demo.namedUser = " + demo.namedUser); // 期待输出 superUser user user1 user2 System.out.println("demo.allUsers = " + demo.allUsers); // 期待输出 user1 user2 System.out.println("demo.qualifiedUsers = " + demo.qualifiedUsers); // 期待输出 user3 user4 System.out.println("demo.groupedUsers = " + demo.groupedUsers); // 显示地关闭 Spring 应用上下文 applicationContext.close(); }}
@Configurationpublic class LazyAnnotationDependencyInjectionDemo { @Autowired @Qualifier("user") private User user; // 实时注入 @Autowired private ObjectProvideruserObjectProvider; // 延迟注入 @Autowired private ObjectFactory > usersObjectFactory; public static void main(String[] args) { // 创建 BeanFactory 容器 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); // 注册 Configuration Class(配置类) -> Spring Bean applicationContext.register(LazyAnnotationDependencyInjectionDemo.class); XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(applicationContext); String xmlResourcePath = "classpath:/META-INF/dependency-lookup-context.xml"; // 加载 XML 资源,解析并且生成 BeanDefinition beanDefinitionReader.loadBeanDefinitions(xmlResourcePath); // 启动 Spring 应用上下文 applicationContext.refresh(); // 依赖查找 QualifierAnnotationDependencyInjectionDemo Bean LazyAnnotationDependencyInjectionDemo demo = applicationContext.getBean(LazyAnnotationDependencyInjectionDemo.class); // 期待输出 superUser Bean System.out.println("demo.user = " + demo.user); // 期待输出 superUser Bean System.out.println("demo.userObjectProvider = " + demo.userObjectProvider.getObject()); // 继承 ObjectFactory // 期待输出 superUser user Beans System.out.println("demo.usersObjectFactory = " + demo.usersObjectFactory.getObject()); demo.userObjectProvider.forEach(System.out::println); // 显示地关闭 Spring 应用上下文 applicationContext.close(); }}
@Autowired 注入规则
@Autowired 注入过程
转载地址:http://kthwz.baihongyu.com/