Spring 自动装配(注解)

发布于 18 天前  10 次阅读


Spring,一直在致力于减少我们的配置文件,使用注解可以大大的提高我们的减少我们的配置文件,我们来了解一下常用的注解吧。

组件

@Component 组件 加载Bean类上面,会为我们自动管理这个Bean
bean 的 id 默认为类名首字母小写。我们也可以通过value进行改变

-- 旧的配置文件
<bean id="userAction" class="action.UserAction"></bean>
public class UserAction {
    ...
}

-- 使用注解以后
@Component            > bean name = userAction
public class UserAction {
}
@Component("acion")  > bean id = action
public class UserAction {
}

在web应用中Spring为我们提供了三个子标注,为了我们的代码结构逻辑更清晰
@Repository > 仓库 Dao使用
@Service > 服务 服务层使用
@Controller > 控制器 控制层使用

这三个注解和Component使用起来完全一样,所以我就不做演示了。
@Scope
组件在使用过程的时候默认是单例的,如果我们需要多列就需要使用Scope 来指定他的作用域了

@Component
@Scope()        // ConfigurableBeanFactory#SCOPE_SINGLETON  >> 默认单例的
                // ConfigurableBeanFactory#SCOPE_SINGLETON  >> 原型,每次获取创建一个

                // org.springframework.web.context.WebApplicationContext.SCOPE_REQUEST web 应用中每次请求创建一个实例
                // org.springframework.web.context.WebApplicationContext.SCOPE_SESSION web 应用中每次会话创建实例
public class UserAction {
}

自动装配 @AutoWired
在我们的一个bean 中或许会存在一些依赖,比如Service 需要依赖Dao ,这时候我们就需要进行依赖注入了
@AutoWired会根据属性的类型进行查找并装配。不依赖属性名

public class UserService(){
    UserDao dao;
}
-- xml配置
<bean id="userService" class="xxx.UserService">
    <property name="dao" ref="daoBeanName"/> // 依赖注入
</bean>
// 我们可以通过bean标签进行注入,但是我们如果使用了组件进行装配,我们就没有了bean标签,那我们就需要使用AutoWired这个注解了。
public class UserService(){
    @AutoWired
    UserDao dao;
}

如果存在多个实现类
如果我们一个Dao存在多个实现类,这时候自动装配就会出现问题。
这里我们简单的介绍2种解决方案
1. 我们给其中的一个实现类加上首选的注解。

public interface UserDao{}

@Primary
public class UserDaoImpl1{}
public class UserDaoImpl2{}

// 这样自动装配的时候就会选择UserDaoImpl1了。

但是这种方案也是存在风险的,如果我们有2个类存在@Primary。这时候Spring又不知道装配谁了,这时候我们使用第二种解决方案
2. 限定符 @Qualifier

public class UserService(){
    @AutoWired
    @Qualifier("userImpl1") // 限定这个实现类
    UserDao dao;
}

Comments


享受技术带来的乐趣。