0

我有一个接收数据对象的网络服务(我们称之为学生类)。在 Web 服务中,我使用 StudentWrapper 对象包装它,如下所示

new StudentWrapper(student)

我希望StudentWrapper该类具有诸如save将数据保存到数据库之类的方法。我想使用 spring 框架来注释该save方法,以便它可以在事务中运行。但是StudendWrapper 对象必须是一个spring bean(在XML 中定义)。如果它是一个spring bean,那么我不会像上面显示的那样实例化它。

我的问题是如何使 StudentWrapper 成为 Spring bean(以便我可以使用 Spring 注释来管理事务)但将 Student 对象(我通过 Web 服务接收)传递给 StudentWrapper?

如果有任何其他建议可以帮助我解决这个问题,也请分享。

4

1 回答 1

1

如果您真的想使用构造函数创建对象,StudentWrapper @Configurable请阅读并阅读有关使用 AspectJ 为域对象创建原型 bean 定义(参考手册的第 9.8 节)。

如果您不想使用 AspectJ 但又不想直接依赖于 Spring,一个更简单的替代方法是将原型 bean 创建封装在工厂中。我将向您展示如何使用 JavaConfig,尽管您可以在 XML 中执行类似的操作。

首先是学生对象...

package internal;

public class Student {

    private String name;

    public Student(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Student{name='" + name + "'}";
    }
}

现在包装对象...

package internal;

public class StudentWrapper {

    private Student student;

    public StudentWrapper(Student student) {
        this.student = student;
    }

    public Student getStudent() {
        return student;
    }

    @Override
    public String toString() {
        return "StudentWrapper{student='" + student + "'} " + super.toString();
    }
}

而现在的工厂,

package internal;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class StudentWrapperFactory {

    @Autowired
    private ApplicationContext applicationContext;

    public StudentWrapper newStudentWrapper(Student student) {

        return (StudentWrapper) this.applicationContext.getBean("studentWrapper", student);
    }
}

而现在的JavaConfig,相当于一个XML配置

package internal;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
@ComponentScan(basePackages = "internal")
public class FooConfig {

    @Bean
    @Scope("prototype")
    public StudentWrapper studentWrapper(Student student) {
        return new StudentWrapper(student);
    }
}

最后是单元测试...

package internal;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {FooConfig.class})
public class FooIntegrationTest {

    @Autowired
    private StudentWrapperFactory studentWrapperFactory;

    @Test
    public void foo() {

        Student student1 = new Student("student 1");
        Student student2 = new Student("student 2");

        StudentWrapper bean1 = this.studentWrapperFactory.newStudentWrapper(student1);
        StudentWrapper bean2 = this.studentWrapperFactory.newStudentWrapper(student2);

        System.out.println(bean1);
        System.out.println(bean2);

    }
}

生产

StudentWrapper{student='Student{name='student 1'}'} internal.StudentWrapper@1b0fa7ff
StudentWrapper{student='Student{name='student 2'}'} internal.StudentWrapper@20de643a

从 StudentWrapper 的对象引用中可以看出,它们是不同的原型 bean。@Transactional方法应该按预期工作StudentWrapper

于 2013-07-24T17:07:04.903 回答