Java面试题:Spring的bean配置有哪几种方式?

本文将介绍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;
    }

}
我们一定要给自己提出这样的任务:第一,学习,第二是学习,第三还是学习。 —— 列宁
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号