ApplicationContextAware感知应用上下文
1.ApplicationContextAware在项目中的应用
- 实现ApplicationContextAware接口,拿到应用上下文就可以拿到IOC里面的Bean,自己需注册到IOC
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.net.InetAddress;
import java.net.UnknownHostException;
@Component(value = "applicationContextUtils")
public class ApplicationContextUtils implements ApplicationContextAware {
private static ApplicationContext context;
private static ApplicationContextUtils applicationContextUtils;
@Value(value = "${spring.application.name}")
private String applicationName;
@Value(value = "${server.port}")
private String serverPort;
@Value(value = "${server.servlet.context-path}")
private String contextPath;
private static String serverInfo;
private static String serverIp;
private static String serverHostname;
private static final Class<ApplicationContextUtils> CLASS = ApplicationContextUtils.class;
private static final Logger log = LoggerFactory.getLogger(CLASS.getName());
public static String getServerIp(){
if (serverIp == null){
try {
serverIp = InetAddress.getLocalHost().getHostAddress();
}
catch (UnknownHostException e) {
log.error(e.getLocalizedMessage(),e);
}
}
return serverIp;
}
public static String getServerHostname(){
if (serverHostname == null){
try {
serverHostname = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
log.error(e.getLocalizedMessage(),e);
}
}
return serverHostname;
}
public static String getContextPath(){
if (applicationContextUtils == null){
applicationContextUtils = getBean(CLASS);
}
return applicationContextUtils.contextPath;
}
public static String getServerInfo(){
if (serverInfo == null){
if (applicationContextUtils == null){
applicationContextUtils = getBean(CLASS);
}
serverInfo = applicationContextUtils.applicationName+"_"+applicationContextUtils.serverPort;
}
return serverInfo;
}
public static String getApplicationName(){
if (applicationContextUtils == null){
applicationContextUtils = getBean(CLASS);
}
return applicationContextUtils.applicationName;
}
public static String getServerPort(){
if (applicationContextUtils == null){
applicationContextUtils = getBean(CLASS);
}
return applicationContextUtils.serverPort;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static ApplicationContext getContext(){
return context;
}
public static<T> T getBean(Class<T> clazz){
T result = null;
if (context != null){
result = context.getBean(clazz);
}
return result;
}
}
2.聚合所有Service(结合ApplicationContextAware),实现无需注入,也可拿到Service,任意地方使用,带来更大的灵活性。
import com.wpq.service.IServiceA;
import com.wpq.service.IServiceB;
import com.wpq.service.IServiceC;
public class ServiceHolder {
private static IServiceA serviceA;
private static IServiceB serviceB;
private static IServiceC serviceC;
public static IServiceA getServiceA() {
if (serviceA == null){
serviceA = ApplicationContextUtils.getBean(IServiceA.class);
}
return serviceA;
}
public static IServiceB getServiceB() {
if (serviceB == null){
serviceB = ApplicationContextUtils.getBean(IServiceB.class);
}
return serviceB;
}
public static IServiceC getServiceC() {
if (serviceC == null){
serviceC = ApplicationContextUtils.getBean(IServiceC.class);
}
return serviceC;
}
}