javascript
尚学堂Spring视频教程(二):Spring控制反转
用Spring來實現IOC
? 在上節中我們自定義了一個接口BeanFactory和類ClassPathXmlApplicationContext來模擬Spring,其實它們在Spring中確實是存在的,下面我們具體來看看Spring的控制反轉是如何操作的
? 其他代碼一樣,只是配置文件和單元測試的代碼有點不同,注意引用其他bean配置的是"ref"屬性
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl"></bean> <bean id="userService" class="com.bjsxt.service.UserService"><property name="userDAO" ref="u" /></bean></beans> 配置文件 package com.bjsxt.service; import org.junit.Test;import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.ClassPathResource;import com.bjsxt.model.User;//Dependency Injection //Inverse of Control public class UserServiceTest {@Testpublic void testAdd() throws Exception { BeanFactory ctx = new ClassPathXmlApplicationContext("beans.xml");UserService service = (UserService)ctx.getBean("userService");User u = new User();u.setUsername("zhangsan");u.setPassword("zhangsan");service.add(u);}} 測試代碼? 注:ClassPathXmlApplicationContext繼承ApplicationContext,ApplicationContext又繼承BeanFactory,所以也可以這樣寫ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");推薦使用這種寫法。其構造函數也可以傳入String數組,適用于多個配置文件的情況
?
三種注入方式(setter,構造函數,接口)
? setter已經見過了,接口注入很少用,故此忽略,下面來看一下構造函數注入,在UserService中添加一個構造函數初始化UserDAO屬性
package com.bjsxt.service; import com.bjsxt.dao.UserDAO; import com.bjsxt.model.User;public class UserService {private UserDAO userDAO; public void add(User user) {userDAO.save(user);}public UserDAO getUserDAO() {return userDAO;}public void setUserDAO(UserDAO userDAO) {this.userDAO = userDAO;}public UserService(UserDAO userDAO) {super();this.userDAO = userDAO;} } 添加構造函數的UserService <?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/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl"></bean><bean id="userService" class="com.bjsxt.service.UserService"><!-- <property name="userDAO" ref="u" />--><constructor-arg><ref bean="u"/></constructor-arg></bean></beans> 配置文件? 注意用的是constructor-arg標簽,如果構造函數有多個參數,就按照順序寫,或者指定index
?
Bean的Scope屬性
? 配置文件中bean有個scope屬性,如果配置為singleton,表示該bean只有一個實例,如果配置為prototype,每次取出該bean都會創建一個新的對象。bean的scope屬性配置為singleton和prototype,在下面的代碼中會分別輸出true和false
package com.bjsxt.service; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;import com.bjsxt.model.User;//Dependency Injection //Inverse of Control public class UserServiceTest {@Testpublic void testAdd() throws Exception {ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");UserService service = (UserService)ctx.getBean("userService");UserService service2 = (UserService)ctx.getBean("userService");System.out.println(service == service2);User u = new User();u.setUsername("zhangsan");u.setPassword("zhangsan");service.add(u);}} UserService測試scope屬性轉載于:https://www.cnblogs.com/SamFlynn/p/4597718.html
總結
以上是生活随笔為你收集整理的尚学堂Spring视频教程(二):Spring控制反转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态规划--电路布线(circuit l
- 下一篇: MySql远程连接设置