我是Spring框架的新手..
这是我的问题:如何将运行时的bean包装到另一个类中?
我为每个数据结构提供如下类和&& java类型:
import UIKit
import Parse
class ListaTableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Potentially incomplete method implementation.
// Return the number of sections.
return 3
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete method implementation.
// Return the number of rows in the section.
return 1
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> ListaTableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! ListaTableViewCell
var query = PFQuery(className:"Restaurantes")
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
// The find succeeded.
println("Successfully retrieved \(objects!.count) Restaurantes.")
// Do something with the found objects
if let objects = objects as? [PFObject] {
for object in objects {
cell.textCell.text = object["nome"] as? String
println(object.objectId)
}
}
} else {
// Log details of the failure
println("Error: \(error!) \(error!.userInfo!)")
}
}
//cell.textCell.text = "Hello world"
cell.imageBg.image = UIImage(named: "www.maisturismo.jpg")
return cell
}
}
这个类是一个管理的弹簧单例。 我需要通过下一个类包装该编解码器:
@Component
public class ByteCodec extends Codec<Byte> {
public ByteCodec() {
super(Byte.class);
}
public void encode(... buffer, Byte object) {
buffer.writeByte(object);
}
public Byte decode(... buffer) {
return buffer.readByte();
}
}
我怎么能这样做? 提示:我想为每个Codec实例自动换行RUNTIME ..
以及如何扩展Autowired注释,如:
class OptionalCodec<T> extends Codec<Boolean> {
public OptionalCodec(Codec<T> clazz) {
}
... some implementation of encode && decode method's ...
}
如何使用map:
对所有运行时创建的编解码器进行注册@AutowireCodec(targetClass=Integer.class, canBeNull=false)
private Codec<Integer> codec;
?? 感谢您的回复!
答案 0 :(得分:1)
Spring允许您按开箱即用的类型和泛型类型注入bean,因此对于您的用例,我认为没有必要创建新的Autowired注释。你可以简单地使用现有的@Autowired:
@Autowired
private Codec<Byte> codec;
请记住,如果为同一泛型类型定义多个bean并使用上面的代码,则会出现错误,因为该定义存在多个bean。您可以绕过注入集合而不是单个对象,例如:
@Autowired
private List<Codec<Byte>> byteCodecs;
或者,如果您想要所有编解码器,无论其通用类型如何,您都可以执行以下操作:
@Autowired
private List<Codec<?>> allCodecs;
关于你关于实例包装的问题,我不确定我是否完全理解你想要实现的目标,但你可以将编解码器注入到我上面提到的另一个编解码器中,或者你可以看看Spring AOP和用它来包装对你的bean的调用:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html
我仍然不确定OptionalCodec
的目的是什么,因为它会接受编码/解码方法中的布尔值。 OptionalCodec
是与基本Codec
接口不同的类,因此如果您这样做:
@Autowired
private OptionalCodec<Byte> codec;
将注入可选的Byte编解码器。如果你这样做:
@Autowired
private Codec<Byte> codec;
将注入原始的字节编解码器。但如果你这样做:
@Autowired
private Codec<Boolean> codec;
它将匹配所有OptionalCodec
bean(因为OptionalCodec
的类型签名是Codec<Boolean>
)并抛出错误,因为它无法选择一个。< / p>
那就是说,如果你真的需要微调相同类型的bean的自动装配,我建议你检查Spring文档的相关部分,其中解释了@Primary
和@Qualifier
等注释,并让你这样做:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-autowired-annotation-qualifiers