Spring IoC 依赖注入(一)使用说明
目录
- Spring IoC 依赖注入(一)使用说明
- 1. 依赖注入方法
- 1.1 Setter 方法依赖注入
- 1.2 构造器依赖注入
- 1.3 字段注入
- 1.4 方法注入
- 1.5 回调注入
- 2. 依赖注入类型
- 2.1 基础类型注入
- 2.3 集合类型注入
- 2.4 限定注入
- 3. 延迟依赖注入
Spring 核心编程思想目录:https://www.cnblogs.com/binarylei/p/12290153.html
1. 依赖注入方法
1.1 Setter 方法依赖注入
- 手动模式
- XML 资源配置元信息
<bean id="beanA" class="com.binarylei.spring.ioc.injection.BeanA">
<property name="beanB" ref="beanB"/>
</bean>
- Java 注解配置元信息
@Bean
public BeanB beanB() {
return new BeanB();
}
- API 配置元信息
@Test
public void testSettingInjectByApi() {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerBeanDefinition("beanB", new RootBeanDefinition(BeanB.class));
beanFactory.registerBeanDefinition("beanA", BeanDefinitionBuilder
.rootBeanDefinition(BeanA.class)
.addPropertyReference("beanB", "beanB")
.getBeanDefinition());
BeanA beanA = beanFactory.getBean(BeanA.class);
Assert.assertNotNull(beanA.getBeanB());
}
- 自动模式(只有 XML 配置方式,不推荐)
- byName
<bean id="beanA" class="com.binarylei.spring.ioc.injection.BeanA" autowire="byName"/>
- byType
<bean id="beanA" class="com.binarylei.spring.ioc.injection.BeanA" autowire="byType"/>
1.2 构造器依赖注入
- 手动模式
- XML 资源配置元信息
<bean id="beanA" class="com.binarylei.spring.ioc.injection.BeanA">
<constructor-arg name="beanB" ref="beanB"/>
</bean>
- Java 注解配置元信息
@Bean
public BeanA beanA(BeanB beanB, BeanFactory beanFactory) {
return new BeanA(beanB, beanFactory);
}
- API 配置元信息
@Test
public void testInjectConstructorByApi() {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerBeanDefinition("beanB", new RootBeanDefinition(BeanB.class));
beanFactory.registerBeanDefinition("beanA", BeanDefinitionBuilder
.rootBeanDefinition(BeanA.class)
.addConstructorArgReference("beanB")
.getBeanDefinition());
BeanA beanA = beanFactory.getBean(BeanA.class);
Assert.assertNotNull(beanA.getBeanB());
}
- 自动模式(只有 XML 配置方式,不推荐)
- constructor:constructor 本质是使用 byType 进行注入
<bean id="beanA" class="com.binarylei.spring.ioc.injection.BeanA" autowire="constructor"/>
1.3 字段注入
- 手动模式 - Java 注解配置元信息
- @Autowired
- @Resource
- @Inject(可选)
@Autowired
private BeanB beanB;
@Inject
private BeanB beanB2;
@Resource
private BeanFactory beanFactory;
引入 jsr330 maven 规范:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
Java EE CDI Dependency Injection (@Inject) tutorial
1.4 方法注入
- 手动模式 - Java 注解配置元信息
- @Autowired
- @Resource
- @Inject(可选)
- @Bean
private BeanB beanB;
private BeanB beanB2;
private BeanFactory beanFactory;
@Autowired
public void init1(BeanB beanB) {
this.beanB = beanB;
}
@Inject
public void init2(BeanB beanB2) {
this.beanB2 = beanB2;
}
@Resource
public void init3(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
1.5 回调注入
BeanFactoryAware ...
public class InjectCallbackTest implements BeanFactoryAware {
private BeanFactory beanFactory;
@Override
public void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
}
2. 依赖注入类型
2.1 基础类型注入
- 原生类型(Primitive ): boolean、byte、char、short、int 、float、long、double
- 标量类型(Scalar ): Number、Character、Boolean、Enum、Locale、Charset、Currency、Properties、UUID
- 常规类型(General ): Object、String、Timezone、Calendar、Optional
- Spring 类型:Resource、Inputsource、Formatter
@Value("1")
private long num;
@Value("#{1 + 2}")
private long num2;
@Value("${user.dir}")
private String userDir;
@Autowired
private Optional<Environment> environmentOptional;
@Value("com/binarylei/spring/ioc/injection/spring-dependency-inject-constructor.xml")
private Resource resource;
2.3 集合类型注入
- 数组类型(Array ):原生类型、标量类型、常规类型、 Spring 类型
- 集合类型(Collection )
- Collection:List、Set(Sortedset、 NavigableSet、 EnumSet)
- Map:Properties
@Autowired
private Environment[] environmentArr;
@Autowired
private List<Environment> environmentList;
@Autowired
private Map<String, Environment> environmentMap;
2.4 限定注入
- 使用注解 @Qualifier 限定
- 通过 Bean 名称限定
@Autowired
@Qualifier("uri2")
private URI uri2;
- 通过分组限定
// 使用
@Autowired
@Qualifier
private URI uri5;
// 配置
@Bean
@Qualifier
public URI uri3() {
return URI.create("http://www.tian.com");
}
- 基于注解 @Qualifier 扩展限定
- 自定义注解 - 如 Spring Cloud @Loadbalanced
// 使用,自动按组注入
@Autowired
@Group1
private URI uri3;
@Autowired
@Group2
private URI uri4;
// 配置
@Bean
@Primary
@Group1
public URI uri1() {
return URI.create("http://www.baidu.com");
}
@Bean
@Group2
public URI uri2() {
return URI.create("http://www.qq.com");
}
// 定义注解
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Qualifier
private static @interface Group1 {
}
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Qualifier
private static @interface Group2 {
}
3. 延迟依赖注入
- 使用注解 @Lazy 限定
- ObjectProvider 或 ObjectFactory
@Autowired
private ObjectProvider<Environment> environmentObjectProvider;
@Autowired
@Lazy
private Environment environmentLazy;
每天用心记录一点点。内容也许不重要,但习惯很重要!