Spring支持用注解的方式配置Bean,这相比传统的XML配置方式,极大减少了对Bean的配置量。不过在使用注解之前,还是需要在配置文件上添加一行
<context:component-scan base-package="com.yotwei.ioc"/>
这告诉Spring我想要配置的Bean位于包com.yotwei.ioc下,Spring将会自动扫描该包下的类。
这四个注解的效果是相同的,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
自动装载,能够将已注册的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();
}
}
标注bean的作用域,默认singleton,常用属性有singleton, prototype等。
singleton: 同一个IOC容器里一个bean只有一个实例,即单例。
prototype: 每次从IOC获取的bean都是一个新的实例
用法如下
@Service
@Scope("prototype")
public class OrderService implements IService{
}
当你创建多个具有相同类型的 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;
}