Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从主类之外访问Springbean_Java_Spring - Fatal编程技术网

Java 如何从主类之外访问Springbean

Java 如何从主类之外访问Springbean,java,spring,Java,Spring,到目前为止,我读到的大多数教程都是从主类访问bean,如下所示: public class JdbcDemo { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); SimpleJdbcDaoImpl dao = ctx.getBean("simpleJdbcDaoImpl"

到目前为止,我读到的大多数教程都是从主类访问bean,如下所示:

public class JdbcDemo {

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");

        SimpleJdbcDaoImpl dao = ctx.getBean("simpleJdbcDaoImpl", SimpleJdbcDaoImpl.class);

        System.out.println("Circle count from main class is: " + dao.getCircleCount());
    }
}
以及SimpleJdbcDaoImpl类:

public class SimpleJdbcDaoImpl extends SimpleJdbcDaoSupport {

    public int getCircleCount() {
        String sql = "SELECT COUNT(*) FROM CIRCLE";
        return this.getJdbcTemplate().queryForInt(sql);
    }
}
要通过从主类调用bean来访问它,我需要做很多工作,如下所示:

主要类别:

public class JdbcDemo {

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");

        System.out.println(ctx.getBean(SomeOtherClass.class).accessSimpleJdbcDaoImpl());
    }
}
然后在另一个类中
另一个类中

@Service
public class SomeOtherClass implements ApplicationContextAware {

    private ApplicationContext ac;

    public String accessSimpleJdbcDaoImpl() {
        return "We're getting into some other secondary class.\n" + ac.getBean(SecondaryClass.class).printSecCount();
    }

    @Override
    public void setApplicationContext(ApplicationContext ac) throws BeansException {
        this.ac = ac;
    }
}
然后在
secondary类中

@Service
public class SecondaryClass {

    @Autowired
    private SimpleJdbcDaoImpl simpleJdbcDaoImpl;

    public String printSecCount() {
       return "Secondary class Circle count is: " + simpleJdbcDaoImpl.getCircleCount();
    }

}
这似乎使一个项目过于依赖Spring。另外,在我的项目中,我只需要在某些类中使用一些bean,所以从main调用它们是不必要的,或者根本不起作用

有没有办法实现ApplicationContextAware而不从主类调用它们

更新:

如何从下面的SecondaryClass访问类
AwayTest.printAwayTest()

@Component
public class AwayTest {

    public String printAwayTest() {
        return "Away here\n";
    }

}
这没有任何意义

@Service
public class SecondaryClass {

    @Autowired
    private AwayTest awayTest;

    private SimpleJdbcDaoImpl simpleJdbcDaoImpl;

    @Autowired
    public void setSimpleJdbcDaoImpl(SimpleJdbcDaoImpl impl) {
        simpleJdbcDaoImpl = impl;
    }

    public String printSecCount() {
        return "Away Test: " + awayTest.printAwayTest() + ". Secondary class Circle count is: " + simpleJdbcDaoImpl.getCircleCount();
    }

}

只需为依赖项注入创建适当的setter。如果需要
SimpleJdbcDaoImpl
的实例,则不应声明专用自动连接字段。相反,创建一个setter或构造函数参数。它将消除使用反射设置字段对Spring的依赖

@Service
public class SomeOtherClass {
    private SecondaryClass secondary;

    @Autowired
    public void setSecondary(SecondaryClass secondary) {
        this.secondary = secondary;
    }

    public String accessSimpleJdbcDaoImpl() {
        return "We're at Some Other Class: " + secondary.printSecCount();
    }
}

@Service
public class SecondaryClass {

    private SimpleJdbcDaoImpl simpleJdbcDaoImpl;

    @Autowired
    public void setSimpleJdbcDaoImpl(SimpleJdbcDaoImpl impl) {
        simpleJdbcDaoImpl = impl;
    }

    public String printSecCount() {
       return "Secondary class Circle count is: " + simpleJdbcDaoImpl.getCircleCount();
    }
}

我认为您可以直接自动连接私有属性,而不必使用setter和getter方法。根据我的理解,以下代码是正确的。我的建议是:检查您的配置,确保AwayTest和SecondaryClass都位于以下组件扫描基pakcage中:

您的代码:

@Service public class SecondaryClass {

    @Autowired
    private AwayTest awayTest;

    private SimpleJdbcDaoImpl simpleJdbcDaoImpl;
    .....

谢谢@Bart的回答。你介意看一下上面的更新吗?@user3663765所有的工作原理都一样。为依赖项注入创建一个setter。我可以写另一个例子,但我会重复我自己:)对不起@Bart。我做得不对。上面的例子中有一点我没有包括在内。谢谢你能,但这不明智。您的所有类都将依赖于反射来设置该字段的值。这使得该类在其他不使用Spring IoC容器的项目中毫无用处。这也会使测试变得更加困难,因为它更难模拟依赖项。