如何包装Spring bean

时间:2015-08-11 14:46:41

标签: java spring

我是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;

?? 感谢您的回复!

1 个答案:

答案 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