分享

Spring Framework介紹

 芳草小集 2006-03-24
 

Spring Framework介紹

 Spring是一個屬於java/j2ee的架構級框架,可以適用於java桌面系統或j2ee企業系統。它借助IoC(Inversion of Control)設計模式,對系統的各個模塊Bean進行管理,實現系統的松耦合。借助AOP思想實現以聲明式方式使用企業級服務,例如事務服務。

當系統的各個模塊象一塊塊積木搭建起來之後,Spring就象粘合劑把各個模塊粘合在一起,並進行有效的控制。

Spring框架可以提供一站式的企業應用,包括了在表示層它實現了一個MVC、對JDBCHIBERNATE等的支持、提供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"?>

定義bean

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www./dtd/spring-beans.dtd" >

<beans>

    <bean id="hello" class="com.spring.test.Hello">

注入

        <property name="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">

這樣就完成的接口實現類的切換。

 

下一個例子將顯示在SpringBean管理中注入數據源,實現更強的注入功能,這樣就可以自由地切換不同的數據庫類型和數據源了。

以下的例子將讀取數據表Book的一行記錄。Bookidbookname(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;

        }

//以下省略了部分SETGET方法

}

 

新建接口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,它擴展了SpringJDBC基類,方法的代碼變得很簡潔。

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("成功!!!!!!!!!!");

        }

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约