非web项目使用Spring @autowire无效

qq_25117969 2017-11-25 03:03:01
我的一个普通的java项目中配置了spring,使用getBean方式可以正常获取bean,但是用@autowire时无法获取,对象为null,同时也不报错,我扫描包已经开启了。同时还有一个现象,就是我getBean获取的对象,这个对象其中的@Autowire可以正常获取bean,这是为什么呢?
下面这种方式 Entry中 @Autowire可以正常获取bean:

//Application.java
public class Application {
public static void main(String[] args){
args = new String[] {
"classpath:spring/applicationContext.xml"
};
ApplicationContext actx = new ClassPathXmlApplicationContext(args);
Entry entry = (Entry) actx.getBean("Entry");
entry.main(actx);
}
}

//Entry.java
@Component("Entry")
public class Entry {
@Autowired
private SpringTest springTest;
public void main(ApplicationContext ac){
System.out.println(springTest);
}
}

//SpringTest.java
@Component
public class SpringTest {
private String test;
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
}

运行结果:



而如果Entry不用getBean的方式就无法获取,如下:

public class Application {
public static void main(String[] args){
args = new String[] {
"classpath:spring/applicationContext.xml"
};
ApplicationContext actx = new ClassPathXmlApplicationContext(args);
//Entry entry = (Entry) actx.getBean("Entry");
Entry entry = new Entry();
entry.main(actx);
}
}

运行结果:


求解答
...全文
347 8 点赞 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
qq_25117969 2017-11-27
引用 4 楼 u011594442 的回复:
[quote=引用 3 楼 qq_25117969 的回复:] [quote=引用 2 楼 qq_15824553 的回复:] bean都交给spring管理了,获取肯定也要从spring相关的获取。你自己new一个bean,肯定不行啊
那你的意思是通过spring获取的bean其中的autowire才有效吗?[/quote] 你的话好矛盾啊,还是先去看看spring的ioc吧[/quote] 可能我说的有些不清楚,不过现在我已经搞明白了
  • 打赏
  • 举报
回复
qq_25117969 2017-11-27
这个问题我搞明白了,感谢#2 如果Entry使用new的方式实例化的话,就不受Spring管理,Spring自然也就不知道Entry中有需要自动装配的Bean (SpringTest) 但是在web应用中,都是直接在Controller中使用@Autowire的,我原本以为这个Controller不是通过getBean实例化的,其实是通过getBean实例化的

//HandlerMethod.class  130行
public HandlerMethod createWithResolvedBean() {
        Object handler = this.bean;
        if (this.bean instanceof String) {
            String beanName = (String)this.bean;
            handler = this.beanFactory.getBean(beanName);
        }

        return new HandlerMethod(this, handler);
    }
也就是说先getBean实例化Controller,然后Controller中用@Autowire标记的bean才能自动装配,这和我写的第一种情况是一样的,即我getBean实例化Entry,然后Entry中的SpringTest才能自动装配
  • 打赏
  • 举报
回复
qq_25117969 2017-11-27
引用 5 楼 qq_38204653 的回复:
看不太懂你说的 而如果Entry不用getBean的方式就无法获取,如下: 你自己都new了对象
这句话说的意思是如果Entry不用getBean的方式实例化,那么Entry中的@Autowire标注的bean就无法自动获取
  • 打赏
  • 举报
回复
xls丶 2017-11-27
看不太懂你说的 而如果Entry不用getBean的方式就无法获取,如下: 你自己都new了对象
  • 打赏
  • 举报
回复
Sunyiban 2017-11-27
引用 3 楼 qq_25117969 的回复:
[quote=引用 2 楼 qq_15824553 的回复:] bean都交给spring管理了,获取肯定也要从spring相关的获取。你自己new一个bean,肯定不行啊
那你的意思是通过spring获取的bean其中的autowire才有效吗?[/quote] 你的话好矛盾啊,还是先去看看spring的ioc吧
  • 打赏
  • 举报
回复
qq_25117969 2017-11-27
引用 2 楼 qq_15824553 的回复:
bean都交给spring管理了,获取肯定也要从spring相关的获取。你自己new一个bean,肯定不行啊
那你的意思是通过spring获取的bean其中的autowire才有效吗?
  • 打赏
  • 举报
回复
RockeyCui 2017-11-27
bean都交给spring管理了,获取肯定也要从spring相关的获取。你自己new一个bean,肯定不行啊
  • 打赏
  • 举报
回复
相关推荐
发帖
Web 开发
加入

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2017-11-25 03:03
社区公告
暂无公告