Spring學習筆記(五)--基於註解的Bean操作管理
阿新 • • 發佈:2021-08-03
接下來來學習註解
什麼是註解
-
註解是程式碼特殊標記,格式:@註解名稱(屬性名稱=屬性值)
-
註解作用在類,方法,屬性上
-
使用註解目的:簡化xml配置
Spring針對Bean管理建立物件提供的註解種類
-
@Component
-
@Service
-
@Controller
-
@Repository
註解的實現需要引入spring-aop-5.2.6.RELEASE包
實現步驟
- 開啟元件掃描(引入context名稱空間)
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" > <!-- 開啟元件掃描 1 如果掃描多個包,多個包用逗號隔開 2 寫上需要掃描包的上層目錄 掃描 com.day6 包下所有的類 --> <context:component-scan base-package="com.day6"></context:component-scan> </beans>
- 建立UserService類和測試類
UserService類
@Service
public class UserService {
public void add(){
System.out.println("service add...");
}
}
測試類
public class test { @Test public void test(){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("com/day6/spring5/zhujie/bean.xml"); // 這裡getBean的name屬性值,預設是需要建立物件的類的首字母小寫 UserService userService = context.getBean("userService", UserService.class); userService.add(); } } //輸出 service add...
3.開啟元件掃描細節配置
<!--示例1 use-default-filters="false" 表示現在不適用預設filter,自己配置filter context:include-filter , 設定掃描哪些內容 --> <context:component-scan base-package="com.day6" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--示例2 下面配置掃描包的所有內容 context:exclude-filter , 設定哪些內容不掃描 --> <context:component-scan base-package="com.day6"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
基於註解方式實現屬性注入
用到四個註解:@Autowired @Qulifier @Resource @Value
- @AutoWired:根據屬性型別進行自動注入
使用到的類: Service類、Dao類
第一步:把Service和Dao物件建立 (在Service類上新增@Service,在Dao類上新增@Repository)
第二步:在Service中注入Dao物件,在Service中新增dao型別屬性,在屬性上添加註解@Autowired
//Service類
public class Service{
@Autowired
private Dao dao;
public void add(){
System.out.println("service add ...");
dao.add();
}
}
//Dao類
public class Dao{
public void add(){
System.out.println("dao add ...");
}
}
xml配置檔案
<context:component-scan base-package="com.qy"></context:component-scan>
測試類
//測試類
public class test {
@Test
public void test(){
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("com/qy/spring5/zhujie/bean.xml");
// 這裡getBean的name屬性值,預設是需要建立物件的類的首字母小寫
UserService userService = context.getBean("userService", UserService.class);
userService.add();
}
}
//輸出結果
service add...
dao add...
2.@Qualifier:根據屬性名稱進行注入,需要和@Autowired配合使用
它用於何處?
比如說現在有 Service類,Dao介面,DaoImpl1實現類(實現Dao介面),DaoImpl2實現類(實現Dao介面),這時候我們再使用@Autowired根據型別進行注入的話,因為有兩個實現類,那麼就不知道要注入哪個實現類了,所以要使用@Qualifier註解。
演示
//UserService類
@Service(value = "userService")
public class UserService {
@Autowired
@Qualifier(value = "userDaoImpl1")
private UserDao userDaoImpl1;
@Autowired
@Qualifier(value = "userDaoImpl2")
private UserDao userDaoImpl2;
public void add(){
System.out.println("service add ...");
userDaoImpl1.add();
userDaoImpl2.add();
}
}
//UserDao介面
public interface UserDao {
public void add();
}
//UserDaoImpl1實現類
@Repository(value = "userDaoImpl1")
public class UserDaoImpl1 implements UserDao{
@Override
public void add() {
System.out.println("UserDaoImpl1 第一個實現類 add ...");
}
}
//UserDaoImpl2實現類
@Repository(value = "userDaoImpl2")
public class UserDaoImpl2 implements UserDao{
@Override
public void add() {
System.out.println("UserDaoImpl2 第二個實現類 add ...");
}
}
//XML配置檔案
<context:component-scan base-package="com.qy"></context:component-scan>
//測試類
public class test {
@Test
public void test(){
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("com/qy/spring5/qualifier/bean.xml");
// 這裡getBean的name值預設是UserService首字母小寫,可以在UserService上通過註解設定 @Service(value = "")
UserService userService = context.getBean("userService", UserService.class);
userService.add();
}
}
//輸出
service add ...
UserDaoImpl1 第一個實現類 add ...
UserDaoImpl2 第二個實現類 add ...
3.@Resource:可以根據型別注入,可以根據名稱注入
- 根據型別注入
@Resource
private UserDao userDaoImpl;
- 根據名稱注入
@Resource(name = "userDaoImpl2")
private UserDao userDaoImpl2;
4.@Value:注入普通型別屬性
@Value(value = "abc")
private String name; // 將abc注入到屬性name中
完全註解開發
1.建立配置類(新增@Configuration註解),替代xml配置檔案
@Configuration // 作為配置類,替代xml配置檔案
@ComponentScan(basePackages = {"com.day6"})
public class SpringConfig {
}
2.測試類中也需要替換
public class test {
@Test
public void test(){
// 載入配置類
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean("userService", UserService.class);
userService.add();
}
}
總結
我個人認為註解是一種作用於類上的注入方式,很大程度上提升了程式設計師對類的管理,通過觀察就可以知道類的主要資訊,但是卻難以整理,和xml方式相比,只能說各有千秋吧.