spring ioc的注解
@Component注解
适用于工具類等非三層【dao層,service層,web層】對象的建立。
即:把對象放在spring的ioc容器中
- 用法如下:
/*
@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.
@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。