2015年6月28日 星期日

Hello World (Spring3.x 一)

首先先建立一個專案,然後把jar檔copy進去,我用得jar如下,如果是maven,只要抓Spring core和Spring Context就會抓到下面7個jar檔了

然後用spring tools裡的工具,我也不是很會用這個工具

選一個地方放xml,就選src吧,名稱大部人都會取applicationContext.xml
如果是 maven 或 gradle 就選 src\main\java 以下,我用 ..(上一層)還不行呢!

選需要的namespace,注意下面很有子選項,我是3.2版,所以我全部選3.2
但如果選的是第一個沒有版本的,表示任何版本都可用

如果沒選到,之後也可以選下方的活頁標籤的Namespaces來改

寫程式測試一下,建一個interface Paper,它被兩個子類繼承,Book和Comic
一樣有分兩種配置,XML和annotation

※XML配置

package book.vo;
public class Book implements Paper {
    private String bookName;
    private int bookMoney;
    //setter/getter...
    @Override
    public String getInfo() {
        return "書名:" + this.bookName + ", 書錢:" + this.bookMoney;
    }
}


而applicationContext.xml如下
<?xml version="1.0" encoding="UTF-8"?>

      
    <bean class="book.vo.Book" id="book">
        <!--方法一 -->
        <property name="bookName" value="Spring in Action" />
        <!--方法二 -->
        <property name="bookMoney">
            <value>500</value>
        </property>
    </bean>


※id和name都可以,差在哪後續章節再說

測試類為
public class Test {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Book book = (Book) ctx.getBean("book");
System.out.println(book.getInfo());
((ClassPathXmlApplicationContext) ctx).close();
結果為:
書名:Spring in Action, 書錢:500 漫畫書名:七龍珠, 漫畫書錢:65


※Annotation


Annotation配置又分成兩種,一種是Java配置,另一種就是Annotation配置
可以和XML配置互相使用


Java配置

@Configuration
public class Book {
    @Value(value = "Spring in Action")
    private String bookName;
    
    @Value(value = "500")
    private int bookMoney;
    
    //setter/getter...
    
    @Bean
    public String getInfo() {
        return "書名:" + this.bookName + ", 書錢:" + this.bookMoney;
    }
}

ApplicationContext ctx = new AnnotationConfigApplicationContext(Book.class);
System.out.println(ctx.getBean("getInfo"));
((AnnotationConfigApplicationContext) ctx).close();

※@Bean 回傳什麼就用什麼接,如回傳一個自訂的 Book 類別,就可以點裡面的方法,只要回傳的物件裡面有值,那取出來就有值;此例回傳 String,所以可以直接印出來

※注意使用annotation時@Bean不能回傳void,否則會出「Error creating bean with name 'getInfo' defined in class book.vo.Book: Invalid factory method 'getInfo': needs to have a non-void return type!」的錯

※@Value可以寫在屬性或setter上面,但getter不行,和Hibernate一樣

※如果在 xml 設定檔想讀 annotation,那就要寫 context:component-scan

※如果想使用 @ComponentScan(basePackages = { "包路徑", "包路徑" }),那就只能抓annotation 的 bean,測試時就一定要使用 AnnotationConfigApplicationContext(Xxx.class),但要注意會包括子包的,如寫 xxx.ooo,那 xxx.ooo 以下的包也會掃的到,如果不想掃再加屬性 filter 即可

※如果annotation 想讀 xml 設定檔,那就要寫 @ImportResource("classpath:/applicationContext.xml")

※Annotation配置

開頭可以是@Component、@Controller、@Service、@Repository、@Named 其中之一
@Component("book")
public class Book {
    @Value(value = "Spring in Action")
    private String bookName;
    
    @Value(value = "500")
    private int bookMoney;
    
    // setter/getter...
    
    public String getInfo() {
        return "書名:" + this.bookName + ", 書錢:" + this.bookMoney;
    }
}

※測試類和XML的一樣

沒有留言:

張貼留言