文章目录
- 1、ILog
- 2、LogType 枚举类
- 3、DemoController
- 4、application.properties
- 5、DesignDemoApplication
1、ILog
package com.atguigu.design.demo.spring;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public interface ILog {void log(String msg);LogType getType();
}
@Component
class FileLog implements ILog {@Overridepublic void log(String msg) {System.out.println("输出日志到文件:" + msg);}@Overridepublic LogType getType() {return LogType.FILE_LOG;}
}
@Component
class ConsoleLog implements ILog {@Overridepublic void log(String msg) {System.out.println("输出日志到控制台:" + msg);}@Overridepublic LogType getType() {return LogType.CONSOLE_LOG;}
}
@Component
class LogClient implements ApplicationContextAware {private static final Map<String, ILog> MAP = new ConcurrentHashMap<>();public void log(String type, String msg) {MAP.get(type).log(msg);}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {Map<String, ILog> beansOfType = applicationContext.getBeansOfType(ILog.class);if (CollectionUtils.isEmpty(beansOfType)) {return;}Collection<ILog> beans = beansOfType.values();beans.forEach(bean->{LogType type = bean.getType();MAP.put(type.type, bean);});}
}
2、LogType 枚举类
package com.atguigu.design.demo.spring;
public enum LogType {FILE_LOG("1","文件日志"),CONSOLE_LOG("2","控制台日志");public String type;public String desc;LogType(String type, String desc) {this.type = type;this.desc = desc;}
}
3、DemoController
package com.atguigu.design.demo.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {@Autowiredprivate LogClient logClient;@GetMapping("log/{type}")public String log(@PathVariable String type, @RequestParam("msg") String msg) {logClient.log(type, msg);return "日志输出成功!";}
}
4、application.properties
spring.application.name=design-demo
server.port=10010
5、DesignDemoApplication
package com.atguigu.design.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DesignDemoApplication {public static void main(String[] args) {SpringApplication.run(DesignDemoApplication.class, args);}}