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