Spring框架基於xml實現自動裝配流程詳解
一、基於xml的自動裝配之場景模擬:
自動裝配:
根據指定的策略,在IOC容器中匹配某一個bean,自動為指定的bean中所依賴的類類型或接口類 型屬性賦值
場景模擬
①創建類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(); } }
創建接口UserService
public interface UserService { /** 保存用戶信息 */ void saveUser(); }
創建類UserServiceImpl實現接口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("保存成功"); } }
創建接口UserDao
public interface UserDao { /** * 保存用戶信息 */ void saveUser(); }
創建類UserDaoImpl實現接口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(); } }
結果:
保存成功
二、基於xml的自動裝配之byType
可以通過bean標簽中的autowire屬性設置自動裝配的策略
自動裝配的策略:
1.no,default:表示不裝配,即bean中的屬性不會自動匹配某個bean為屬性賦值,此時屬性使用默認值
2.byType:根據要賦值的屬性的類型,在IOC容器中匹配某個bean,為屬性賦值
註意:
(一些用byType進行自動裝配的問題,當然不容易見到,這裡我也不去演示,知道就可以):
a>若通過類型沒有找到任何一個類型匹配的bean,此時不裝配,屬性使用默認值
b>若通過類型找到瞭多個類型匹配的bean,此時會拋出異常:NoUniqueBeanDefinitionException
總結:
當使用byType實現自動裝配時,IOC容器中有且隻有一個類型匹配的bean能夠為屬性賦值
3.byName:將要賦值的屬性的屬性名作為bean的id在IOC容器中匹配某個bean,為屬性賦值
總結:
當類型匹配的bean有多個時,此時可以使用byName實現自動裝配
配置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>
經過測試發現也是可以進行輸出的
保存成功
三、基於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>
經過測試發現也是可以進行輸出的
保存成功
四、基於註解管理bean之功能分析
@Component:將類標識為普通組件
@Controller:將類標識為控制層組件
@Service:將類標 識為業務層組件
@Repository:將類標識為持久層組件
通過註解+掃描所配置的bean的id,默認值為類的小駝峰,即類的首字母為小寫的結果
可以通過標識組件的註解的value屬性值設置bean的自定義的id
①創建maven工程,並引入相關依賴
<dependencies> <!-- 基於Maven依賴傳遞性,導入spring-context依賴即可導入當前所需所有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>
②創建組件
創建控制層
@Controller("controller") public class UserController { }
創建業務層
UserService接口
@Repository public interface UserDao { }
UserServiceImpl實現類
public class UserDaoImpl implements UserDao { }
創建持久層
UserDao接口
public interface UserDao { }
UserDaoImpl實現類
@Repository public class UserDaoImpl implements UserDao { }
③創建配置文件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:設置排除掃描的方式 type="annotation/assignable" annotation:根據註解的類型進行排除,expression需要設置排除的註解的全類名 assignable:根據類的類型進行排除,expression需要設置排除的類的全類名
context:include-filter:包含掃描
註意:需要在context:component-scan標簽中設置use-default-filters="false" use-default-filters="true"(默認),所設置的包下所有的類都需要掃描,此時可以使用排除掃描 use-default-filters="false",所設置的包下所有的類都不需要掃描,此時可以使用包含掃描
情況一,最基本的掃描方式:
<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註解能夠標識的位置及其原理和註意事項
@Autowired:實現自動裝配功能的註解
1)@Autowired註解能夠標識的位置
a>標識在成員變量上,此時不需要設置成員變量的set方法
b>標識在set方法上
c>為當前成員變量賦值的有參構造上
2)@Autowired註解的原理
a>默認通過byType的方式,在IOC容器中通過類型匹配某個bean為屬性賦值
b>若有多個類型匹配的bean,此時會自動轉換為byName的方式實現自動裝配的效果
即將要賦值的屬性的屬性名作為bean的id匹配某個bean為屬性賦值
c>若byType和byName的方式都無法實現自動裝配,即IOC容器中有多個類型匹配的bean
且這些bean的id和要賦值的屬性的屬性名都不一致,此時拋異常:NoUniqueBeanDefinitionException
d>此時可以在要賦值的屬性上,添加註解@Qualifier
通過該註解的value屬性值,指定某個bean的id,將這個bean為屬性賦值
3)註意:
若IOC容器中沒有任何一個類型匹配的bean,此時拋出異常NoSuchBeanDefinitionException
在@Autowired註解中有個屬性required,默認值為true,要求必須完成自動裝配
可以將required設置為false,此時能裝配則裝配,無法裝配則使用屬性的默認值
(由於一個類型的bean不可能在IOC容器中配置多次,所以這種情況一般不會出現)
1)@Autowired:實現自動裝配功能的註解
方式一:
@Autowired private UserService userService;
方式二:
@Autowired public void setUserService(UserService userService) { this.userService = userService; }
方式三:
@Autowired public UserController(UserService userService) { this.userService = userService; }
到此這篇關於Spring框架基於xml實現自動裝配流程詳解的文章就介紹到這瞭,更多相關Spring自動裝配內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java Spring框架簡介與Spring IOC詳解
- Java 自定義Spring框架以及Spring框架的基本使用
- Java基礎之Spring5的核心之一IOC容器
- Spring的@Autowired加到接口上但獲取的是實現類的問題
- Spring入門到精通之Bean標簽詳解