ุงู„ุฑุจูŠุน: ุงู„ุจุญุซ ุนู† ุงู„ุณูŠุงู‚

ู‚ุจู„ ุดู‡ุฑูŠู† ุŒ ุชู… ู†ุดุฑ ู…ู†ุดูˆุฑ ู…ูุตู„ ุญูˆู„ ุชุญู…ูŠู„ ุงู„ูุตูˆู„ ุนู„ู‰ JVM ููŠ ู…ู„ููŠ ุงู„ุดุฎุตูŠ . ุจุนุฏ ู‡ุฐุง ุงู„ุญุฏูŠุซ ุŒ ุทุฑุญ ุฒู…ู„ุงุฆูŠ ุณุคุงู„ู‹ุง ุฌูŠุฏู‹ุง: ู…ุง ุงู„ุขู„ูŠุฉ ุงู„ุชูŠ ูŠุณุชุฎุฏู…ู‡ุง Spring ู„ุชุญู„ูŠู„ ุงู„ุชูƒูˆูŠู†ุงุช ูˆูƒูŠู ูŠุชู… ุชุญู…ูŠู„ ุงู„ูุฆุงุช ู…ู† ุงู„ุณูŠุงู‚ุŸ




ุจุนุฏ ุณุงุนุงุช ุทูˆูŠู„ุฉ ู…ู† ุชุตุญูŠุญ ู…ุตุฏุฑ ุงู„ุฑุจูŠุน ุŒ ูˆุตู„ ุฒู…ูŠู„ูŠ ุชุฌุฑูŠุจูŠู‹ุง ุฅู„ู‰ ุงู„ุญู‚ูŠู‚ุฉ ุงู„ุจุณูŠุทุฉ ุฌุฏู‹ุง ูˆุงู„ู…ูู‡ูˆู…ุฉ.

ุฌุฒุก ู…ู† ุงู„ู†ุธุฑูŠุฉ


ุญุฏุฏ ุนู„ู‰ ุงู„ููˆุฑ ุฃู† ApplicationContext ู‡ูˆ ุงู„ูˆุงุฌู‡ุฉ ุงู„ุฑุฆูŠุณูŠุฉ ููŠ ุชุทุจูŠู‚ Spring ุงู„ุฐูŠ ูŠูˆูุฑ ู…ุนู„ูˆู…ุงุช ุชูƒูˆูŠู† ุงู„ุชุทุจูŠู‚.

ู‚ุจู„ ุงู„ู…ุชุงุจุนุฉ ู…ุจุงุดุฑุฉู‹ ุฅู„ู‰ ุงู„ุนุฑุถ ุงู„ุชูˆุถูŠุญูŠ ุŒ ุฏุนู†ุง ู†ู„ู‚ูŠ ู†ุธุฑุฉ ุนู„ู‰ ุงู„ุฎุทูˆุงุช ุงู„ุชูŠ ูŠู†ุทูˆูŠ ุนู„ูŠู‡ุง ุฅู†ุดุงุก ApplicationContext :



ููŠ ู‡ุฐุง ุงู„ู…ู†ุดูˆุฑ ุŒ ุณู†ุญู„ู„ ุงู„ุฎุทูˆุฉ ุงู„ุฃูˆู„ู‰ ุŒ ู„ุฃู†ู†ุง ู…ู‡ุชู…ูˆู† ุจู‚ุฑุงุกุฉ ุงู„ุชูƒูˆูŠู†ุงุช ูˆุฅู†ุดุงุก BeanDefinition.

BeanDefinition ู‡ูŠ ูˆุงุฌู‡ุฉ ุชุตู ุงู„ููˆู„ ุŒ ูˆุฎุตุงุฆุตู‡ ุŒ ูˆูˆุณูŠุทุงุช ุงู„ู…ูู†ุดุฆ ุŒ ูˆุงู„ู…ุนู„ูˆู…ุงุช ุงู„ูˆุตููŠุฉ ุงู„ุฃุฎุฑู‰.

ููŠู…ุง ูŠุชุนู„ู‚ ุจุชูƒูˆูŠู† ุงู„ูุงุตูˆู„ูŠุง ู†ูุณู‡ุง ุŒ ูŠุญุชูˆูŠ Spring ุนู„ู‰ 4 ุทุฑู‚ ุชูƒูˆูŠู†:

  1. ุชูƒูˆูŠู† Xml - ClassPathXmlApplicationContext ("context.xml") ุ›
  2. ุชูƒูˆูŠู† ุฑุงุฆุน - GenericGroovyApplicationContext ("context.groovy") ุ›
  3. ุงู„ุชูƒูˆูŠู† ุนู† ุทุฑูŠู‚ ุงู„ุชุนู„ูŠู‚ุงุช ุงู„ุชูˆุถูŠุญูŠุฉ ุงู„ุชูŠ ุชุดูŠุฑ ุฅู„ู‰ ุญุฒู…ุฉ ุงู„ู…ุณุญ - AnnotationConfigApplicationContext ("package.name") ุ›
  4. JavaConfig - ุชูƒูˆูŠู† ุนุจุฑ ุงู„ุชุนู„ูŠู‚ุงุช ุงู„ุชูˆุถูŠุญูŠุฉ ุงู„ุชูŠ ุชุดูŠุฑ ุฅู„ู‰ ุงู„ูุฆุฉ (ุฃูˆ ุตููŠู ุงู„ูุฆุฉ) ุงู„ู…ู…ูŠุฒุฉ ุจู€Configuration - AnnotationConfigApplicationContext (JavaConfig.class).

ุชูƒูˆูŠู† Xml


ู†ุญู† ู†ุฃุฎุฐ ูƒุฃุณุงุณ ู…ุดุฑูˆุน ุจุณูŠุท:

public class SpringContextTest{
   private static String classFilter = "film.";
   
   public static void main(String[] args){
        
         printLoadedClasses(classFilter);
         /* Classloader: sun.misc.Launcher$AppClassLoader@18b4aac2
            All - 5 : 0 - Filtered      /*
        doSomething(MainCharacter.num); doSomething(FilmMaker.class);
        printLoadedClasses(classFilter);
        /* Classloader: sun.misc.Launcher$AppClassLoader@18b4aac2
               class film.MainCharacter
               class film.FilmMaker
            All - 7 : 2 - Filtered     /*

ู‡ู†ุง ูŠุฌุจ ุฃู† ุชุดุฑุญ ู‚ู„ูŠู„ุงู‹ ู…ุง ู‡ูŠ ุงู„ุฃุณุงู„ูŠุจ ูˆู…ุง ู‡ูŠ ุงู„ู…ุณุชุฎุฏู…ุฉ:

  • printLoadedClasses (ุณู„ุณู„ุฉ ... ู…ุฑุดุญุงุช) - ุชุทุจุน ุงู„ุทุฑูŠู‚ุฉ ุฅู„ู‰ ูˆุญุฏุฉ ุงู„ุชุญูƒู… ุงุณู… ุงู„ู…ูุญู…ู„ ูˆูุฆุงุช JVM ุงู„ู…ุญู…ู„ุฉ ู…ู† ุงู„ุญุฒู…ุฉ ุงู„ุชูŠ ุชู… ุชู…ุฑูŠุฑู‡ุง ูƒู…ุนู„ู…ุฉ. ุจุงู„ุฅุถุงูุฉ ุฅู„ู‰ ุฐู„ูƒ ุŒ ู‡ู†ุงูƒ ู…ุนู„ูˆู…ุงุช ุนู† ุนุฏุฏ ุฌู…ูŠุน ุงู„ูุฆุงุช ุงู„ุชูŠ ุชู… ุชุญู…ูŠู„ู‡ุง ุ›
  • doSomething (Object o) ู‡ูŠ ุทุฑูŠู‚ุฉ ุชู‚ูˆู… ุจุนู…ู„ ุจุฏุงุฆูŠ ุŒ ู„ูƒู†ู‡ุง ู„ุง ุชุณู…ุญ ุจุงุณุชุจุนุงุฏ ุงู„ูุฆุงุช ุงู„ู…ุฐูƒูˆุฑุฉ ุฃุซู†ุงุก ุงู„ุชุญุณูŠู† ุฃุซู†ุงุก ุงู„ุชุญูˆูŠู„ ุงู„ุจุฑู…ุฌูŠ.

ู†ุญู† ู†ุชุตู„ ุจู…ุดุฑูˆุน ุงู„ุฑุจูŠุน (ููŠู…ุง ูŠู„ูŠ ุŒ ูŠุนู…ู„ ุงู„ุฑุจูŠุน 4 ูƒู…ูˆุถูˆุน ุงุฎุชุจุงุฑ):

11 public class SpringContextTest{
12    private static String calssFilter = "film.";
13    
14    public static void main(String[] args){
15        
16        printLoadedClasses(classFilter);
17       /* Classloader: sun.misc.Launcher$AppClassLoader@18b4aac2
18           All - 5 : 0 - Filtered      /*
19        doSomething(MainCharacter.num); doSomething(FilmMaker.class);
20        printLoadedClasses(classFilter);
21        /* Classloader: sun.misc.Launcher$AppClassLoader@18b4aac2
22               class film.MainCharacter
23               class film.FilmMaker
24               All - 7 : 2 - Filtered   /*
25        ApplicationContext context = new ClassPathXmlApplicationContext(
26                  configLocation: "applicationContext.xml");
27        printLoadedClasses(classFilter);

ุงู„ุณุทุฑ 25 ู‡ูˆ ุชุนุฑูŠู ูˆุชู‡ูŠุฆุฉ ApplicationContext ู…ู† ุฎู„ุงู„ ุชูƒูˆูŠู† Xml .

ู…ู„ู xml ุงู„ุชูƒูˆูŠู† ูƒู…ุง ูŠู„ูŠ:

<beans xmlns = "http://www.spingframework.org/schema/beans" xmlns:xsi = "http..."
        <bean id = "villain" class = "film.Villain" lazy-init= "true">
                <property name = "name" value = "Vasily"/>
        </bean>
</beans> 

ุนู†ุฏ ุชูƒูˆูŠู† ุงู„ููˆู„ ุŒ ู†ุญุฏุฏ ูุฆุฉ ู…ูˆุฌูˆุฏุฉ ุจุงู„ูุนู„. ุงู†ุชุจู‡ ุฅู„ู‰ ุงู„ุฎุงุตูŠุฉ ุงู„ู…ุญุฏุฏุฉ lazy-init = โ€trueโ€ : ููŠ ู‡ุฐู‡ ุงู„ุญุงู„ุฉ ุŒ ู„ู† ูŠุชู… ุฅู†ุดุงุก ุงู„ุญุงูˆูŠุฉ ุฅู„ุง ุจุนุฏ ุทู„ุจู‡ุง ู…ู† ุงู„ุณูŠุงู‚.

ู†ู†ุธุฑ ุฅู„ู‰ ูƒูŠููŠุฉ ู‚ูŠุงู… Spring ุŒ ุนู†ุฏ ุฑูุน ุงู„ุณูŠุงู‚ ุŒ ุจุชูˆุถูŠุญ ุงู„ู…ูˆู‚ู ู…ุน ุงู„ุทุจู‚ุงุช ุงู„ู…ุนู„ู†ุฉ ููŠ ู…ู„ู ุงู„ุชูƒูˆูŠู†:

public class SpringContextTest {
    private static String classFilter = "film.";
    
    public static void main(String[] args) {
        
           printLoadedClasses(classFilter);
        /* Classloader: sun.misc.Launcher$AppClassLoader@18b4aac2
           All - 5 : 0 - Filtered      /*
        doSomething(MainCharacther.num); doSomething(FilmMaker.class);
        printLoadedClasses(classFilter);
        /* Classloader: sun.misc.Launcher$AppClassLoader@18b4aac2
               class film.MainCharacter
               class film.FilmMaker
            All - 7 : 2 - Filtered     /*
        ApplicationContext context = new ClassPathXmlApplicationContext(
                  configLocation: "applicationContext.xml");
        printLoadedClasses(classFilter);
        /* Classloader: sun.misc.Launcher$AppClassLoader@18b4aac2
               class film.MainCharacter
               class film.FilmMaker
               class film.Villain

            All - 343 : 3- Filtered     /*

ุฏุนูˆู†ุง ู†ูุญุต ุชูุงุตูŠู„ ุชูƒูˆูŠู† Xml:

- ู‚ุฑุงุกุฉ ู…ู„ู ุงู„ุชูƒูˆูŠู† ูƒุงู†ุช ุงู„ูุฆุฉ XmlBeanDefinitionReader ุŒ ุงู„ุชูŠ ุชู†ูุฐ ูˆุงุฌู‡ุฉ BeanDefinitionReader ุ›

- ูŠุชู„ู‚ู‰ XmlBeanDefinitionReader ุนู†ุฏ ุงู„ุฅุฏุฎุงู„ InputStream ูˆูŠุญู…ู„ ุงู„ู…ุณุชู†ุฏ ู…ู† ุฎู„ุงู„ DefaultDocumentLoader :

Document doc = doLoadDocument(inputSource, resource);
return registerBeanDefinitions(doc, resource);

- ุจุนุฏ ุฐู„ูƒ ุŒ ุชุชู… ู…ุนุงู„ุฌุฉ ูƒู„ ุนู†ุตุฑ ู…ู† ุนู†ุงุตุฑ ู‡ุฐุง ุงู„ู…ุณุชู†ุฏ ุŒ ูˆุฅุฐุง ูƒุงู† ุตู†ุฏูˆู‚ู‹ุง ุŒ ูŠุชู… ุฅู†ุดุงุก BeanDefinition ุงุณุชู†ุงุฏู‹ุง ุฅู„ู‰ ุงู„ุจูŠุงู†ุงุช ุงู„ู…ุนุจุฃุฉ (ุงู„ู…ุนุฑู ุŒ ุงู„ุงุณู… ุŒ ุงู„ูุฆุฉ ุŒ ุงู„ุงุณู… ุงู„ู…ุณุชุนุงุฑ ุŒ ุทุฑูŠู‚ุฉ ุงู„ุชู‡ูŠุฆุฉ ุŒ ุทุฑูŠู‚ุฉ ุงู„ุชุฏู…ูŠุฑ ุŒ ุฅู„ุฎ):

} else if (delegate.nodeNameEquals(ele, "bean")) {
    this.processBeanDefinition(ele, delegate);

- ูŠุชู… ูˆุถุน ูƒู„ BeanDefinition ููŠ ุฎุฑูŠุทุฉ ุŒ ูˆุงู„ุชูŠ ูŠุชู… ุชุฎุฒูŠู†ู‡ุง ููŠ ูุฆุฉ DefaultListableBeanFactory:

this.beanDefinitionMap.put(beanName, beanDefinition);
this.beanDefinitionNames.add(beanName);

ููŠ ุงู„ุฑู…ุฒ ุŒ ุชุจุฏูˆ ุงู„ุฎุฑูŠุทุฉ ูƒู…ุง ูŠู„ูŠ:

/** Map of bean definition objects, keyed by bean name */
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(64);

ุงู„ุขู† ููŠ ู…ู„ู ุงู„ุชูƒูˆูŠู† ู†ูุณู‡ุŒ ุฅุถุงูุฉ ุฅุนู„ุงู† ุงู„ูุงุตูˆู„ูŠุง ุขุฎุฑ ู…ุน film.BadVillain ุงู„ูุฆุฉ :

<beans xmlns = "http://www.spingframework.org/schema/beans" xmlns:xsi = "http..."
        <bean id = "goodVillain" class = "film.Villain" lazy-init= "true">
                <property name = "name" value = "Good Vasily"/>
        </bean>
        <bean id = "badVillain" class = "film.BadVillain" lazy-init= "true">
                <property name = "name" value = "Bad Vasily"/>
        </bean>

ุณู†ุฑู‰ ู…ุง ุณูŠุญุฏุซ ุฅุฐุง ุทุจุนุช ู‚ุงุฆู…ุฉ ุจุฃุณู…ุงุก BeanDefenitionNames ูˆุงู„ูุฆุงุช ุงู„ู…ุญู…ู„ุฉ:

ApplicationContext context = new ClassPathXmlApplicationContext(
        configLocation: "applicationContext.xml");
System.out.println(Arrays.asList(context.getBeanDefinitionNames()));
        
printLoadedClasses(calssFilter);

ุนู„ู‰ ุงู„ุฑุบู… ู…ู† ุญู‚ูŠู‚ุฉ ุฃู† ูุฆุฉ ุงู„ููŠู„ู….BadVillain ุงู„ู…ุญุฏุฏุฉ ููŠ ู…ู„ู ุงู„ุชูƒูˆูŠู† ุบูŠุฑ ู…ูˆุฌูˆุฏุฉ ุŒ ุฅู„ุง ุฃู† Spring ูŠุนู…ู„ ุจุฏูˆู† ุฃุฎุทุงุก:

ApplicationContext context = new ClassPathXmlApplicationContext(
        configLocation: "applicationContext.xml");
System.out.println(Arrays.asList(context.getBeanDefinitionNames()));
//  [goodVillain, badVillain]
printLoadedClasses(calssFilter);
/* Classloader: sun.misc.Launcher$AppClassLoader@18b4aac2
               class film.MainCharacter
               class film.FilmMaker
               class film.Villain
    All - 343 : 3- Filtered   /*

ููŠ ู‚ุงุฆู…ุฉ BeanDefenitionNames ุชุญุชูˆูŠ ุนู„ู‰ 2 ุงู„ุนู†ุงุตุฑุ›
ุจู…ุนู†ู‰ ุŒ ุชู… ุฅู†ุดุงุก 2 BeanDefinition ุงู„ู…ูƒูˆู†ุฉ ููŠ ู…ู„ูู†ุง.

ุชูƒูˆูŠู†ุงุช ุงู„ุนู„ุจุฉ ู‡ูŠ ู†ูุณู‡ุง ุจุดูƒู„ ุฃุณุงุณูŠ. ูˆู„ูƒู† ุŒ ููŠ ุญูŠู† ุชู… ุชุญู…ูŠู„ ุงู„ุทุจู‚ุฉ ุงู„ุญุงู„ูŠุฉ ุŒ ู„ู… ุชู†ุดุฃ ุฃูŠ ู…ุดุงูƒู„. ูŠู…ูƒู† ุฃู† ู†ุณุชู†ุชุฌ ู…ู†ู‡ุง ุฃู†ู‡ ูƒุงู†ุช ู‡ู†ุงูƒ ุฃูŠุถู‹ุง ู…ุญุงูˆู„ุฉ ู„ุชุญู…ูŠู„ ูุฆุฉ ุบูŠุฑ ู…ูˆุฌูˆุฏุฉ ุŒ ู„ูƒู† ุงู„ู…ุญุงูˆู„ุฉ ุงู„ูุงุดู„ุฉ ู„ู… ุชูƒุณุฑ ุฃูŠ ุดูŠุก.

ุฏุนูˆู†ุง ู†ุญุงูˆู„ ุงู„ุญุตูˆู„ ุนู„ู‰ ุงู„ูุงุตูˆู„ูŠุง ุจุฃู†ูุณู‡ู… ุจุฃุณู…ุงุฆู‡ู…:

ApplicationContext context = new ClassPathXmlApplicationContext(
        configLocation: "applicationContext.xml");
System.out.println(Arrays.asList(context.getBeanDefinitionNames()));
//  [goodVillain, badVillain]
System.out.println(context.getBean( name: "goodVillain"));

System.out.println(context.getBean( name: "badVillain"));

ู†ุญุตู„ ุนู„ู‰ ู…ุง ูŠู„ูŠ:



ุฅุฐุง ุชู… ุงุณุชู„ุงู… ุญุจุฉ ุตุงู„ุญุฉ ููŠ ุงู„ุญุงู„ุฉ ุงู„ุฃูˆู„ู‰ ุŒ ูู‚ุฏ ูˆุตู„ ุงุณุชุซู†ุงุก ููŠ ุงู„ุญุงู„ุฉ ุงู„ุซุงู†ูŠุฉ.

ุงู†ุชุจู‡ ุฅู„ู‰ ุชุชุจุน ุงู„ู…ูƒุฏุณ: ุนู…ู„ ุงู„ุชุญู…ูŠู„ ุงู„ู…ุคุฌู„ ู„ู„ูุตูˆู„. ูŠุชู… ุงู„ุฒุญู ุฅู„ู‰ ุฌู…ูŠุน ุจุฑุงู…ุฌ ุชุญู…ูŠู„ ุงู„ูุตู„ ุงู„ุฏุฑุงุณูŠ ููŠ ู…ุญุงูˆู„ุฉ ู„ู„ุนุซูˆุฑ ุนู„ู‰ ุงู„ูุตู„ ุงู„ุฏุฑุงุณูŠ ุงู„ุฐูŠ ูŠุจุญุซูˆู† ุนู†ู‡ ู…ู† ุจูŠู† ุงู„ู…ู„ูุงุช ุงู„ู…ุญู…ู„ุฉ ุณุงุจู‚ู‹ุง. ูˆุจุนุฏ ุนุฏู… ุงู„ุนุซูˆุฑ ุนู„ู‰ ุงู„ูุฆุฉ ุงู„ู…ุทู„ูˆุจุฉ ุŒ ู…ู† ุฎู„ุงู„ ุงุณุชุฏุนุงุก ุฃุณู„ูˆุจ Utils.forName ุŒ ุชุชู… ู…ุญุงูˆู„ุฉ ู„ู„ุนุซูˆุฑ ุนู„ู‰ ูุฆุฉ ุบูŠุฑ ู…ูˆุฌูˆุฏุฉ ุจุงู„ุงุณู… ุŒ ู…ู…ุง ุฃุฏู‰ ุฅู„ู‰ ุฎุทุฃ ุทุจูŠุนูŠ.

ุนู†ุฏ ุฑูุน ุงู„ุณูŠุงู‚ ุŒ ุชู… ุชุญู…ูŠู„ ูุฆุฉ ูˆุงุญุฏุฉ ูู‚ุท ุŒ ุจูŠู†ู…ุง ู„ู… ุชุคุฏูŠ ู…ุญุงูˆู„ุฉ ุชุญู…ูŠู„ ู…ู„ู ุบูŠุฑ ู…ูˆุฌูˆุฏ ุฅู„ู‰ ุญุฏูˆุซ ุฎุทุฃ. ู„ู…ุงุฐุง ุญุตู„ ู‡ุฐุงุŸ

ู‡ุฐุง ู„ุฃู†ู†ุง ุณุฌู„ู†ุง ูƒุณูˆู„ ุงู„ุญุฑู ุงู„ุฃูˆู„: ุตุญูŠุญูˆู†ู‡ู‰ Spring ู„ุฅู†ุดุงุก ู…ุซูŠู„ ู…ู† ุงู„ุญุจุฉ ุŒ ุญูŠุซ ูŠุชู… ุฅู†ุดุงุก ุงู„ุงุณุชุซู†ุงุก ุงู„ุฐูŠ ุชู… ุชู„ู‚ูŠู‡ ู…ุณุจู‚ู‹ุง. ุฅุฐุง ู‚ู…ุช ุจุฅุฒุงู„ุฉ ู‡ุฐู‡ ุงู„ุฎุงุตูŠุฉ ู…ู† ุงู„ุชูƒูˆูŠู† ุฃูˆ ู‚ู…ุช ุจุชุบูŠูŠุฑ ู‚ูŠู…ุชู‡ุง lazy-init: false ุŒ ูุณูŠุชุนุทู„ ุงู„ุฎุทุฃ ุงู„ู…ูˆุถุญ ุฃุนู„ุงู‡ ุฃูŠุถู‹ุง ุŒ ูˆู„ูƒู† ู„ู† ูŠุชู… ุชุฌุงู‡ู„ ุงู„ุชุทุจูŠู‚. ููŠ ุญุงู„ุชู†ุง ุŒ ุชู…ุช ุชู‡ูŠุฆุฉ ุงู„ุณูŠุงู‚ ุŒ ูˆู„ูƒู†ู†ุง ู„ู… ู†ุชู…ูƒู† ู…ู† ุฅู†ุดุงุก ู…ุซูŠู„ ู…ู† ุงู„ุญุจุฉ ุŒ ู„ุฃู† ู„ู… ูŠุชู… ุงู„ุนุซูˆุฑ ุนู„ู‰ ุงู„ูุตู„ ุงู„ู…ุญุฏุฏ.

ุชูƒูˆูŠู† ุฑุงุฆุน


ุนู†ุฏ ุชูƒูˆูŠู† ุณูŠุงู‚ ุจุงุณุชุฎุฏุงู… ู…ู„ู Groovy ุŒ ุชุญุชุงุฌ ุฅู„ู‰ ุฅู†ุดุงุก GenericGroovyApplicationContext ุŒ ุงู„ุฐูŠ ูŠุชู„ู‚ู‰ ุณู„ุณู„ุฉ ู…ุน ุชูƒูˆูŠู† ุงู„ุณูŠุงู‚ ูƒู…ุฏุฎู„. ููŠ ู‡ุฐู‡ ุงู„ุญุงู„ุฉ ุŒ ุชุนู…ู„ ูุฆุฉ GroovyBeanDefinitionReader ููŠ ู‚ุฑุงุกุฉ ุงู„ุณูŠุงู‚ . ูŠุนู…ู„ ู‡ุฐุง ุงู„ุชูƒูˆูŠู† ุจุดูƒู„ ุฃุณุงุณูŠ ู…ุซู„ Xml ุŒ ูู‚ุท ู…ุน ู…ู„ูุงุช Groovy. ุจุงู„ุฅุถุงูุฉ ุฅู„ู‰ ุฐู„ูƒ ุŒ ูŠุนู…ู„ GroovyApplicationContext ุจุดูƒู„ ุฌูŠุฏ ู…ุน ู…ู„ู Xml.

ู…ุซุงู„ ุนู„ู‰ ู…ู„ู ุชูƒูˆูŠู† Groovy ุจุณูŠุท:

beans {
    goodOperator(film.Operator){bean - >
            bean.lazyInit = 'true' >
            name = 'Good Oleg' 
         }
    badOperator(film.BadOperator){bean - >
            bean.lazyInit = 'true' >
            name = 'Bad Oleg' / >
        }
  }

ู†ุญุงูˆู„ ุฃู† ู†ูุนู„ ู†ูุณ ุงู„ุดูŠุก ู…ุน Xml:



ูŠุชุนุทู„ ุงู„ุฎุทุฃ ุนู„ู‰ ุงู„ููˆุฑ: ูŠู‚ูˆู… Groovy ุŒ ู…ุซู„ Xml ุŒ ุจุฅู†ุดุงุก BeanDefenitions ุŒ ูˆู„ูƒู† ููŠ ู‡ุฐู‡ ุงู„ุญุงู„ุฉ ูŠุนุทูŠ ุงู„ู…ุนุงู„ุฌ ุงู„ู„ุงุญู‚ ุฎุทุฃ ุนู„ู‰ ุงู„ููˆุฑ.

ุงู„ุชูƒูˆูŠู† ุนุจุฑ ุงู„ุชุนู„ูŠู‚ุงุช ุงู„ุชูˆุถูŠุญูŠุฉ ุงู„ุชูŠ ุชุดูŠุฑ ุฅู„ู‰ ุญุฒู…ุฉ ู„ู„ู…ุณุญ ุฃูˆ JavaConfig


ูŠุฎุชู„ู ู‡ุฐุง ุงู„ุชูƒูˆูŠู† ุนู† ุงู„ุชูƒูˆูŠู†ูŠู† ุงู„ุณุงุจู‚ูŠู†. ูŠุณุชุฎุฏู… ุงู„ุชูƒูˆูŠู† ู…ู† ุฎู„ุงู„ ุงู„ุชุนู„ูŠู‚ุงุช ุงู„ุชูˆุถูŠุญูŠุฉ ุฎูŠุงุฑูŠู†: JavaConfig ูˆุงู„ุชุนู„ูŠู‚ ุงู„ุชูˆุถูŠุญูŠ ุนู„ู‰ ุงู„ูุฆุงุช.

ูŠุชู… ุงุณุชุฎุฏุงู… ู†ูุณ ุงู„ุณูŠุงู‚ ู‡ู†ุง: AnnotationConfigApplicationContext ("package" /JavaConfig.class) . ูŠุนู…ู„ ุญุณุจ ู…ุง ุชู… ุชู…ุฑูŠุฑู‡ ุฅู„ู‰ ุงู„ู…ู†ุดุฆ.

ููŠ ุณูŠุงู‚ AnnotationConfigApplicationContext ู‡ู†ุงูƒ ู…ุฌุงู„ุงู† ุฎุงุตุงู† :

  • ู‚ุงุฑุฆ AnnotatedBeanDefinitionReader ุงู„ู†ู‡ุงุฆูŠ ุงู„ุฎุงุต (ูŠุนู…ู„ ู…ุน JavaConfig) ุ›
  • ุงู„ู…ุงุณุญ ุงู„ุถูˆุฆูŠ ุงู„ู†ู‡ุงุฆูŠ ุงู„ุฎุงุต ุจู€ ClassPathBeanDefinitionScanner r (ูŠู…ุณุญ ุงู„ุญุฒู…ุฉ).

ุฎุตูˆุตูŠุฉ AnnotatedBeanDefinitionReader ู‡ูŠ ุฃู†ู‡ ูŠุนู…ู„ ููŠ ุนุฏุฉ ู…ุฑุงุญู„:

  1. ุชุณุฌูŠู„ ุฌู…ูŠุน ู…ู„ูุงุช ุงู„ุชูƒูˆูŠู† ู„ู…ุฒูŠุฏ ู…ู† ุงู„ุชุญู„ูŠู„ ุ›
  2. ู‚ู… ุจุชุณุฌูŠู„ BeanFactoryPostProcesso r ุงู„ุฎุงุต ุŒ ูˆู‡ูˆ BeanDefinitionRegistryPostProcessor ุŒ ูˆุงู„ุฐูŠ ุจุงุณุชุฎุฏุงู… ูุฆุฉ ConfigurationClassParser ุŒ ูŠู‚ูˆู… ุจุชุญู„ูŠู„ JavaConfig ูˆุฅู†ุดุงุก BeanDefinition .

ููƒุฑ ููŠ ู…ุซุงู„ ุจุณูŠุท:

@Configuration
public class JavaConfig {
    
    @Bean
    @Lazy
    public MainCharacter mainCharacter(){
        MainCharacter mainCharacter = new MainCharacter();
        mainCharacter.name = "Patric";
        return mainCharacter;        
   }
}

public static void main(String[] args) {

     ApplicationContext javaConfigContext = 
               new AnnotationConfigApplicationContext(JavaConfig.class);
     for (String str : javaConfigContext.getBeanDefinitionNames()){
          System.out.println(str);
     }
     printLoadedClasses(classFilter);

ู†ู‚ูˆู… ุจุฅู†ุดุงุก ู…ู„ู ุชูƒูˆูŠู† ุจุฃุจุณุท ุญุงูˆูŠุฉ ู…ู…ูƒู†ุฉ. ู†ู†ุธุฑ ุฅู„ู‰ ู…ุง ุณูŠุชู… ุชุญู…ูŠู„ู‡:



ุฅุฐุง ุŒ ููŠ ุญุงู„ุฉ Xml ูˆ Groovy ุŒ ุชู… ุชุญู…ูŠู„ ุงู„ุนุฏูŠุฏ ู…ู† BeanDefinition ูƒู…ุง ุชู… ุงู„ุฅุนู„ุงู† ุนู†ู‡ ุŒ ููŠ ู‡ุฐู‡ ุงู„ุญุงู„ุฉ ุŒ ูŠุชู… ุชุญู…ูŠู„ ูƒู„ ู…ู† BeanDefinition ุงู„ู…ุนู„ู† ูˆุงู„ุฅุถุงููŠ ููŠ ุนู…ู„ูŠุฉ ุฑูุน ุงู„ุณูŠุงู‚. ููŠ ุญุงู„ุฉ ุงู„ุชู†ููŠุฐ ู…ู† ุฎู„ุงู„ JavaConfig ุŒ ูŠุชู… ุชุญู…ูŠู„ ุฌู…ูŠุน ุงู„ูุฆุงุช ุนู„ู‰ ุงู„ููˆุฑ ุŒ ุจู…ุง ููŠ ุฐู„ูƒ ูุฆุฉ JavaConfig ู†ูุณู‡ุง ุŒ ู„ุฃู†ู‡ุง ู†ูุณู‡ุง ููˆู„.

ู†ู‚ุทุฉ ุฃุฎุฑู‰: ููŠ ุญุงู„ุฉ ุชูƒูˆูŠู†ุงุช Xml ูˆ Groovy ุŒ ุชู… ุชุญู…ูŠู„ 343 ู…ู„ูู‹ุง ุŒ ู‡ู†ุง ุญุฏุซ ุชุญู…ูŠู„ "ุซู‚ูŠู„" ุฃูƒุซุฑ ู…ู† 631 ู…ู„ูู‹ุง ุฅุถุงููŠู‹ุง. ุฎุทูˆุงุช

ุนู…ู„ ClassPathBeanDefinitionScanner :

  • ุชุญุฏุฏ ุงู„ุญุฒู…ุฉ ุงู„ู…ุญุฏุฏุฉ ู‚ุงุฆู…ุฉ ุงู„ู…ู„ูุงุช ุงู„ู…ุฑุงุฏ ู…ุณุญู‡ุง. ุชู‚ุน ุฌู…ูŠุน ุงู„ู…ู„ูุงุช ููŠ ุงู„ุฏู„ุงุฆู„.
  • , InputStream org.springframework.asm.ClassReader.class;
  • 3- , org.springframework.core.type.filter.AnnotationTypeFilter. Spring , Component , Component;
  • , BeanDefinition.

ูƒู„ "ุณุญุฑ" ุงู„ุนู…ู„ ู…ุน ุงู„ุชุนู„ูŠู‚ุงุช ุงู„ุชูˆุถูŠุญูŠุฉ ุŒ ูƒู…ุง ู‡ูˆ ุงู„ุญุงู„ ู…ุน Xml ูˆ Groovy ุŒ ูŠูƒู…ู† ุจุงู„ุถุจุท ููŠ ูุฆุฉ ClassReader.class ู…ู† ู…ุฌู…ูˆุนุฉ springframework.asm . ุฎุตูˆุตูŠุฉ ู‡ุฐุง ุงู„ู‚ุงุฑุฆ ู‡ูˆ ุฃู†ู‡ ูŠู…ูƒู† ุฃู† ูŠุนู…ู„ ู…ุน ุงู„ุจุงูŠุช ูƒูˆุฏ. ูˆู‡ุฐุง ูŠุนู†ูŠ ุฃู† ุงู„ู‚ุงุฑุฆ ูŠุฃุฎุฐ InputStream ู…ู† ุงู„ุจุงูŠุช ูƒูˆุฏ ูˆูŠูุญุตู‡ ูˆูŠุจุญุซ ุนู† ุงู„ุชุนู„ูŠู‚ุงุช ุงู„ุชูˆุถูŠุญูŠุฉ ู‡ู†ุงูƒ.

ุถุน ููŠ ุงุนุชุจุงุฑูƒ ุงู„ู…ุงุณุญ ุงู„ุถูˆุฆูŠ ุจุงุณุชุฎุฏุงู… ู…ุซุงู„ ุจุณูŠุท.

ู‚ู… ุจุฅู†ุดุงุก ุชุนู„ูŠู‚ ุชูˆุถูŠุญูŠ ุฎุงุต ุจูƒ ู„ู„ุจุญุซ ุนู† ุงู„ูุฆุงุช ุงู„ู…ู‚ุงุจู„ุฉ:

import org.springframework.stereotype.Component
import java.lang.annotation.*;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface MyBeanLoader{
       String value() default "";

ู†ู†ุดุฆ ูุตู„ูŠู†: ุฃุญุฏู‡ู…ุง ู…ุน ุงู„ุชุนู„ูŠู‚ ุงู„ุชูˆุถูŠุญูŠ ู„ู„ู…ูƒูˆู† ุงู„ู‚ูŠุงุณูŠ ุŒ ูˆุงู„ุซุงู†ูŠ ู…ุน ุงู„ุชุนู„ูŠู‚ ุงู„ุชูˆุถูŠุญูŠ ุงู„ู…ุฎุตุต:

@Component 
public class MainCharacter {
      public static int num = 1;
      @Value("Silence")
      public String name;
      public MainCharacter() { }

MyBeanLoader("makerFilm")
@Lazy 
public class FilmMaker {
      public static int staticInt = 1;
      @Value("Silence")
      public String filmName;
      public FilmMaker(){}

ูˆู†ุชูŠุฌุฉ ู„ุฐู„ูƒ ุŒ ู†ุญุตู„ ุนู„ู‰ BeanDefinition ุงู„ุฐูŠ ุชู… ุฅู†ุดุงุคู‡ ู„ู‡ุฐู‡ ุงู„ูุฆุงุช ูˆุงู„ูุฆุงุช ุงู„ุชูŠ ุชู… ุชุญู…ูŠู„ู‡ุง ุจู†ุฌุงุญ.

ApplicationContext annotationConfigContext =
       new AnnotationConfigApplicationContext(...basePackages: "film");
for (String str : annotationConfigContext.getBeanDefinitionNames()){
     System.out.println(str);
}
printLoadedClasses(classFilter);



ุงุณุชู†ุชุงุฌ


ู…ู…ุง ุณุจู‚ ูŠู…ูƒู† ุงู„ุฅุฌุงุจุฉ ุนู„ู‰ ุงู„ุฃุณุฆู„ุฉ ุงู„ู…ุทุฑูˆุญุฉ ูƒู…ุง ูŠู„ูŠ:

  1. Spring ?

    , . BeanDefinition, : , BeanDefinitionโ€™ . BeanDefinition, ..
  2. Spring ?

    Java: , , , .

PS ุขู…ู„ ุฃู† ุฃูƒูˆู† ู‚ุฏ ุชู…ูƒู†ุช ููŠ ู‡ุฐุง ุงู„ู…ู†ุดูˆุฑ ู…ู† "ูุชุญ ุญุฌุงุจ ุงู„ุณุฑูŠุฉ" ูˆุฃู† ุฃุธู‡ุฑ ุจุงู„ุชูุตูŠู„ ูƒูŠู ูŠุญุฏุซ ุชุดูƒูŠู„ ุณูŠุงู‚ ุงู„ุฑุจูŠุน ููŠ ุงู„ู…ุฑุญู„ุฉ ุงู„ุฃูˆู„ู‰. ุงุชุถุญ ุฃู†ู‡ ู„ูŠุณ ูƒู„ ุดูŠุก "ู…ุฎูŠู". ู„ูƒู† ู‡ุฐุง ู„ูŠุณ ุณูˆู‰ ุฌุฒุก ุตุบูŠุฑ ู…ู† ุฅุทุงุฑ ุนู…ู„ ูƒุจูŠุฑ ุŒ ู…ู…ุง ูŠุนู†ูŠ ุฃู†ู‡ ู„ุง ูŠุฒุงู„ ู‡ู†ุงูƒ ุงู„ูƒุซูŠุฑ ู…ู† ุงู„ู…ุณุชู‚ุจู„ ุงู„ุฌุฏูŠุฏ ูˆุงู„ู…ุซูŠุฑ ู„ู„ุงู‡ุชู…ุงู….

All Articles