五、Spring IoC註解

一、概述

spring 基於註解的IoC與基於XML的IoC實現的功能是一樣的,只是配置的形式不同而已

二、常用註解

1. 用於創建對象的註解:同bean標籤
  • @Component spring 通用組件的註解
  • @Controller spring 表現層組件註解
  • @Service spring 服務層組件註解
  • @Repository spring 持久層組件註解

屬性:value,用於指定組件的id,默認爲類的名稱,且首字母小寫

<?xml version="1.0" encoding="UTF-8"?>
<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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- spring 容器創建時需要掃描的包 -->
    <context:component-scan base-package="com.lizza"/>

</beans>
@Component
public class UserServiceImpl implements UserService {

    @Override
    public void saveUser(){
        System.out.println("UserService: user saved!");
    }
}
2. 用於注入數據的註解:同property標籤
  • @Autowired 自動按照類型注入,只要spring容器中有唯一的一個類型與被注入的bean類型相同的bean對象時,就可以注入成功
  1. 如果容器中沒有對應類型的bean時,則報NoUniqueBeanDefinitionException異常
  2. 容器中有多個對應類型的bean時,用變量名稱作爲id在spring容器中查找對應的bean,若沒有則報NoUniqueBeanDefinitionException異常
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public void saveUser(){
        userDao.saveUser();
    }
}
@Repository("userDao1")
public class UserDao1Impl implements UserDao {

    @Override
    public void saveUser() {
        System.out.println("UserDao1: user saved!");
    }
}
@Repository("userDao2")
public class UserDao1Impl implements UserDao {

    @Override
    public void saveUser() {
        System.out.println("UserDao2: user saved!");
    }
}

上面會報NoUniqueBeanDefinitionException異常

  • @Qualifier 按照類型注入的基礎上再按照bean的id去注入
  1. 在給類成員注入時,不能單獨使用
  2. 在給方法參數注入時,可以單獨使用
  3. 屬性value,用於指定bean的id
@Service
public class UserServiceImpl implements UserService {

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

    @Override
    public void saveUser(){
        userDao.saveUser();
    }
}
  • @Resource: 按照id注入,可以獨立使用
@Service
public class UserServiceImpl implements UserService {

    @Resource(name = "userDao2")
    private UserDao userDao;

    @Override
    public void saveUser(){
        userDao.saveUser();
    }
}

總結:以上的三個註解只能注入其他bean類型的數據,而不能注入基本類型和String類型的數據,另外集合類型的數據只能使用XML來注入

  • @Value 用於注入String類型和基本類型的數據,在註解的屬性值中可以使用SpEL(Spring的el表達式),即:${表達式}
  1. 屬性:value,用於指定屬性的值
@Repository
public class UserDao1Impl implements UserDao {

    @Value("1")
    int index;

    @Override
    public void saveUser() {
        System.out.println("UserDao" + index + ": user saved!");
    }
}
3. 用於描述作用範圍的註解:同scope屬性
  • @Scope 指定bean的作用範圍,常用取值:singleton,prototype;默認singleton
4. 用於配置生命週期的註解:同init-method和destroy-method屬性
  • @PostConstruct 用於指定初始化的方法,執行完構造器之後會執行,可以註解多個
  • @PreDestroy 用於指定銷燬方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章