Spring框架基于xml實現(xiàn)自動裝配流程詳解
一、基于xml的自動裝配之場景模擬:
自動裝配:
根據(jù)指定的策略,在IOC容器中匹配某一個bean,自動為指定的bean中所依賴的類類型或接口類 型屬性賦值
場景模擬
①創(chuàng)建類UserController
public class UserController {
private UserService userService;
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public void saveUser() {
userService.saveUser();
}
}創(chuàng)建接口UserService
public interface UserService {
/**
保存用戶信息
*/
void saveUser();
}創(chuàng)建類UserServiceImpl實現(xiàn)接口UserService
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void saveUser() {
System.out.println("保存成功");
}
}創(chuàng)建接口UserDao
public interface UserDao {
/**
* 保存用戶信息
*/
void saveUser();
}創(chuàng)建類UserDaoImpl實現(xiàn)接口UserDao
public class UserDaoImpl implements UserDao {
@Override
public void saveUser() {
System.out.println("保存成功");
}
}②配置bean
<bean id="userController" class="com.tian.spring.controller.UserController">
<property name="userService" ref="userService"></property>
</bean>
<bean id="userService" class="com.tian.spring.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="com.tian.spring.dao.impl.UserDaoImpl"></bean>③測試類:
public class AutowireByXMLTest {
@Test
public void testAutowire() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-autowire-xml.xml");
UserController userController = ioc.getBean(UserController.class);
userController.saveUser();
}
}結(jié)果:
保存成功
二、基于xml的自動裝配之byType
可以通過bean標(biāo)簽中的autowire屬性設(shè)置自動裝配的策略
自動裝配的策略:
1.no,default:表示不裝配,即bean中的屬性不會自動匹配某個bean為屬性賦值,此時屬性使用默認(rèn)值
2.byType:根據(jù)要賦值的屬性的類型,在IOC容器中匹配某個bean,為屬性賦值
注意:
(一些用byType進(jìn)行自動裝配的問題,當(dāng)然不容易見到,這里我也不去演示,知道就可以):
a>若通過類型沒有找到任何一個類型匹配的bean,此時不裝配,屬性使用默認(rèn)值
b>若通過類型找到了多個類型匹配的bean,此時會拋出異常:NoUniqueBeanDefinitionException
總結(jié):
當(dāng)使用byType實現(xiàn)自動裝配時,IOC容器中有且只有一個類型匹配的bean能夠為屬性賦值
3.byName:將要賦值的屬性的屬性名作為bean的id在IOC容器中匹配某個bean,為屬性賦值
總結(jié):
當(dāng)類型匹配的bean有多個時,此時可以使用byName實現(xiàn)自動裝配
配置bean
<bean id="userController" class="com.tian.spring.controller.UserController" autowire="byType">
<!-- <property name="userService" ref="userService"></property>-->
</bean>
<bean id="userService" class="com.tian.spring.service.impl.UserServiceImpl" autowire="byType">
<!-- <property name="userDao" ref="userDao"></property>-->
</bean>
<bean id="userDao" class="com.tian.spring.dao.impl.UserDaoImpl"></bean>經(jīng)過測試發(fā)現(xiàn)也是可以進(jìn)行輸出的
保存成功
三、基于xml的自動裝配之byName
<bean id="userController" class="com.tian.spring.controller.UserController" autowire="byName">
<!-- <property name="userService" ref="userService"></property>-->
</bean>
<bean id="userService" class="com.tian.spring.service.impl.UserServiceImpl" autowire="byName">
<!-- <property name="userDao" ref="userDao"></property>-->
</bean>
<bean id="service" class="com.tian.spring.service.impl.UserServiceImpl" autowire="byName">
<!-- <property name="userDao" ref="userDao"></property>-->
</bean>
<bean id="userDao" class="com.tian.spring.dao.impl.UserDaoImpl"></bean>
<bean id="dao" class="com.tian.spring.dao.impl.UserDaoImpl"></bean>經(jīng)過測試發(fā)現(xiàn)也是可以進(jìn)行輸出的
保存成功
四、基于注解管理bean之功能分析
@Component:將類標(biāo)識為普通組件
@Controller:將類標(biāo)識為控制層組件
@Service:將類標(biāo) 識為業(yè)務(wù)層組件
@Repository:將類標(biāo)識為持久層組件
通過注解+掃描所配置的bean的id,默認(rèn)值為類的小駝峰,即類的首字母為小寫的結(jié)果
可以通過標(biāo)識組件的注解的value屬性值設(shè)置bean的自定義的id
①創(chuàng)建maven工程,并引入相關(guān)依賴
<dependencies>
<!-- 基于Maven依賴傳遞性,導(dǎo)入spring-context依賴即可導(dǎo)入當(dāng)前所需所有jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.23</version>
</dependency>
<!-- junit測試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>②創(chuàng)建組件
創(chuàng)建控制層
@Controller("controller")
public class UserController {
}創(chuàng)建業(yè)務(wù)層
UserService接口
@Repository
public interface UserDao {
}UserServiceImpl實現(xiàn)類
public class UserDaoImpl implements UserDao {
}創(chuàng)建持久層
UserDao接口
public interface UserDao {
}UserDaoImpl實現(xiàn)類
@Repository
public class UserDaoImpl implements UserDao {
}③創(chuàng)建配置文件spring-ioc-annotation.xml
<context:component-scan base-package="com.tian.spring"></context:component-scan>
測試類:
public class IOCByAnnotationTest {
@Test
public void test() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");
UserController userController = ioc.getBean("controller" ,UserController.class);
System.out.println(userController);
UserService userService = ioc.getBean("userServiceImpl",UserService.class);
System.out.println(userService);
UserDao userDao = ioc.getBean("userDaoImpl",UserDao.class);
System.out.println(userDao);
}
}五、基于注解管理bean之掃描組件
context:exclude-filter:排除掃描
type:設(shè)置排除掃描的方式 type="annotation/assignable" annotation:根據(jù)注解的類型進(jìn)行排除,expression需要設(shè)置排除的注解的全類名 assignable:根據(jù)類的類型進(jìn)行排除,expression需要設(shè)置排除的類的全類名
context:include-filter:包含掃描
注意:需要在context:component-scan標(biāo)簽中設(shè)置use-default-filters="false" use-default-filters="true"(默認(rèn)),所設(shè)置的包下所有的類都需要掃描,此時可以使用排除掃描 use-default-filters="false",所設(shè)置的包下所有的類都不需要掃描,此時可以使用包含掃描
情況一,最基本的掃描方式:
<context:component-scan base-package="com.tian.spring"></context:component-scan>
情況二:指定要排除的組件
<context:component-scan base-package="com.tian.spring" use-default-filters="false">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>情況三:僅掃描指定組件
<context:component-scan base-package="com.tian.spring" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>六、基于注解的自動裝配之@Autowired注解能夠標(biāo)識的位置及其原理和注意事項
@Autowired:實現(xiàn)自動裝配功能的注解
1)@Autowired注解能夠標(biāo)識的位置
a>標(biāo)識在成員變量上,此時不需要設(shè)置成員變量的set方法
b>標(biāo)識在set方法上
c>為當(dāng)前成員變量賦值的有參構(gòu)造上
2)@Autowired注解的原理
a>默認(rèn)通過byType的方式,在IOC容器中通過類型匹配某個bean為屬性賦值
b>若有多個類型匹配的bean,此時會自動轉(zhuǎn)換為byName的方式實現(xiàn)自動裝配的效果
即將要賦值的屬性的屬性名作為bean的id匹配某個bean為屬性賦值
c>若byType和byName的方式都無法實現(xiàn)自動裝配,即IOC容器中有多個類型匹配的bean
且這些bean的id和要賦值的屬性的屬性名都不一致,此時拋異常:NoUniqueBeanDefinitionException
d>此時可以在要賦值的屬性上,添加注解@Qualifier
通過該注解的value屬性值,指定某個bean的id,將這個bean為屬性賦值
3)注意:
若IOC容器中沒有任何一個類型匹配的bean,此時拋出異常NoSuchBeanDefinitionException
在@Autowired注解中有個屬性required,默認(rèn)值為true,要求必須完成自動裝配
可以將required設(shè)置為false,此時能裝配則裝配,無法裝配則使用屬性的默認(rèn)值
(由于一個類型的bean不可能在IOC容器中配置多次,所以這種情況一般不會出現(xiàn))
1)@Autowired:實現(xiàn)自動裝配功能的注解
方式一:
@Autowired
private UserService userService;方式二:
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}方式三:
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
到此這篇關(guān)于Spring框架基于xml實現(xiàn)自動裝配流程詳解的文章就介紹到這了,更多相關(guān)Spring自動裝配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot數(shù)據(jù)庫恢復(fù)的兩種方法mysqldump和mysqlbinlog
binlog用來實現(xiàn)主從復(fù)制,也常用來誤刪數(shù)據(jù)庫找回丟失的記錄,本文主要介紹了SpringBoot數(shù)據(jù)庫恢復(fù)的兩種方法mysqldump和mysqlbinlog,具有一定的參考價值,感興趣的可以了解一下2024-01-01
SpringBoot?對接飛書多維表格事件回調(diào)監(jiān)聽流程分析
本文介紹了如何通過飛書事件訂閱機(jī)制和SpringBoot項目集成,對多維表數(shù)據(jù)的記錄變更進(jìn)行對接的詳細(xì)流程,包括如何創(chuàng)建應(yīng)用、配置參數(shù)、編寫訂閱代碼、訂閱文檔事件以及在SpringBoot工程中集成的步驟,感興趣的朋友跟隨小編一起看看吧2024-12-12
java利用冒泡排序?qū)?shù)組進(jìn)行排序
這篇文章主要介紹了java利用冒泡排序?qū)?shù)組進(jìn)行排序的方法,實例分析了冒泡排序的概念與java實現(xiàn)方法,以及java操作數(shù)組的相關(guān)技巧,需要的朋友可以參考下2015-05-05
java實現(xiàn)后臺數(shù)據(jù)顯示在前端
這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)后臺數(shù)據(jù)顯示在前端,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02
SpringBoot打包成Docker鏡像的幾種實現(xiàn)方式
Spring Boot是一個用于構(gòu)建獨立的、可執(zhí)行的Spring應(yīng)用程序的框架,結(jié)合使用Spring Boot和Docker,可以方便地將應(yīng)用程序部署到不同的環(huán)境中本文,主要介紹了SpringBoot打包成Docker鏡像的幾種實現(xiàn)方式,感興趣的可以了解一下2024-01-01

