1. 程式人生 > >Spring 進階(5) 使用註解配置bean(1)

Spring 進階(5) 使用註解配置bean(1)

  1. 可以在為類配置註解,然後在配置檔案中指定哪一個包下有註解的類都註冊成java bean,spring沒有使用約定由於配置的做法,根據註解配置bean的類的路徑要顯式指定。
  2. 要特別指出的是,這些通過註解的bean,spring給他們的id是將類名全部改成小寫字母
  3. 天道酬勤,來吧
    package InstanceClass;
    
    import org.springframework.stereotype.Component;
    //使用Component說明要spring把這個類當成普通的javabean註冊,其實還可以註冊成為其他的類的
    @Component
    public class ClassA {
        private String name;
    
         void setName(String name) {
            this.name = "ok";
        }
    
        public void thisIsMyName(){
            System.out.println("A' s name is " + name);
        }
    }
    
    package InstanceClass;
    
    
    import org.springframework.stereotype.Component;
    //同上
    @Component
    public class ClassB {
        private String name;
    
         void setName(String name) {
            this.name = "ok1";
        }
    
        public void thisIsMyName(){
            System.out.println("B' s name is " + name);
        }
    }
    
    package TestPackage;
    
    import InstanceClass.ClassA;
    import InstanceClass.ClassB;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    //測試類
    public class SpringTest {
        public static void main(String []args){
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
            ClassA classA = applicationContext.getBean("classA", ClassA.class);
           System.out.println(classA.toString());
    
            ClassB classB = applicationContext.getBean("classB", ClassB.class);
          System.out.println(classB.toString());
    
        }
    }
    
    <?xml version="1.0" encoding="GBK"?>
    <!--要使用註解的話,就要先引入對應的配置-->
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
    	http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    	http://www.springframework.org/schema/context
    	http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    
        <!--顯式指定要在那個路徑下自動配置bean-->
        <context:component-scan base-package="InstanceClass"/>
    
    </beans>

     

  4. 然後介通過註解來指定bean的作用域(是每次產生一個例項呀,還是單例模式)

    1. 這就是為bean的實現類新增@scope註解,像這樣,在scope註解的引數就是指定它的作用域了。

      
      @Scope("prototype")
      @Component("classA")
      public class ClassA {
      ......
      }

       

  5. 是不是發現還差了一個很重要的地方?對!類成員變數的賦值,怎能少了這個呢?

    1. 實現方法是使用@Resource和@Value註解,@Resource註解的作用等同於在配置檔案中 使用ref,@value就是直接賦值啦,少俠看招!

      1. 首先是一個很大的坑,就是我的jdk裡沒有javax.Annotaion這個包,還得我自己去下載後新增進去,新增包操作以前說過啦,就是File->Project Structure-> + >選擇要的包,點選確定。我把我找到的包分享出來,居然有人拿這個賣五個c幣,過分。。。大家需要什麼包可以留言,我可以試試看幫你們找找,義務。javax.annotation jar

      2. 然後就是程式碼啦,在ClassA裡增加一個ClassB的成員變數,然後註解,需要特別指出的是,這兩個註解可以對set方法註解,也可以直接對值註解,當對值註解的時候,可以去掉set方法。

        package InstanceClass;
        
        
        
        
        
        
        import org.springframework.beans.factory.annotation.Value;
        import org.springframework.context.annotation.Scope;
        import javax.annotation.*;
        import org.springframework.stereotype.Component;
        
        //使用Component說明要spring把這個類當成普通的javabean註冊,其實還可以註冊成為其他的類的
        
        @Scope("prototype")
        @Component("classA")
        public class ClassA {
        
            @Value("classA")
            private String name;
        
        
            private ClassB classB;
        
            @Resource(name = "classB")
            public void setClassB(ClassB classB) {
                this.classB = classB;
            }
        
            public ClassB getClassB(){
                return classB;
            }
        
            public void thisIsMyName(){
                System.out.println("A' s name is " + name);
            }
        }
        

         

  6. 這是我看李剛編著的《輕量級javaEE企業應用實戰(第五版)-Struts2+Spring5+Hibernate5/JAP2》後總結出來的。