天天看點

Java面試題:Spring的bean配置有哪幾種方式?

作者:人人程式設計網

Spring 注入方式

Spring 容器支援的三種依賴注入方式:

set注入

set 方法注入太過于臃腫,實際上很少使用,如下:

@Service
public class OrderService {

    private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

}
           

屬性注入

屬性注入是大家最為常見也是使用最多的一種注入方式了,如下:

@Service
public class OrderService {
    // 通過屬性注入使用者服務
    @Autowired
    private UserService userService;
    
}
           

構造函數注入

通過構造方法注入就相當于給構造方法的參數傳值,構造注入的優勢是通過構造強制依賴關系,使得執行個體化出的 bean 對象一定是完整的或者可以使用的。配置如下:

@Service
public class OrderService {

    private UserService userService;

    @Autowired
    public OrderService(UserService userService) {
        this.userService = userService;
    }

}           

工廠方法注入

靜态工廠方法注入 bean 利用靜态工廠方法可以把 bean 注入到 IOC 容器中。在 XML 檔案中配置 bean 時,要指定 class 的屬性為工廠的類,factory-method 屬性指定工廠類中工廠方法,用于建立 bean。

Spring Bean 配置方式

Spring Bean 有三種配置方式:

傳統的XML配置方式

XML 配置的方式,是 Spring 最早支援的方式,不過現在 XML 方式已經用得比較少了,基本上都是用注解的配置方式替代了。例如:

<bean id="jdbcBean" class="com.hxstrive.spring.core.properties.JdbcBean">
    <property name="driver" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
           

基于注解的配置

為了解決 bean 太多時,XML 檔案過大,進而導緻膨脹不好維護的問題。在 Spring2.5 中開始支援:@Component、@Repository、@Service、@Controller 等注解定義 bean。@Component 放在類名上面,然後通過 @ComponentScan 指定一個路徑,Spring 進行掃描帶有 @Componet 注解的 bean,然後加至容器中。例如:

@Service
public class UserService {
    //...
}
           

基于 @Configuration 類

這種方式其實也是我們最常用的方式之一,@Configuration 用來聲明一個配置類,然後使用 @Bean 注解聲明一個 bean,将其加入到 Spring 容器中。通常情況下,如果項目中有使用到第三方類庫中的工具類的話,我們都是采用這種方式注冊 Bean。例如:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String,String> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String,String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        // 設定鍵序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // 設定簡單類型值的序列化方式
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        // 設定預設序列化方式
        redisTemplate.setDefaultSerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet();

        return redisTemplate;
    }

}
           

繼續閱讀