package  com. lucifer. itheima. a02 ; import  lombok. extern. slf4j.  Slf4j ; 
import  org. springframework. beans. factory. annotation.  Autowired ; 
import  org. springframework. beans. factory. config.  BeanFactoryPostProcessor ; 
import  org. springframework. beans. factory. config.  BeanPostProcessor ; 
import  org. springframework. beans. factory. support.  AbstractBeanDefinition ; 
import  org. springframework. beans. factory. support.  BeanDefinitionBuilder ; 
import  org. springframework. beans. factory. support.  DefaultListableBeanFactory ; 
import  org. springframework. context. annotation.  AnnotationConfigUtils ; 
import  org. springframework. context. annotation.  Bean ; 
import  org. springframework. context. annotation.  Configuration ; @Slf4j 
public  class   TestBeanFactory  { public  static  void  main ( String [ ]  args)  { DefaultListableBeanFactory  beanFactory =  new  DefaultListableBeanFactory ( ) ; AbstractBeanDefinition  beanDefinition =  BeanDefinitionBuilder . genericBeanDefinition ( Config . class ) . setScope ( "singleton" ) . getBeanDefinition ( ) ; beanFactory. registerBeanDefinition ( "config" , beanDefinition) ; AnnotationConfigUtils . registerAnnotationConfigProcessors ( beanFactory) ; beanFactory. getBeansOfType ( BeanFactoryPostProcessor . class ) . values ( ) . stream ( ) . forEach ( beanFactoryPostProcessor ->  beanFactoryPostProcessor. postProcessBeanFactory ( beanFactory) ) ; 
beanFactory. getBeansOfType ( BeanPostProcessor . class ) . values ( ) . forEach ( beanFactory:: addBeanPostProcessor ) ; for  ( String  name:  beanFactory. getBeanDefinitionNames ( ) )  { System . out. println ( name) ; } 
beanFactory. preInstantiateSingletons ( ) ; System . out. println ( "============================" ) ; 
System . out. println ( beanFactory. getBean ( Bean1 . class ) . getInter ( ) ) ; } @Configuration static  class  Config  { @Bean public  Bean1  bean1 ( )  { return  new  Bean1 ( ) ; } @Bean public  Bean2  bean2 ( )  { return  new  Bean2 ( ) ; } @Bean public  Bean3  bean3 ( )  { return  new  Bean3 ( ) ; } @Bean public  Bean4  bean4 ( )  { return  new  Bean4 ( ) ; } } interface  Inter  { } static  class  Bean3  implements  Inter  { } static  class  Bean4  implements  Inter  { } static  class  Bean1  { public  Bean1 ( )  { log. info ( "构造 Bean1()" ) ; } @Autowired private  Bean2  bean2; public  Bean2  getBean2 ( )  { return  bean2; } @Autowired  
private  Inter  bean3; public  Inter  getInter ( )  { return  bean3; } } static  class  Bean2  { public  Bean2 ( )  { log. info ( "构造 Bean2()" ) ; } } 
} package  com. lucifer. itheima. a02 ; import  lombok. extern. slf4j.  Slf4j ; 
import  org. springframework. beans. factory. support.  DefaultListableBeanFactory ; 
import  org. springframework. beans. factory. xml.  XmlBeanDefinitionReader ; 
import  org. springframework. boot. autoconfigure. web. servlet.  DispatcherServletRegistrationBean ; 
import  org. springframework. boot. web. embedded. tomcat.  TomcatServletWebServerFactory ; 
import  org. springframework. boot. web. servlet. context.  AnnotationConfigServletWebServerApplicationContext ; 
import  org. springframework. boot. web. servlet. server.  ServletWebServerFactory ; 
import  org. springframework. context. annotation.  AnnotationConfigApplicationContext ; 
import  org. springframework. context. annotation.  Bean ; 
import  org. springframework. context. annotation.  Configuration ; 
import  org. springframework. context. support.  ClassPathXmlApplicationContext ; 
import  org. springframework. context. support.  FileSystemXmlApplicationContext ; 
import  org. springframework. core. io.  ClassPathResource ; 
import  org. springframework. core. io.  FileSystemResource ; 
import  org. springframework. web. servlet.  DispatcherServlet ; 
import  org. springframework. web. servlet. mvc.  Controller ; @Slf4j 
public  class  A02Application  { public  static  void  main ( String [ ]  args)  { testClassPathXmlApplicationContext ( ) ; testFileSystemXmlApplicationContext ( ) ; DefaultListableBeanFactory  beanFactory =  new  DefaultListableBeanFactory ( ) ; System . out. println ( "读取之前..." ) ; for  ( String  name: beanFactory. getBeanDefinitionNames ( ) ) { System . out. println ( name) ; } System . out. println ( "读取之后..." ) ; XmlBeanDefinitionReader  reader =  new  XmlBeanDefinitionReader ( beanFactory) ; reader. loadBeanDefinitions ( new  ClassPathResource ( "b01.xml" ) ) ; "\\resources\\b01.xml" ) ) ; for  ( String  name:  beanFactory. getBeanDefinitionNames ( ) )  { System . out. println ( name) ; } testAnnotationConfigurationContext ( ) ; } private  static  void  testClassPathXmlApplicationContext ( )  { ClassPathXmlApplicationContext  context =  new  ClassPathXmlApplicationContext ( "b01.xml" ) ; for  ( String  name:  context. getBeanDefinitionNames ( ) )  { System . out. println ( name) ; } System . out. println ( context. getBean ( Bean2 . class ) . getBean1 ( ) ) ; } private  static  void  testFileSystemXmlApplicationContext ( )  { 
FileSystemXmlApplicationContext  context =  new  FileSystemXmlApplicationContext ( "src\\main"  + "\\resources\\b01.xml" ) ; for  ( String  name:  context. getBeanDefinitionNames ( ) )  { System . out. println ( name) ; } System . out. println ( context. getBean ( Bean2 . class ) . getBean1 ( ) ) ; } private  static  void  testAnnotationConfigurationContext ( )  { AnnotationConfigApplicationContext  context =  new  AnnotationConfigApplicationContext ( Config . class ) ; for  ( String  name:  context. getBeanDefinitionNames ( ) )  { System . out. println ( name) ; } System . out. println ( context. getBean ( Bean2 . class ) . getBean1 ( ) ) ; } private  static  void  testAnnotationConfigServletWebServerApplicationContext ( )  { AnnotationConfigServletWebServerApplicationContext  context = new  AnnotationConfigServletWebServerApplicationContext ( WebConfig . class ) ; } @Configuration static  class  WebConfig  { @Bean public  ServletWebServerFactory  servletWebServerFactory ( )  { return  new  TomcatServletWebServerFactory ( ) ; } @Bean public  DispatcherServlet  dispatcherServlet ( ) { return  new  DispatcherServlet ( ) ; } @Bean public  DispatcherServletRegistrationBean  registrationBean ( DispatcherServlet  dispatcherServlet) { return  new  DispatcherServletRegistrationBean ( dispatcherServlet, "/" ) ; } @Bean ( "/hello" ) public  Controller  controller1 ( ) { return  ( request,  response)  ->  { response. getWriter ( ) . println ( "hello" ) ; return  null ; } ; } } @Configuration static  class  Config { @Bean public  Bean1  bean1 ( )  { return  new  Bean1 ( ) ; } @Bean public  Bean2  bean2 ( Bean1  bean1)  { Bean2  bean2 =  new  Bean2 ( ) ; bean2. setBean1 ( bean1) ; return  bean2; } } static  class  Bean1  { } static  class  Bean2  { private  Bean1  bean1; public  void  setBean1 ( Bean1  bean1)  { this . bean1 =  bean1; } public  Bean1  getBean1 ( )  { return  bean1; } } }