Spring IoC 依赖注入(一)使用说明
Spring IoC 依赖注入(一)使用说明
目录
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;
每天用心记录一点点。内容也许不重要,但习惯很重要!