Spring中Bean管理的常用注解


在Spring中,主要用於管理bean的注解分為四大類:1.用於創建對象。2.用於給對象的屬性注入值。3.用於改變作用的范圍。4.用於定義生命周期。這幾個在開發中經常接觸到,也可以說每天都會遇見。其中創建對象是重點,Spring中創建對象的有四個:分別是@Component,@Controller,@Service,@Repository。對於@Component注解:把資源讓Spring來管理,相當於xml中的配置的Bean。屬性:value:指定Bean中的id。如果不指定value屬性,默認Bean的id是當前類的類名,首字母小寫。在開發中的場景是這樣的,其實是在實現類中加入即可:

@Component("customerService")
public class CustomerServiceImpl implements CustomerService{

    public void save() {
        System.out.println("顧客保存方法");
    }
}

而其它的三個注解都是針對一個衍生注解,它們的作用及屬性都是一模一樣的。只不過提供了更加明確的語義化。@Controller:一般用於表現層的注解。@Service:一般用於業務層的注解。@responsitory:一般用於持久層的注解。用法與以上相同,這里不做過多的解釋。要理解這個三個注解就是讓標注類本身的用途清晰而已。接下來,聊聊用於給對象的屬性注入值得問題。Spring給我們提出了注入數據的注解有:@Value,@Autowired,@Qualifier,@Resource。其中@Value:注入基本數據類型和String類型數據,它的屬性value用於指定值。@Autowired這個用法是比較重要的,它能夠自動按照類型注入。當使用注解注入屬性時,set方法可以省略。它只能注入其他Bean類型。當有多個類型匹配時,使用要注入的對象變量名稱作為Bean的id,在Spring容器中查找,找到了也可以注入成功,找不到就報錯。這句話是不是很難理解。其實所表達的意思是這樣的,這個注解的是自動注入的意思,寫注入的對象,這個對象就是Bean中的id,讓Spring自己去查找,找到說明可以用,找不到則報錯。

代碼如下:

@Service("customerService")
public class CustomerServiceImpl implements CustomerService{

    @Value(value="jack")
    private String name;

    @Autowired
    private UserDao userdao;
    
    public void save() {
        System.out.println("顧客保存方法---"+name);
        
        userdao.save();
    }
}

 @Qualifier:官方是這樣介紹的,在自動按照類型的基礎上,再按照Bean的id注入。它在給字段注入時不能獨立使用,必須和@Autowired一起使用,但是給方法參數注入時,可以獨立使用。屬性:指定Bean的id。應用場景:如果一個接口有兩個設置多個實現類,如果對其注入的話,優先會注入與Bean的id與屬性名一樣的Bean,如果像注入指定的Bean,則需要用@Qualifier注解名字注入。而@Resource:直接按照Bean的id注入,它只能注入其它的Bean類型。屬性:name指定Bean的id。

@Service("customerService")
public class CustomerServiceImpl implements CustomerService{

    @Autowired
    @Qualifier("userDao2")
    private UserDao userdao;

/*
@Resource(name="userDao2"); //@Resource注解的使用    private userDao userdao;
*/
public void save() { System.out.println("顧客保存方法---"+name); userdao.save(); } }

 用於改變作用域范圍的@Scope:指定Bean的作用范圍。屬性:value指定范圍的值。默認是單例的,如果像設置為多列的,只需在類中加@Scope("prototype"),具體代碼詳見如下:

@Service("customerService")
@Scope("prototype")
public class CustomerServiceImpl implements CustomerService{
         ................      
}

用於生命周期相關的注解,@PostConstruct注解,加在方法上指定Bean對象創建好之后,調用該方法初始化對象,類似於xml的init-method方法。@PreDestroy注解,指定Bean銷毀之前,調用該方法,類似與xml的destroy-method方法。注意的是如果你要想看當前的效果,就必須要調用ClassPathXmlApplicationContext.close( )方法,同時scope的值要是singleton。是在銷毀之前執行。

    @PostConstruct
    public void firstInit(){
        System.out.println("第一個執行");
    }
    
    public void save() {
        System.out.println("顧客保存方法---"+name);
        userdao.save();
    }
    
    @PreDestroy
    public void lastdestroy(){
        System.out.println("最后一個執行");
    }

對於以上和之前寫的文章,關於xml和注解各有各的優勢。注解的話就是配置簡單,維護方便。而xml的優勢是修改時,不用改源代碼,不涉及重新編譯和部署。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM