Java 如何从主类之外访问Springbean
到目前为止,我读到的大多数教程都是从主类访问bean,如下所示: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"
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容器的项目中毫无用处。这也会使测试变得更加困难,因为它更难模拟依赖项。