@Singleton 使用说明
这个注解非常简单,就是标注当前组件是否为单例。单例,常见有两种方案:
- 实例级,是指每次获取实例时,会新构建实例。(默认)
- 方法级,是指每次获取调用方法时,会新构建实例。(需要借助手动代码实现,参考最后面)
1、默认为单实例
@Component
public class UserDao{ }
2、标注为非单实例(多实例,每次获取或注入时会构建新的实例)
@Singleton(false)
@Component
public class UserDao{ }
- 每次获取时,会构建新实例
BeanWrap userDaoWrap = Solon.context().getWrap(UserDao.class)
UserDao userDao1 = userDaoWrap.get();
UserDao userDao2 = userDaoWrap.get(); // userDao2 != userDao1
//或者
UserDao userDao1 = Solon.context().getBean(UserDao.class);
UserDao userDao2 = Solon.context().getBean(UserDao.class); // userDao2 != userDao1
- 每次注入时,会构建新实例
@Singleton(false)
@Controller
public class UserController{
@Inject
UserDao userDao1;
@Inject
UserDao userDao2; // userDao2 != userDao1
@Mapping("/hello")
public String hello(String name) {
return name;
}
}
//UserController 也是非单例,所以每次请求都会重新构建。
- 每次执行时,会构建新实例
public class UserService {
UserDao userDao(){
return Solon.context().getBean(UserDao.class)
}
public void getUser(int userId){
return userDao().selectById(userId)
}
}