天天看點

spring ioc的注解 學習總結spring ioc的注解

spring ioc的注解

@Component注解

适用于工具類等非三層【dao層,service層,web層】對象的建立。

即:把對象放在spring的ioc容器中

  1. 用法如下:
/*
@Component注解 相當于 bean标簽中的class="全限定類名",其預設id是目前類 類名首字母小寫,也可以通過@Component注解的value屬性去指定id。
比如:@Component("userDao")  相當于
 <bean id = "userDao" class="cn.lzy.dao.impl.UserDaoImpl" />
*/
@Component("userDao")
public class UserDaoImpl2 implements UserDao {
    public void save() {
        System.out.println("儲存成功!");
    }
}
           

[email protected]的延伸出的注解:

它們的用法和@Component注解一樣。

@Repository :用來建立dao層對象

@Service :用來建立servcie層對象

@Controller :用來建立controller層對象

(ps : 目前spring沒有明确規定這四個注解必須在指定的位置使用,是以混合使用也可以。但一般不這樣做,按照規範使用)

@Scope注解

主要用于 改變Bean對象作用域。

@Scope 裡面的值(預設是單例singleton)可以是singleton , prototype , request ,response , global session

常用的值:singleton , prototype

singleton:代表單例

prototype : 代表多例

用法示例如下:

@Repository
@Scope("prototype")//代表使用多例 
public class UserDaoImpl implements UserDao {

    public void save() {
        System.out.println("儲存成功!");
    }

    @PostConstruct
    public void init(){
        System.out.println("對象被建立了");
    }
    @PreDestroy
    public void destroy(){
        System.out.println("對象被銷毀了");
    }
}
           

生命周期的注解

@PostConstruct 相當于bean标簽的init-method屬性

@PreDestroy 相當于 bean标簽的destroy-method 屬性

用法在上面的代碼塊中。

下面的代碼用來測試生命周期 和容器 和單例、多例的關系

public class UserTest {
    @Test
    public void saveTest(){
    //1.擷取ioc容器
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2.從ioc容器中調用方法
        UserService userService = ac.getBean(UserService.class);
        userService.save();
        //3.容器關閉
        ac.close();
    }
}
           

生命周期 和容器 和單例、多例的關系

總結:

(1)Bean對象的作用域是singleton時,

容器建立,對象産生;

容器在,對象在;

容器銷毀,對象銷毀。

(2)Bean對象的作用域是prototype時,

容器建立,對象未産生,隻有調用方法時,才會産生對象;

對象一直存在;

直到垃圾回收器 回收它,對象銷毀。

DI中編寫的類 和 架構的類 注解注入的問題

在自己編寫的類中,類中的屬性,可以直接指派。因為它們是java提供的,不需要進行解耦合;

而架構中的類,都是一些位元組碼,我們無法使用注解注入,因為注解必須和java代碼放在一起才會生效。

總結:spring注解實作DI ,隻能注入自己編寫的對象。

@Autowired注解

[email protected] 放在屬性上。

它會預設去ioc容器中尋找與目前屬性類型 一樣的對象,

如果找到了唯一一個,就指派給目前屬性;

如果找到多個,那麼在同類型的對象中,根據目前屬性的名稱去比對Bean對象的id。

重點:@Qualifier注解 配合@Autowired 放在屬性上使用時,可以先按照屬性名稱去比對 bean對象的id (ps:@Qualifier可以指定尋找對象的id)

例如:

@Service
public class UesrServiceImpl implements UserService {
    @Autowired(required = false)
    @Qualifier("userDaoImpl")
    private UserDao userDao;
    
    }
           

此外@Autowired 還可以在裡面加上required = false屬性 和值

用來在容器中沒找到對象,會給目前屬性指派為null。如果不加,直接報錯而已。(required屬性預設true)

總結:@Autowired注解預設情況下根據類型【by type】去ioc容器中尋找對象。如果沒有找到,再根據對象id【by name】去找。根據對象id 尋找有兩種比對方式,分别是根據屬性名或者 根據@Qualifier注解中的value值。

[email protected]放在方法上。

@Autowired放在方法上,表示spring會自動執行目前方法,如果目前方法有參數,會自動到ioc容器中尋找同類型對象 給其傳值。如果找到多個同類型參數,那麼可以使用@Qualifier給它指定一個ioc容器中的對象id.

spring ioc的注解 學習總結spring ioc的注解

@Resource注解說明【重點】

@Resource隻能放在屬性上,預設會先根據目前屬性名去IOC容器中比對對象id【by name】,如果沒有比對到會按照類型【by type】去比對。

如果@Resource添加一個name屬性,就表示必須安裝name屬性的值去IOC容器中比對對象id【by name】。

總結@AutoWired和@Resource的差別

@Autowired是預設先by type 再by name。此注解是spring提供的。

@Resource是預設先by name 再by type。此注解是java提供的。

一般使用@Autowired。

繼續閱讀