文章目录  
 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  { 
    @Override 
    public  void  log ( String  msg)  { 
        System . out. println ( "输出日志到文件:"   +  msg) ; 
    } 
    @Override 
    public  LogType  getType ( )  { 
        return  LogType . FILE_LOG ; 
    } 
} 
@Component 
class  ConsoleLog  implements  ILog  { 
    @Override 
    public  void  log ( String  msg)  { 
        System . out. println ( "输出日志到控制台:"  +  msg) ; 
    } 
    @Override 
    public  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) ; 
    } 
    
    @Override 
    public  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  { 
    @Autowired 
    private  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) ; 
	} 
}