Sam's Notes | Sam Blog

梦想还是要有的,万一实现了呢

0%

spring 多态 注入

主要内容

spring 多态 注入
利用 PropertySource 实现 多态的动态注入。

更新历史


环境:spring 4, JDK 1.8; 话不多说,看代码

多态

一个 service 接口, 有若干具体实现

接口 IPolyDiService.java

1
2
3
4
5
6
package com.xxx.service;

public interface IPolyDiService {
void printName();

}

实现A APolyDiServiceImpl

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.xxx.service.impl;

import com.xxx.service.IPolyDiService;
import org.springframework.stereotype.Service;

@Service("A_service")
public class APolyDiServiceImpl implements IPolyDiService {

@Override
public void printName() {
System.out.println("This is A PolyDiServiceImpl");
}
}

实现B BPolyDiServiceImpl

1
2
3
4
5
6
7
8
9
10
11
12
package com.xxx.service.impl;

import com.xxx.service.IPolyDiService;
import org.springframework.stereotype.Service;

@Service("B_service")
public abstract class BPolyDiServiceImpl implements IPolyDiService {
@Override
public void printName() {
System.out.println("This is B PolyDiServiceImpl");
}
}

动态注入

配置文件 env.properties

可以用其他外置配置替代, 如下, 改变 service 的值, 可以运行时动态注入不同的具体实现。

1
2
# service=B
service=A

Junit PolyDiTest

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.xxx.service;

import com.xxx.service.IPolyDiService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;

import javax.annotation.Resource;
import java.text.ParseException;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)

public class PolyDiTest {

@Resource(name = "${service}_service")
private IPolyDiService service;

@Test
public void test() throws ParseException {
service.printName();

}

@Configuration
@PropertySource({ "classpath:conf/env.properties"})
@ComponentScan(basePackages ={ "com.xxx.service.impl"})
public static class ContextConfiguration {

}
}

测试结果

service=A 的结果

1
This is A PolyDiServiceImpl

service=B 的结果

1
This is B PolyDiServiceImpl