Spring框架基于xml實(shí)現(xiàn)自動(dòng)裝配流程詳解
一、基于xml的自動(dòng)裝配之場(chǎng)景模擬:
自動(dòng)裝配:
根據(jù)指定的策略,在IOC容器中匹配某一個(gè)bean,自動(dòng)為指定的bean中所依賴的類類型或接口類 型屬性賦值
場(chǎng)景模擬
①創(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實(shí)現(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實(shí)現(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>
③測(cè)試類:
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的自動(dòng)裝配之byType
可以通過(guò)bean標(biāo)簽中的autowire屬性設(shè)置自動(dòng)裝配的策略
自動(dòng)裝配的策略:
1.no,default:表示不裝配,即bean中的屬性不會(huì)自動(dòng)匹配某個(gè)bean為屬性賦值,此時(shí)屬性使用默認(rèn)值
2.byType:根據(jù)要賦值的屬性的類型,在IOC容器中匹配某個(gè)bean,為屬性賦值
注意:
(一些用byType進(jìn)行自動(dòng)裝配的問(wèn)題,當(dāng)然不容易見到,這里我也不去演示,知道就可以):
a>若通過(guò)類型沒有找到任何一個(gè)類型匹配的bean,此時(shí)不裝配,屬性使用默認(rèn)值
b>若通過(guò)類型找到了多個(gè)類型匹配的bean,此時(shí)會(huì)拋出異常:NoUniqueBeanDefinitionException
總結(jié):
當(dāng)使用byType實(shí)現(xiàn)自動(dòng)裝配時(shí),IOC容器中有且只有一個(gè)類型匹配的bean能夠?yàn)閷傩再x值
3.byName:將要賦值的屬性的屬性名作為bean的id在IOC容器中匹配某個(gè)bean,為屬性賦值
總結(jié):
當(dāng)類型匹配的bean有多個(gè)時(shí),此時(shí)可以使用byName實(shí)現(xiàn)自動(dòng)裝配
配置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)過(guò)測(cè)試發(fā)現(xiàn)也是可以進(jìn)行輸出的
保存成功
三、基于xml的自動(dòng)裝配之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)過(guò)測(cè)試發(fā)現(xiàn)也是可以進(jìn)行輸出的
保存成功
四、基于注解管理bean之功能分析
@Component:將類標(biāo)識(shí)為普通組件
@Controller:將類標(biāo)識(shí)為控制層組件
@Service:將類標(biāo) 識(shí)為業(yè)務(wù)層組件
@Repository:將類標(biāo)識(shí)為持久層組件
通過(guò)注解+掃描所配置的bean的id,默認(rèn)值為類的小駝峰,即類的首字母為小寫的結(jié)果
可以通過(guò)標(biāo)識(shí)組件的注解的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測(cè)試 --> <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實(shí)現(xiàn)類
public class UserDaoImpl implements UserDao { }
創(chuàng)建持久層
UserDao接口
public interface UserDao { }
UserDaoImpl實(shí)現(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>
測(cè)試類:
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è)置的包下所有的類都需要掃描,此時(shí)可以使用排除掃描 use-default-filters="false",所設(shè)置的包下所有的類都不需要掃描,此時(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>
六、基于注解的自動(dòng)裝配之@Autowired注解能夠標(biāo)識(shí)的位置及其原理和注意事項(xiàng)
@Autowired:實(shí)現(xiàn)自動(dòng)裝配功能的注解
1)@Autowired注解能夠標(biāo)識(shí)的位置
a>標(biāo)識(shí)在成員變量上,此時(shí)不需要設(shè)置成員變量的set方法
b>標(biāo)識(shí)在set方法上
c>為當(dāng)前成員變量賦值的有參構(gòu)造上
2)@Autowired注解的原理
a>默認(rèn)通過(guò)byType的方式,在IOC容器中通過(guò)類型匹配某個(gè)bean為屬性賦值
b>若有多個(gè)類型匹配的bean,此時(shí)會(huì)自動(dòng)轉(zhuǎn)換為byName的方式實(shí)現(xiàn)自動(dòng)裝配的效果
即將要賦值的屬性的屬性名作為bean的id匹配某個(gè)bean為屬性賦值
c>若byType和byName的方式都無(wú)法實(shí)現(xiàn)自動(dòng)裝配,即IOC容器中有多個(gè)類型匹配的bean
且這些bean的id和要賦值的屬性的屬性名都不一致,此時(shí)拋異常:NoUniqueBeanDefinitionException
d>此時(shí)可以在要賦值的屬性上,添加注解@Qualifier
通過(guò)該注解的value屬性值,指定某個(gè)bean的id,將這個(gè)bean為屬性賦值
3)注意:
若IOC容器中沒有任何一個(gè)類型匹配的bean,此時(shí)拋出異常NoSuchBeanDefinitionException
在@Autowired注解中有個(gè)屬性required,默認(rèn)值為true,要求必須完成自動(dòng)裝配
可以將required設(shè)置為false,此時(shí)能裝配則裝配,無(wú)法裝配則使用屬性的默認(rèn)值
(由于一個(gè)類型的bean不可能在IOC容器中配置多次,所以這種情況一般不會(huì)出現(xiàn))
1)@Autowired:實(shí)現(xiàn)自動(dòng)裝配功能的注解
方式一:
@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實(shí)現(xiàn)自動(dòng)裝配流程詳解的文章就介紹到這了,更多相關(guān)Spring自動(dòng)裝配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
因不會(huì)遠(yuǎn)程debug調(diào)試我被項(xiàng)目經(jīng)理嘲笑了
這篇文章主要介紹了遠(yuǎn)程debug調(diào)試的相關(guān)內(nèi)容,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08JavaEE通過(guò)response實(shí)現(xiàn)請(qǐng)求重定向
這篇文章主要介紹了JavaEE通過(guò)response實(shí)現(xiàn)請(qǐng)求重定向的方法,非常的簡(jiǎn)單實(shí)用,有需要的朋友可以參考下2014-10-10SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解
這篇文章主要介紹了SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解,@EnableWebSecurity是Spring?Security用于啟用Web安全的注解,典型的用法是該注解用在某個(gè)Web安全配置類上,實(shí)現(xiàn)了接口,需要的朋友可以參考下2023-12-12Java布爾值Boolean和boolean之間轉(zhuǎn)換實(shí)例用法
在本篇文章里小編給大家整理的是一篇關(guān)于Java布爾值Boolean和boolean之間轉(zhuǎn)換實(shí)例用法內(nèi)容,有需要的朋友們跟著學(xué)習(xí)參考下。2021-06-06Elasticsearch 基礎(chǔ)介紹及索引原理分析
這篇文章主要介紹了Elasticsearch 基礎(chǔ)介紹及索引原理分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07java實(shí)現(xiàn)給出分?jǐn)?shù)數(shù)組得到對(duì)應(yīng)名次數(shù)組的方法
這篇文章主要介紹了java實(shí)現(xiàn)給出分?jǐn)?shù)數(shù)組得到對(duì)應(yīng)名次數(shù)組的方法,涉及java針對(duì)數(shù)組的遍歷、排序及運(yùn)算的相關(guān)技巧,需要的朋友可以參考下2015-07-07Java利用遞歸算法實(shí)現(xiàn)查詢斐波那契數(shù)
今天小編就為大家分享一篇關(guān)于Java利用遞歸算法實(shí)現(xiàn)查詢斐波那契數(shù),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12