Spring配置元數據的三種方式

1、基於XML文件的配置:

  傳統上,配置元數據以簡單直觀的XML格式提供,如下beans.xml文件中所示:id是標識單個bean定義的字符串,class定義bean的類型,並使用完全限定的類名,可以選擇是否配置屬性值。

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--  空值的user  -->
    <bean id="userNoValue" class="intron.spring.entity.User"></bean>

    <!--  帶值的user  -->
    <bean id="user" class="intron.spring.entity.User">
        <property name="name" value="張三"></property>
        <property name="age" value="18"></property>
    </bean>

    <!--  全參構造,使用成員屬性索引對應  -->
    <bean id="userOnIndex" class="intron.spring.entity.User">
        <constructor-arg index="0" value="張三"></constructor-arg>
        <constructor-arg index="1" value="18"></constructor-arg>
    </bean>

    <!--  全參構造,使用成員屬性類型對應  -->
    <bean id="userOnType" class="intron.spring.entity.User">
        <constructor-arg type="java.lang.String" value="張三"></constructor-arg>
        <constructor-arg type="int" value="18"></constructor-arg>
    </bean>

</beans>

  XML文件使用ClassPathXmlApplicationContext實例化Spring容器,ApplicationContext是一個維護bean定義以及相互依賴的註冊表的高級工廠的接口,通過使用方法T getBean(String name, Class<T> requiredType),可以獲取bean的實例,但是理想情況下,應用程序代碼永遠不要使用它們。

@Test
public void xmlTest(){
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    User userNoValue = (User)context.getBean("userNoValue", User.class);
    User user = (User)context.getBean("user", User.class);
    User userOnIndex = (User)context.getBean("userOnIndex", User.class);
    User userOnType = (User)context.getBean("userOnType", User.class);

    System.out.println(userNoValue);
    System.out.println(user);
    System.out.println(userOnIndex);
    System.out.println(userOnType);
}

輸出結果:
User(name=null, age=0)
User(name=張三, age=18)
User(name=張三, age=18)
User(name=張三, age=18)

2、基於Java類的配置:

  從Spring 3.0開始,Spring JavaConfig項目提供的許多功能成爲Spring Framework核心的一部分。因此,可以使用Java而不是XML文件來定義應用程序類外部的bean。基於Java類的配置的核心是帶@Configuration(類似於XML中的<beans/>)註解的類和-帶@Bean(類似於XML中的<bean/>)註解的方法。@Bean註解標識一個方法,這個方法實例化、配置並且初始化一個由Spring IoC容器進行管理的新對象。@Bean可以對任何使用Spring @Component註解的類中的方法使用,但是最常與@Configuration一起使用。使用@Configuration的類表示其是作爲Bean定義的來源,此外,@Configuration類允許通過調用類中其他@Bean方法來定義Bean之間的依賴關係。

@Configuration
public class BeanConfiguration {

    @Bean
    public Account account(){
        return new Account("001001001");
    }

    @Bean
    public User user(Account account){
        return new User("張三",18,account);
    }

    @Bean
    public User userNoAccount(){
        return new User("張三",18,null);
    }
}

  通過AnnotationConfigApplicationContext實例化Spring容器,這種通用的ApplicationContext實現方式不僅可以接受@Configuration類作爲輸入,還可以接受普通@Component類和使用JSR-330元數據註解的類。當@Configuration類作爲輸入時,@Configuration類和該類中所有@Bean的方法都會被註冊爲Bean Definition。當@Component類和JSR-330類作爲輸入時,它們被註冊爲Bean Definition,並且假定必要時在這些類中使用例如@Autowired或@Inject的DI元數據。

@Test
public void configurationTest(){
    ApplicationContext ctx = new AnnotationConfigApplicationContext(BeanConfiguration.class);
    User user = ctx.getBean("user",User.class);
    User userNoAccount = ctx.getBean("userNoAccount",User.class);
    System.out.println(user);
    System.out.println(userNoAccount);
}

輸出結果:
User(name=張三, age=18, account=Account(number=001001001))
User(name=張三, age=18, account=null)

3、基於註解的配置:

  Spring提供進一步典型化註解:@Component,@Service,@Repository和 @Controller。@Component是任何Spring託管組件的通用構造型。 @Repository,@Service和@Controller是@Component針對更特定用例的專業化(分別在持久層,服務層和表示層)。因此,可以使用@Component,但是使用@Repository,@Service或者@Controller,能更好地適合於通過工具處理,或與切面進行關聯,而且這些構造型註解在Spring框架的將來版本中還可以包含其他語義。

@Repository
public class JpaMovieFinder implements MovieFinder {
    // implementation elided for clarity
}

@Service
public class SimpleMovieLister {

    private MovieFinder movieFinder;

    public SimpleMovieLister(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章