> 本質上:所有一切的操作都是Java代碼來完成的,XML和註解只是告訴框架中的Java代碼如何執行。 ## 7.1、環境搭建 > 創建名為spring_ioc_annotation的新module,過程參考[3.1節](https://www.cnblogs.com/Javaer1995/p/17 ...
本質上:所有一切的操作都是Java代碼來完成的,XML和註解只是告訴框架中的Java代碼如何執行。
7.1、環境搭建
創建名為spring_ioc_annotation的新module,過程參考3.1節
7.1.1、創建spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
7.1.2、創建UserDao介面及實現類
package org.rain.spring.dao;
/**
* @author liaojy
* @date 2023/8/5 - 18:32
*/
public interface UserDao {
}
package org.rain.spring.dao.impl;
import org.rain.spring.dao.UserDao;
/**
* @author liaojy
* @date 2023/8/5 - 18:33
*/
public class UserDaoImpl implements UserDao {
}
7.1.3、創建UserService介面及實現類
package org.rain.spring.service;
/**
* @author liaojy
* @date 2023/8/5 - 18:35
*/
public interface UserService {
}
package org.rain.spring.service.impl;
import org.rain.spring.service.UserService;
/**
* @author liaojy
* @date 2023/8/5 - 18:36
*/
public class UserServiceImpl implements UserService {
}
7.1.4、創建UserController
package org.rain.spring.controller;
/**
* @author liaojy
* @date 2023/8/5 - 18:38
*/
public class UserController {
}
7.2、註解和掃描
7.2.1、標識組件的常用註解
註解 | 含義 |
---|---|
@Component | 將類標識為普通組件 |
@Controller | 將類標識為控制層組件 |
@Service | 將類標識為業務層組件 |
@Repository | 將類標識為持久層組件 |
@Controller、@Service、@Repository這三個註解只是在@Component註解的基礎上起了三個新的名字
從Spring使用IOC容器管理bean組件的角度來看,這四個組件註解沒有區別
@Controller、@Service、@Repository這三個註解只是為了讓開發人員便於分辨組件的作用
7.2.2、使用組件註解
7.2.2.1、@Controller註解
package org.rain.spring.controller;
import org.springframework.stereotype.Controller;
/**
* @author liaojy
* @date 2023/8/5 - 18:38
*/
@Controller
public class UserController {
}
7.2.2.2、@Service註解
註意:組件註解只能用於實現類,不能用於介面;因為bean的class屬性只能是實現類,不能是介面
package org.rain.spring.service.impl;
import org.rain.spring.service.UserService;
import org.springframework.stereotype.Service;
/**
* @author liaojy
* @date 2023/8/5 - 18:36
*/
@Service
public class UserServiceImpl implements UserService {
}
7.2.2.3、@Repository註解
註意:組件註解只能用於實現類,不能用於介面;因為bean的class屬性只能是實現類,不能是介面
package org.rain.spring.dao.impl;
import org.rain.spring.dao.UserDao;
import org.springframework.stereotype.Repository;
/**
* @author liaojy
* @date 2023/8/5 - 18:33
*/
@Repository
public class UserDaoImpl implements UserDao {
}
7.2.3、掃描組件註解
註意:為了減少掃描的耗時,推薦儘可能精確地指定package
<?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 https://www.springframework.org/schema/context/spring-context.xsd">
<!--
對指定的package進行掃描,將使用組件註解的類的對象,交給spring的ioc容器來管理
-->
<context:component-scan base-package="org.rain.spring.controller"></context:component-scan>
<context:component-scan base-package="org.rain.spring.service"></context:component-scan>
<context:component-scan base-package="org.rain.spring.dao"></context:component-scan>
</beans>
7.2.4、測試
package org.rain.spring.test;
import org.junit.Test;
import org.rain.spring.controller.UserController;
import org.rain.spring.dao.UserDao;
import org.rain.spring.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author liaojy
* @date 2023/8/5 - 19:18
*/
public class IOCByAnnotationTest {
@Test
public void testAutowireByAnnotation(){
ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");
UserController userController = ioc.getBean(UserController.class);
System.out.println(userController);
UserService userService = ioc.getBean(UserService.class);
System.out.println(userService);
UserDao userDao = ioc.getBean(UserDao.class);
System.out.println(userDao);
}
}
7.3、高級掃描
7.3.1、排除掃描指定組件
7.3.1.1、方式一:根據註解指定排除(常用)
<!--
對指定的package進行掃描,將使用組件註解的類的對象,交給spring的ioc容器來管理
-->
<context:component-scan base-package="org.rain.spring">
<!-- context:exclude-filter標簽:指定排除規則 -->
<!--
type屬性:設置排除的方式;
type="annotation",根據註解排除,expression中設置要排除的註解的全類名
type="assignable",根據類型排除,expression中設置要排除的類型的全類名
-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
7.3.1.2、方式二:根據類型指定排除
<!--
對指定的package進行掃描,將使用組件註解的類的對象,交給spring的ioc容器來管理
-->
<context:component-scan base-package="org.rain.spring">
<!-- context:exclude-filter標簽:指定排除規則 -->
<!--
type屬性:設置排除的方式;
type="annotation",根據註解排除,expression中設置要排除的註解的全類名
type="assignable",根據類型排除,expression中設置要排除的類型的全類名
-->
<context:exclude-filter type="assignable" expression="org.rain.spring.controller.UserController"/>
</context:component-scan>
7.3.2、僅掃描指定組件
7.3.2.1、方式一:根據註解指定包含(常用)
<!--
對指定的package進行掃描,將使用組件註解的類的對象,交給spring的ioc容器來管理
-->
<!-- use-default-filters屬性:取值false表示關閉預設掃描規則 -->
<!-- 此時必須設置use-default-filters="false",因為預設規則即掃描指定包下所有類 -->
<context:component-scan base-package="org.rain.spring" use-default-filters="false">
<!-- context:include-filter標簽:指定在原有掃描規則的基礎上追加的規則 -->
<!--
type屬性:設置追加的方式;
type="annotation",根據註解追加,expression中設置要追加的註解的全類名
type="assignable",根據類型追加,expression中設置要追加的類型的全類名
-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
7.3.2.2、方式二:根據類型指定包含
<!--
對指定的package進行掃描,將使用組件註解的類的對象,交給spring的ioc容器來管理
-->
<!-- use-default-filters屬性:取值false表示關閉預設掃描規則 -->
<!-- 此時必須設置use-default-filters="false",因為預設規則即掃描指定包下所有類 -->
<context:component-scan base-package="org.rain.spring" use-default-filters="false">
<!-- context:include-filter標簽:指定在原有掃描規則的基礎上追加的規則 -->
<!--
type屬性:設置追加的方式;
type="annotation",根據註解追加,expression中設置要追加的註解的全類名
type="assignable",根據類型追加,expression中設置要追加的類型的全類名
-->
<context:include-filter type="assignable" expression="org.rain.spring.controller.UserController"/>
</context:component-scan>
7.4、註解組件的id
7.4.1、預設情況
通過註解+掃描所配置的bean的id,預設值為類的小駝峰;即UserController類對應的bean的id就是userController
7.4.2、自定義
可通過標識組件的註解的value屬性設置自定義的bean的id