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;
}
}