Spring學習筆記(一)
一、Spring 框架
Spring 是一個開源框架,是為了解決企業應用程序開發復雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許您選擇使用哪一個組件,同時為 J2EE 應用程序開發提供集成的框架。
Spring框架由七個模塊組成:核心容器、應用上下文(Context)模塊、Spring的AOP模塊、JDBC抽象和DAO模塊、對象/關系映射集成模塊、Spring的Web模塊、Spring的MVC框架。
二、關於學習Spring框架之前自身的疑惑
1 Spring框架是如何對項目進行有效管理的?
三、學習開始
3.1 准備好Spring的說明書 http://docs.spring.io/spring/docs/
3.2 准備Spring的JAR包 spring-framework-3.0.0.RELEASE
3.3 先寫一點測試代碼(不使用Spring框架),然后再引入Spring框架進行管理,對比前后者代碼的不同之處
測試代碼邏輯:
1 UserServiceImpl調用 UserDao(接口) 完成對User對象的保存和更新
2 UserDao(接口) 有兩種實現UserDaoImpl和UserDaoImpl2
UserServiceImpl
1 package com.serviceImpl; 2 3 import com.dao.UserDao; 4 import com.daoImpl.UserDaoImpl; 5 import com.entity.User; 6 7 public class UserServiceImpl { 8 private UserDao userDao; 9 10 public void add(User user) { 11 userDao = new UserDaoImpl(); //UserDaoImpl實現接口 12 userDao.save(user); 13 } 14 15 public void modify(User user) { 16 userDao = new UserDaoImpl();//UserDaoImpl實現接口 17 userDao.update(user); 18 } 19 20 public UserDao getUserDao() { 21 return userDao; 22 } 23 public void setUserDao(UserDao userDao) { 24 this.userDao = userDao; 25 } 26 }
UserDao(接口)
package com.dao; import com.entity.User; public interface UserDao { public void save(User user); public void update(User user); }
UserDao的實現類UserDaoImp
1 package com.daoImpl; 2 3 import com.dao.UserDao; 4 import com.entity.User; 5 6 public class UserDaoImpl implements UserDao{ 7 8 public void save(User user) { 9 System.out.println(user.getName()+"-->"+user.getRemark()+" save --調用UserDaoImpl!"); 10 } 11 12 public void update(User user) { 13 System.out.println(user.getName()+"-->"+user.getRemark()+" update --調用UserDaoImpl!"); 14 } 15 }
UserDao的另一個實現類UserDaoImpl2
package com.daoImpl; import com.dao.UserDao; import com.entity.User; public class UserDaoImpl2 implements UserDao{ public void save(User user) { System.out.println(user.getName()+"-->"+user.getRemark()+" save --調用UserDaoImpl2!"); } public void update(User user) { System.out.println(user.getName()+"-->"+user.getRemark()+" update --調用UserDaoImpl2!"); } }
最后給一個測試類(方便使用)
package com.serviceImpl.test; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import com.entity.User; import com.serviceImpl.UserServiceImpl; public class UserServiceImplTest { User user; @Before public void setUp() throws Exception { user = new User(); user.setName("testName"); user.setRemark("testRemark"); } @Test public void testAdd() { UserServiceImpl userServiceImpl = new UserServiceImpl(); userServiceImpl.add(user); } @Test public void testModify() { UserServiceImpl userServiceImpl = new UserServiceImpl(); userServiceImpl.modify(user); } }
測試代碼完成(未使用Spring框架)。
執行結果:
testName-->testRemark save --調用UserDaoImpl!
testName-->testRemark update --調用UserDaoImpl!
以上代碼及執行結果可以看出
1 UserDao接口的實現方式是通過UserServiceImpl類里的代碼管理的。
2 如果我們需要改變UserDao接口的實現方式則需要改動UserServiceImpl的代碼 例如
userDao = new UserDaoImpl(); ----> userDao = new UserDaoImpl2(); //UserDaoImpl改成UserDaoImpl2
3.4 使用Spring框架進行管理
1 導入spring JAR包
2 在src目錄下創建Beans.xml,剪切spring說明書中的basic structure of XML-based configuration metadata代碼,粘貼進Beans.xml
<?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"> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <!-- more bean definitions go here --> </beans>
3 對應於我們的項目開始進行Beans.xml的詳細配置(目前寫的Beans.xml 里對接口的注入是通過set方法,是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"> <!--Spring框架beans.xml配置文件的基礎:一個bean和一個對應的類,然后對bean進行統一的管理 --> <!--userDao的第一種實現方法映射的 bean -> userDaoImpl--> <bean id="userDaoImpl" class="com.daoImpl.UserDaoImpl"> </bean> <!--userDao的第二種實現方法映射的 bean -> userDaoImpl2--> <bean id="userDaoImpl2" class="com.daoImpl.UserDaoImpl2"> </bean> <!--UserServiceImpl映射的 bean -> userServiceImpl--> <!--在這個bean里 我們來配置userDao的實現類對應的bean,引入property標簽。 1 name對應當前bean(類)里面的變量名 private UserDao userDao; 2 ref表示所關聯是哪個bean。 這里我們關聯上userDaoImpl2也就是第二種實現方式 class="com.daoImpl.UserDaoImpl2"; 3 完成1,2后,我們可以去把com.serviceImpl.UserServiceImpl文件里,原本在代碼里NEW 出實現類的那段話給去掉,spring已經開始進行管理了。 --> <bean id="userServiceImpl" class="com.serviceImpl.UserServiceImpl"> <property name="userDao" ref="userDaoImpl"> </property> </bean> </beans>
4 刪除UserServiceImpl類里對接口實現方式控制的代碼
package com.serviceImpl; import com.dao.UserDao; import com.daoImpl.UserDaoImpl; import com.entity.User; public class UserServiceImpl { private UserDao userDao; public void add(User user) { // userDao = new UserDaoImpl(); //已經不需要我們在程序里面再NEW實現類了 userDao.save(user); } public void modify(User user) { // userDao = new UserDaoImpl();//已經不需要我們在程序里面再NEW實現類了 userDao.update(user); } public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
5 已經完成了Spring的配置,現在對測試文件UserServiceImplTest進行修改,執行查看效果
package com.serviceImpl.test; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.entity.User; import com.serviceImpl.UserServiceImpl; public class UserServiceImplTest { User user; @Before public void setUp() throws Exception { user = new User(); user.setName("testName"); user.setRemark("testRemark"); } @Test public void testAdd() { ApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");//通過ClassPathXmlApplicationContext獲取beans.xml信息-->app UserServiceImpl UserServiceImpl = (UserServiceImpl)app.getBean("userServiceImpl");//通過app NEW出具體bean對應的類,注意需要轉換類型 UserServiceImpl.add(user);//調用方法 } @Test public void testModify() { ApplicationContext app = new ClassPathXmlApplicationContext("beans.xml"); UserServiceImpl UserServiceImpl = (UserServiceImpl)app.getBean("userServiceImpl"); UserServiceImpl.modify(user); } }
6 執行結果(UserDao接口的實現為bean里配置的userDaoImpl)
testName-->testRemark save --調用UserDaoImpl2!
testName-->testRemark update --調用UserDaoImpl2!
7 如果要更換UserDao的實現,有了spring進行管理,我們只要去對beans.xml進行修改即可
<?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"> <bean id="userDaoImpl" class="com.daoImpl.UserDaoImpl"> </bean> <bean id="userDaoImpl2" class="com.daoImpl.UserDaoImpl2"> </bean> <bean id="userServiceImpl" class="com.serviceImpl.UserServiceImpl"> <property name="userDao" ref="userDaoImpl"> </property> <!-- 修改 ref="userDaoImpl"--> </bean> </beans>
8 再次查看執行的結果(UserDao接口的實現已經更換成userDaoImpl)
testName-->testRemark save --調用UserDaoImpl!
testName-->testRemark update --調用UserDaoImpl!
9 到此,Spring的部署及簡單應用已經完成。
總結一下
1 Spring 是通過配置beans.xml 來對類和接口進行管理
2 具體的操作:
一 配置beans.xml 並刪除代碼里原本用來管理接口實現的代碼
二 改寫調用的方法 ClassPathXmlApplicationContext("xmlProfile").getBean("beanName");
3 對比原先的測試代碼與用了Spring管理的后測試代碼
一 程序的擴展性變強,只需要通過配置文件便可以進行管理,例如修改接口的實現方式變得非常簡單。
二 程序的可閱讀性提高,不需要進入代碼層面進行閱讀接口實現的方式,只需要在配置文件中查看即可。