Spring 容器支持的三种依赖注入方式:
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 有三种配置方式:
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 用来声明一个配置类,然后使用 @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; } }