Spring学习笔记——IOC的一些注解

Spring支持用注解的方式配置Bean,这相比传统的XML配置方式,极大减少了对Bean的配置量。不过在使用注解之前,还是需要在配置文件上添加一行

<context:component-scan base-package="com.yotwei.ioc"/>

这告诉Spring我想要配置的Bean位于包com.yotwei.ioc下,Spring将会自动扫描该包下的类。

Component, Controller, Service, Repository

这四个注解的效果是相同的,Spring都会将他们当做Bean注入。
是在JavaWeb开发中,需要规范使用这四个注解来区分控制层,服务层,持久层。

@Service
public class OrderService implements IService{

}

上面代码将就是OrderService注册为Bean,类名首字母变小写就是该Bean的默认id,即orderService。如果想要自己指定Bean的id,可以在注解后面添加参数,如

@Service("myOrderService")
public class OrderService implements IService{

}

现在该Bean的id就成了myOrderService

Autowired

自动装载,能够将已注册的Bean自动装配到对应的成员变量中。如下,已有Bean UserDAO

@Repository
public class UserDAO implements IDAO {

    public void save() {
        System.out.println("DAO save.");
    }
}

现有一个Bean为UserService,且拥有一个UserDAO成员,使用Autowired可以将UserDAO对应的实例自动装配进来。

@Service
public class UserService implements IService {
    private UserDAO userDAO;

    @Autowired  //这是方法级别的注解,也可以直接在成员上加上该注解,省去setter方法
    public void setUserDAO(UserDAO userDAO) {
        this.userDAO = userDAO;
    }

    public void save() {
        System.out.println("service save");
        userDAO.save();
    }
}

Scope

标注bean的作用域,默认singleton,常用属性有singleton, prototype等。
singleton: 同一个IOC容器里一个bean只有一个实例,即单例。
prototype: 每次从IOC获取的bean都是一个新的实例
用法如下

@Service
@Scope("prototype")
public class OrderService implements IService{

}

Qualifier

当你创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注释和 @Autowired 注释通过指定哪一个真正的 bean 将会被装配来消除混乱。

下面有两个Bean继承自同一接口

@Service
public class OrderService implements IService{

}
@Service
public class UserService implements IService {

}

现在我要用IService类声明一个成员,并且注上Autowired

@Component
public class UserManager {

    @Autowired
    private IService service;
}

这样会导致出错,因为Spring并不知道你想装入的类是UserService还是OrderService。这时候就需要@Qualifier来指明了

@Component
public class UserManager {

    @Autowired
    @Qualifier("userService")
    private IService service;
}

其中参数代表bean的id,这样Spring就能识别你想装入的是UserService而不是OrderManager。

除了用Qualifier,还有一种解决办法,就是将变量名命名为bean的id名,这样也能被Spring识别

@Component
public class UserManager {

    @Autowired
    private IService userService;
}

你可能感兴趣的:(Java,spring,ioc)