Spring Framework介紹 Spring是一個屬於java/j2ee的架構級框架,可以適用於java桌面系統或j2ee企業系統。它借助IoC(Inversion of Control)設計模式,對系統的各個模塊Bean進行管理,實現系統的松耦合。借助AOP思想實現以聲明式方式使用企業級服務,例如事務服務。 當系統的各個模塊象一塊塊積木搭建起來之後,Spring就象粘合劑把各個模塊粘合在一起,並進行有效的控制。 Spring框架可以提供一站式的企業應用,包括了在表示層它實現了一個MVC、對JDBC、HIBERNATE等的支持、提供STRUTS的支持。Spring是組件化的,可以使用它提供的所有應用,也可以選用其中的一個或二個組件,在應用中更多是使用它提供的依賴注入Bean管理、事務性管理。 一、應用示例 ■通過Spring的配置文件調用類的方法,輸入字符“Hello World” 編寫一個接口類 Public interface Ihello{ public String getHello(); public String getStr(); } 編寫接口實現類 Public class Hello implements Ihello{ private String hello; public void setHello(String hello){ this.hello=hello; } public String getHello() { return this.hello; } public String getStr() { return "test Spring"; } } 編寫Spring配置文件AppcontextHello.xml <?xml version="1.0" encoding="UTF-8"?>
<beans> <bean id="hello" class="com.spring.test.Hello">
<value>Hello World!!!!!!!!!</value> </property> </bean> </beans>
編寫輸入類 public class HelloWorld { public static void main(String[] args) { AbstractApplicationContext appContext= new ClassPathXmlApplicationContext("/AppcontextHello.xml"); IHello hello=(IHello)appContext.getBean("hello"); System.out.println(hello.getHello()); System.out.println(hello.getStr()); } } 只要對接口編程,並不用知道是那個類實現了接口,所以如果要更換Hello實現類,只要修改配置文件只可。例如要把Hello換成HelloBaby,接口實現類如下:
private String hello; public void setHello(String hello){ this.hello=hello; } public String getHello() { return this.hello; } public String getStr() { return "Hello Baby"; } Spring 配置文件修改如下: <bean id="hello" class="com.spring.test.HelloBaby"> 這樣就完成的接口實現類的切換。
■下一個例子將顯示在Spring的Bean管理中注入數據源,實現更強的注入功能,這樣就可以自由地切換不同的數據庫類型和數據源了。 以下的例子將讀取數據表Book的一行記錄。Book有id、bookname(varchar10)、author(varchar10)、price三個字段。
新建值對象Book public class Book { private int id; private String bookname; private String author; private float price; public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } //以下省略了部分SET、GET方法 }
新建接口IbookDAO public interface IbookDAO { public Book getBook();
}
實現接口的數據訪問類BookDAO public class BookDAO implements IbookDAO { private DataSource datasource; public void setDatasource(DataSource datasource){ this.datasource=datasource; }
public Book getBook() { // TODO 自動產生方法 Stub Book book=new Book(); Connection conn=null; Statement stmt=null; ResultSet rs=null; try{ conn=datasource.getConnection(); stmt=conn.createStatement(); rs=stmt.executeQuery("select top 1 id,bookname,author,price from book"); if(rs.next()){ book.setId(rs.getInt("id")); book.setBookname(rs.getString("bookname")); book.setAuthor(rs.getString("author")); book.setPrice(rs.getFloat("price")); } }catch(SQLException e){ e.printStackTrace(); }finally{ try{ if(rs!=null){ rs.close(); rs=null; } if(stmt!=null){ stmt.close(); stmt=null; } if(conn!=null){ conn.close(); conn=null; } }catch(Exception ex){ ex.printStackTrace(); } } return book; } }
Spring 配置文件AppcontextDataSource.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www./dtd/spring-beans.dtd" > <beans> <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value> </property> <property name="url"> <value>jdbc:microsoft:sqlserver://222.118.20.108;DatabaseName=zmlftest</value> </property> <property name="username"> <value>dbname</value> </property> <property name="password"> <value>access</value> </property> </bean> <bean id="bookDAO" class="com.spring.test.book.BookDAO"> <property name="datasource"> <ref local="myDataSource" /> </property> </bean> </beans> 以上定義了數據源,定義Bean”bookDAO”時把datasource注入
編寫調用類BookClient public class BookClient { public static void main(String[] args) { AbstractApplicationContext appContext= new ClassPathXmlApplicationContext("/AppcontextDataSource.xml"); IbookDAO bookdao=(IbookDAO)appContext.getBean("bookDAO"); Book book=bookdao.getBook(); System.out.println(book.getId()); System.out.println(book.getBookname()); System.out.println(book.getAuthor()); System.out.println(book.getPrice()); } }
■利用Spring進行事務管理 該示例演示在一個方法中同時插入二條記錄,當其中一個操作出錯時,進行回滾。 數據訪問接口IbookDAO.java實現一個插入記錄方法。 public interface IbookDAO { public void saveBook(Book book) throws DataAccessException; }
數據訪問類BookDAO.java,它擴展了Spring的JDBC基類,方法的代碼變得很簡潔。 public class BookDAO extends JdbcDaoSupport implements IbookDAO{
public void saveBook(Book book) throws DataAccessException { this.getJdbcTemplate().execute("insert into book(bookname,author,price) values(‘"+book.getBookname()+"‘,‘"+book.getAuthor()+"‘,‘"+book.getPrice()+"‘)"); } }
業務接口IbookService.java。 public interface IbookService { public void saveBook()throws DataAccessException;
}
實現業務方法BookService.java public class BookService implements IbookService { private IbookDAO bookdao; public void setBookdao(IbookDAO bookdao){ this.bookdao=bookdao; }
public void saveBook()throws DataAccessException { // TODO 自動產生方法 Stub //AbstractApplicationContext appContext= new ClassPathXmlApplicationContext("/AppcontextTran.xml"); //IbookDAO bookdao=(IbookDAO)appContext.getBean("bookDAO"); Book book1=new Book(); book1.setBookname("bookname1"); book1.setAuthor("author1"); book1.setPrice(Float.parseFloat("1.2")); Book book2=new Book(); book2.setBookname("bookname2"); book2.setAuthor("author2"); book2.setPrice(Float.parseFloat("2.6")); bookdao.saveBook(book1); bookdao.saveBook(book2); } }
Spring配置文件AppcontextTran.xml 主要的代碼如下: <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref local="myDataSource" /> </property> </bean> <bean id="bookDAO" class="com.spring.test.tran.BookDAO"> <property name="dataSource"> <ref local="myDataSource" /> </property> </bean> <bean name="txProxyTemplate" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true"> <property name="transactionManager" ref="transactionManager" /> <property name="transactionAttributes"> <props> <prop key="*"> PROPAGATION_REQUIRED </prop> </props> </property> </bean> <bean id="bookService" parent="txProxyTemplate"> <property name="target"> <bean class="com.spring.test.tran.BookService"> <property name="bookdao"> <ref local="bookDAO" /> </property> </bean> </property> </bean>
客戶端調用BookClient.java public static void main(String[] args) { // TODO 自動產生方法 Stub AbstractApplicationContext appContext= new ClassPathXmlApplicationContext("/AppcontextTran.xml"); IbookService bookservice=(IbookService)appContext.getBean("bookService"); bookservice.saveBook(); System.out.println("成功!!!!!!!!!!"); }
|
|